mirror of
https://github.com/XRPLF/rippled.git
synced 2026-04-29 15:37:57 +00:00
refactor: return optional buffers for helper functions (#6520)
This commit is contained in:
@@ -25,8 +25,15 @@ namespace xrpl {
|
||||
*/
|
||||
struct ConfidentialRecipient
|
||||
{
|
||||
Slice const publicKey; ///< The recipient's ElGamal public key (64 bytes).
|
||||
Slice const encryptedAmount; ///< The encrypted amount ciphertext (128 bytes).
|
||||
Slice publicKey; ///< The recipient's ElGamal public key (64 bytes).
|
||||
Slice encryptedAmount; ///< The encrypted amount ciphertext (128 bytes).
|
||||
};
|
||||
|
||||
/// Holds two secp256k1 public key components representing an ElGamal ciphertext (C1, C2).
|
||||
struct EcPair
|
||||
{
|
||||
secp256k1_pubkey c1;
|
||||
secp256k1_pubkey c2;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -146,29 +153,25 @@ getConvertBackContextHash(
|
||||
* @brief Parses an ElGamal ciphertext into two secp256k1 public key components.
|
||||
*
|
||||
* Breaks a 66-byte encrypted amount (two 33-byte compressed EC points) into
|
||||
* two secp256k1_pubkey structures (C1, C2) for use in cryptographic operations.
|
||||
* a pair containing (C1, C2) for use in cryptographic operations.
|
||||
*
|
||||
* @param buffer The 66-byte buffer containing the compressed ciphertext.
|
||||
* @param out1 Output: The C1 component of the ElGamal ciphertext.
|
||||
* @param out2 Output: The C2 component of the ElGamal ciphertext.
|
||||
* @return true if parsing succeeds, false if the buffer is invalid.
|
||||
* @return The parsed pair (c1, c2) if successful, std::nullopt if the buffer is invalid.
|
||||
*/
|
||||
bool
|
||||
makeEcPair(Slice const& buffer, secp256k1_pubkey& out1, secp256k1_pubkey& out2);
|
||||
std::optional<EcPair>
|
||||
makeEcPair(Slice const& buffer);
|
||||
|
||||
/**
|
||||
* @brief Serializes two secp256k1 public key components into compressed form.
|
||||
* @brief Serializes an EcPair into compressed form.
|
||||
*
|
||||
* Converts two secp256k1_pubkey structures (C1, C2) back into a 66-byte
|
||||
* buffer containing two 33-byte compressed EC points.
|
||||
* Converts an EcPair (C1, C2) back into a 66-byte buffer containing
|
||||
* two 33-byte compressed EC points.
|
||||
*
|
||||
* @param in1 The C1 component to serialize.
|
||||
* @param in2 The C2 component to serialize.
|
||||
* @param buffer Output: The 66-byte buffer to write the compressed ciphertext.
|
||||
* @return true if serialization succeeds, false otherwise.
|
||||
* @param pair The EcPair to serialize.
|
||||
* @return The 66-byte buffer, or std::nullopt if serialization fails.
|
||||
*/
|
||||
bool
|
||||
serializeEcPair(secp256k1_pubkey const& in1, secp256k1_pubkey const& in2, Buffer& buffer);
|
||||
std::optional<Buffer>
|
||||
serializeEcPair(EcPair const& pair);
|
||||
|
||||
/**
|
||||
* @brief Verifies that a buffer contains two valid, parsable EC public keys.
|
||||
@@ -197,13 +200,12 @@ isValidCompressedECPoint(Slice const& buffer);
|
||||
* Uses the additive homomorphic property of ElGamal encryption to compute
|
||||
* Enc(a + b) from Enc(a) and Enc(b) without decryption.
|
||||
*
|
||||
* @param a The first ciphertext (66 bytes).
|
||||
* @param b The second ciphertext (66 bytes).
|
||||
* @param out Output: The resulting ciphertext Enc(a + b).
|
||||
* @return tesSUCCESS on success, or an error code if parsing fails.
|
||||
* @param a The first ciphertext (66 bytes).
|
||||
* @param b The second ciphertext (66 bytes).
|
||||
* @return The resulting ciphertext Enc(a + b), or std::nullopt on failure.
|
||||
*/
|
||||
TER
|
||||
homomorphicAdd(Slice const& a, Slice const& b, Buffer& out);
|
||||
std::optional<Buffer>
|
||||
homomorphicAdd(Slice const& a, Slice const& b);
|
||||
|
||||
/**
|
||||
* @brief Homomorphically subtracts two ElGamal ciphertexts.
|
||||
@@ -211,13 +213,12 @@ homomorphicAdd(Slice const& a, Slice const& b, Buffer& out);
|
||||
* Uses the additive homomorphic property of ElGamal encryption to compute
|
||||
* Enc(a - b) from Enc(a) and Enc(b) without decryption.
|
||||
*
|
||||
* @param a The minuend ciphertext (66 bytes).
|
||||
* @param b The subtrahend ciphertext (66 bytes).
|
||||
* @param out Output: The resulting ciphertext Enc(a - b).
|
||||
* @return tesSUCCESS on success, or an error code if parsing fails.
|
||||
* @param a The minuend ciphertext (66 bytes).
|
||||
* @param b The subtrahend ciphertext (66 bytes).
|
||||
* @return The resulting ciphertext Enc(a - b), or std::nullopt on failure.
|
||||
*/
|
||||
TER
|
||||
homomorphicSubtract(Slice const& a, Slice const& b, Buffer& out);
|
||||
std::optional<Buffer>
|
||||
homomorphicSubtract(Slice const& a, Slice const& b);
|
||||
|
||||
/**
|
||||
* @brief Encrypts an amount using ElGamal encryption.
|
||||
@@ -275,7 +276,7 @@ verifySchnorrProof(Slice const& pubKeySlice, Slice const& proofSlice, uint256 co
|
||||
*/
|
||||
TER
|
||||
verifyElGamalEncryption(
|
||||
std::uint64_t const amount,
|
||||
uint64_t const amount,
|
||||
Slice const& blindingFactor,
|
||||
Slice const& pubKeySlice,
|
||||
Slice const& ciphertext);
|
||||
@@ -309,7 +310,7 @@ checkEncryptedAmountFormat(STObject const& object);
|
||||
*/
|
||||
TER
|
||||
verifyRevealedAmount(
|
||||
std::uint64_t const amount,
|
||||
uint64_t const amount,
|
||||
Slice const& blindingFactor,
|
||||
ConfidentialRecipient const& holder,
|
||||
ConfidentialRecipient const& issuer,
|
||||
@@ -479,5 +480,5 @@ computeSendRemainder(Slice const& balanceCommitment, Slice const& amountCommitme
|
||||
* @return tesSUCCESS on success, tecINTERNAL on failure or if amount is 0.
|
||||
*/
|
||||
TER
|
||||
computeConvertBackRemainder(Slice const& commitment, std::uint64_t amount, Buffer& out);
|
||||
computeConvertBackRemainder(Slice const& commitment, uint64_t amount, Buffer& out);
|
||||
} // namespace xrpl
|
||||
|
||||
Reference in New Issue
Block a user