Add functions for creating and verifying ed25519 signatures

logging_enabled
Mark Haines 2015-07-07 09:50:32 +01:00
parent a30a64d179
commit 2a873fd4e1
3 changed files with 105 additions and 4 deletions

View File

@ -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;

View File

@ -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
) {

View File

@ -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 */