diff options
author | luigi1111 <luigi1111w@gmail.com> | 2023-11-06 09:28:18 -0500 |
---|---|---|
committer | luigi1111 <luigi1111w@gmail.com> | 2023-11-06 09:28:18 -0500 |
commit | c03e404980d85b9094904ddbf3c0649064d00e37 (patch) | |
tree | 697978c4cf8bbdd5875a489809f6ab18185ec7c3 | |
parent | Merge pull request #9033 (diff) | |
parent | ringct: make `rctSigBase` serialization follow strict aliasing rule (diff) | |
download | monero-c03e404980d85b9094904ddbf3c0649064d00e37.tar.xz |
Merge pull request #9035
0523140 ringct: make
ctSigBase serialization follow strict aliasing rule (jeffro256)
-rw-r--r-- | src/ringct/rctTypes.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/ringct/rctTypes.h b/src/ringct/rctTypes.h index 51d5a121e..585d5fb49 100644 --- a/src/ringct/rctTypes.h +++ b/src/ringct/rctTypes.h @@ -362,11 +362,17 @@ namespace rct { { if (type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus) { + // Since RCTTypeBulletproof2 enote types, we don't serialize the blinding factor, and only serialize the + // first 8 bytes of ecdhInfo[i].amount ar.begin_object(); - if (!typename Archive<W>::is_saving()) + crypto::hash8 trunc_amount; // placeholder variable needed to maintain "strict aliasing" + if (!typename Archive<W>::is_saving()) // loading memset(ecdhInfo[i].amount.bytes, 0, sizeof(ecdhInfo[i].amount.bytes)); - crypto::hash8 &amount = (crypto::hash8&)ecdhInfo[i].amount; - FIELD(amount); + else // saving + memcpy(trunc_amount.data, ecdhInfo[i].amount.bytes, sizeof(trunc_amount)); + FIELD(trunc_amount); + if (!typename Archive<W>::is_saving()) // loading + memcpy(ecdhInfo[i].amount.bytes, trunc_amount.data, sizeof(trunc_amount)); ar.end_object(); } else |