Add functions for creating and verifying ed25519 signatures
This commit is contained in:
parent
a30a64d179
commit
2a873fd4e1
3 changed files with 105 additions and 4 deletions
|
@ -33,6 +33,18 @@ struct Curve25519KeyPair : public Curve25519PublicKey {
|
|||
};
|
||||
|
||||
|
||||
struct Ed25519PublicKey {
|
||||
static const int LENGTH = 32;
|
||||
std::uint8_t public_key[32];
|
||||
};
|
||||
|
||||
|
||||
struct Ed25519KeyPair : public Ed25519PublicKey {
|
||||
static const int LENGTH = 64;
|
||||
std::uint8_t private_key[32];
|
||||
};
|
||||
|
||||
|
||||
/** Generate a curve25519 key pair from 32 random bytes. */
|
||||
void curve25519_generate_key(
|
||||
std::uint8_t const * random_32_bytes,
|
||||
|
@ -61,7 +73,7 @@ void curve25519_sign(
|
|||
);
|
||||
|
||||
|
||||
/** Verify thei message using their public key.
|
||||
/** Verify their message using their public key.
|
||||
* The signature input buffer must be 64 bytes long.
|
||||
* Returns true if the signature is valid. */
|
||||
bool curve25519_verify(
|
||||
|
@ -70,6 +82,31 @@ bool curve25519_verify(
|
|||
std::uint8_t const * signature
|
||||
);
|
||||
|
||||
/** Generate a curve25519 key pair from 32 random bytes. */
|
||||
void ed25519_generate_key(
|
||||
std::uint8_t const * random_32_bytes,
|
||||
Ed25519KeyPair & key_pair
|
||||
);
|
||||
|
||||
|
||||
/** Signs the message using our private key.
|
||||
* The output buffer must be at least 64 bytes long. */
|
||||
void ed25519_sign(
|
||||
Ed25519KeyPair const & our_key,
|
||||
std::uint8_t const * message, std::size_t message_length,
|
||||
std::uint8_t * output
|
||||
);
|
||||
|
||||
|
||||
/** Verify their message using their public key.
|
||||
* The signature input buffer must be 64 bytes long.
|
||||
* Returns true if the signature is valid. */
|
||||
bool ed25519_verify(
|
||||
Ed25519PublicKey const & their_key,
|
||||
std::uint8_t const * message, std::size_t message_length,
|
||||
std::uint8_t const * signature
|
||||
);
|
||||
|
||||
|
||||
struct Aes256Key {
|
||||
static const int LENGTH = 32;
|
||||
|
|
|
@ -191,6 +191,42 @@ bool olm::curve25519_verify(
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
void olm::ed25519_generate_key(
|
||||
std::uint8_t const * random_32_bytes,
|
||||
olm::Ed25519KeyPair & key_pair
|
||||
) {
|
||||
std::memcpy(key_pair.private_key, random_32_bytes, 32);
|
||||
::ed25519_keypair(key_pair.private_key, key_pair.public_key);
|
||||
}
|
||||
|
||||
|
||||
void olm::ed25519_sign(
|
||||
olm::Ed25519KeyPair const & our_key,
|
||||
std::uint8_t const * message, std::size_t message_length,
|
||||
std::uint8_t * output
|
||||
) {
|
||||
::ed25519_sign(
|
||||
output,
|
||||
message, message_length,
|
||||
our_key.public_key, our_key.private_key
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool olm::ed25519_verify(
|
||||
olm::Ed25519PublicKey const & their_key,
|
||||
std::uint8_t const * message, std::size_t message_length,
|
||||
std::uint8_t const * signature
|
||||
) {
|
||||
return 0 != ::ed25519_verify(
|
||||
signature,
|
||||
message, message_length,
|
||||
their_key.public_key
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
std::size_t olm::aes_encrypt_cbc_length(
|
||||
std::size_t input_length
|
||||
) {
|
||||
|
|
|
@ -83,8 +83,8 @@ assert_equals(expected_agreement, actual_agreement, 32);
|
|||
} /* Curve25529 Test Case 1 */
|
||||
|
||||
|
||||
{ /* Signature Test Cast 1 */
|
||||
TestCase test_case("Signature Test Case 1");
|
||||
{ /* Curve25519 Signature Test Case 1 */
|
||||
TestCase test_case("Curve25519 Signature Test Case 1");
|
||||
|
||||
std::uint8_t private_key[33] = "This key is a string of 32 bytes";
|
||||
std::uint8_t message[] = "message";
|
||||
|
@ -110,7 +110,35 @@ result = olm::curve25519_verify(
|
|||
);
|
||||
assert_equals(false, result);
|
||||
|
||||
} /* Signature Test Cast 1 */
|
||||
} /* Curve25519 Signature Test Case 1 */
|
||||
|
||||
{
|
||||
TestCase test_case("Ed25519 Signature Test Case 1");
|
||||
std::uint8_t private_key[33] = "This key is a string of 32 bytes";
|
||||
|
||||
std::uint8_t message[] = "Hello, World";
|
||||
std::size_t message_length = sizeof(message) - 1;
|
||||
|
||||
olm::Ed25519KeyPair key_pair;
|
||||
olm::ed25519_generate_key(private_key, key_pair);
|
||||
|
||||
std::uint8_t signature[64];
|
||||
olm::ed25519_sign(
|
||||
key_pair, message, message_length, signature
|
||||
);
|
||||
|
||||
bool result = olm::ed25519_verify(
|
||||
key_pair, message, message_length, signature
|
||||
);
|
||||
assert_equals(true, result);
|
||||
|
||||
message[0] = 'n';
|
||||
result = olm::ed25519_verify(
|
||||
key_pair, message, message_length, signature
|
||||
);
|
||||
assert_equals(false, result);
|
||||
}
|
||||
|
||||
|
||||
{ /* AES Test Case 1 */
|
||||
|
||||
|
|
Loading…
Reference in a new issue