Skip to content

Commit

Permalink
feat: serialize on the stack (#75)
Browse files Browse the repository at this point in the history
* feat: implement std::array based serialization

* fixup add const

* add SerializeToArray for PrivateKey

* simplify G1Element::Serialize by using G1Element::SerializeToArray

* refactor: continued reduced duplication

* fixup: apply code review comments
  • Loading branch information
PastaPastaPasta authored Dec 6, 2024
1 parent 7e747e8 commit cc649f3
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
3 changes: 3 additions & 0 deletions include/dashbls/elements.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class G1Element {
GTElement Pair(const G2Element &b) const;
uint32_t GetFingerprint(bool fLegacy = false) const;
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
std::array<uint8_t, SIZE> SerializeToArray(bool fLegacy = false) const;
G1Element Copy();

friend bool operator==(const G1Element &a, const G1Element &b);
Expand Down Expand Up @@ -102,6 +103,7 @@ class G2Element {
G2Element Negate() const;
GTElement Pair(const G1Element &a) const;
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
std::array<uint8_t, G2Element::SIZE> SerializeToArray(bool fLegacy = false) const;
G2Element Copy();

friend bool operator==(G2Element const &a, G2Element const &b);
Expand All @@ -127,6 +129,7 @@ class GTElement {

void Serialize(uint8_t *buffer) const;
std::vector<uint8_t> Serialize() const;
std::array<uint8_t, SIZE> SerializeToArray() const;

friend bool operator==(GTElement const &a, GTElement const &b);
friend bool operator!=(GTElement const &a, GTElement const &b);
Expand Down
1 change: 1 addition & 0 deletions include/dashbls/privatekey.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class PrivateKey {
// Serialize the key into bytes
void Serialize(uint8_t *buffer) const;
std::vector<uint8_t> Serialize(bool fLegacy = false) const;
std::array<uint8_t, PrivateKey::PRIVATE_KEY_SIZE> SerializeToArray(bool fLegacy = false) const;

G2Element SignG2(
const uint8_t *msg,
Expand Down
28 changes: 24 additions & 4 deletions src/elements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,16 @@ uint32_t G1Element::GetFingerprint(const bool fLegacy) const
}

std::vector<uint8_t> G1Element::Serialize(const bool fLegacy) const {
const auto arr = G1Element::SerializeToArray(fLegacy);
return std::vector<uint8_t>{arr.begin(), arr.end()};
}

std::array<uint8_t, G1Element::SIZE> G1Element::SerializeToArray(const bool fLegacy) const {
uint8_t buffer[G1Element::SIZE + 1];
g1_write_bin(buffer, G1Element::SIZE + 1, p, 1);

std::array<uint8_t, G1Element::SIZE> result{};
if (buffer[0] == 0x00) { // infinity
std::vector<uint8_t> result(G1Element::SIZE, 0);
result[0] = 0xc0;
return result;
}
Expand All @@ -187,7 +192,9 @@ std::vector<uint8_t> G1Element::Serialize(const bool fLegacy) const {
if (!fLegacy) {
buffer[1] |= 0x80; // indicate compression
}
return std::vector<uint8_t>(buffer + 1, buffer + 1 + G1Element::SIZE);

std::copy_n(buffer + 1, G1Element::SIZE, result.begin());
return result;
}

bool operator==(const G1Element & a, const G1Element &b)
Expand Down Expand Up @@ -386,11 +393,18 @@ G2Element G2Element::Negate() const
GTElement G2Element::Pair(const G1Element& a) const { return a & (*this); }

std::vector<uint8_t> G2Element::Serialize(const bool fLegacy) const {
const auto arr = G2Element::SerializeToArray(fLegacy);
return std::vector<uint8_t>{arr.begin(), arr.end()};
}

std::array<uint8_t, G2Element::SIZE> G2Element::SerializeToArray(const bool fLegacy) const {
uint8_t buffer[G2Element::SIZE + 1];
g2_write_bin(buffer, G2Element::SIZE + 1, (g2_st*)q, 1);

std::array<uint8_t, G2Element::SIZE> result{};

if (buffer[0] == 0x00) { // infinity
std::vector<uint8_t> result(G2Element::SIZE, 0);
result.fill(0);
result[0] = 0xc0;
return result;
}
Expand All @@ -410,7 +424,6 @@ std::vector<uint8_t> G2Element::Serialize(const bool fLegacy) const {
}
}

std::vector<uint8_t> result(G2Element::SIZE, 0);
if (fLegacy) {
std::memcpy(result.data(), buffer + 1, G2Element::SIZE);
} else {
Expand Down Expand Up @@ -551,4 +564,11 @@ std::vector<uint8_t> GTElement::Serialize() const
return data;
}

std::array<uint8_t, GTElement::SIZE> GTElement::SerializeToArray() const
{
std::array<uint8_t, GTElement::SIZE> data{};
Serialize(data.data());
return data;
}

} // end namespace bls
7 changes: 7 additions & 0 deletions src/privatekey.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,13 @@ std::vector<uint8_t> PrivateKey::Serialize(const bool fLegacy) const
return data;
}

std::array<uint8_t, PrivateKey::PRIVATE_KEY_SIZE> PrivateKey::SerializeToArray(bool fLegacy) const
{
std::array<uint8_t, PRIVATE_KEY_SIZE> data{};
Serialize(data.data());
return data;
}

G2Element PrivateKey::SignG2(
const uint8_t *msg,
size_t len,
Expand Down

0 comments on commit cc649f3

Please sign in to comment.