Skip to main content

ECDSA Signature (ecdsa256)

Elliptic Curve Digital Signature Algorithm and ECDH key exchange using secp256r1 curve.

Constants

#define ECDSA256_BYTES (32)
#define ECDSA256_PRIVATE_KEY_SIZE (32)
#define ECDSA256_PUBLIC_KEY_SIZE (33)
#define ECDSA256_SIGNATURE_SIZE (64)
#define ECDSA256_SHARED_KEY_SIZE (32)

Public key is in compressed format (33 bytes). Signature consists of two 32-byte big integers concatenated.

API

int ecdsa256_keygen(uint8_t * public, uint8_t * private);

Generate public/private key pair. Returns non-zero on success, 0 on failure.

int ecdsa256_sign(const uint8_t * private, const uint8_t * sha256, uint8_t * signature);

Sign a SHA-256 hash with private key. Returns non-zero on success, 0 on failure.

int ecdsa256_verify(const uint8_t * public, const uint8_t * sha256, const uint8_t * signature);

Verify signature with public key. Returns non-zero on valid signature, 0 on failure.

int ecdh256_keygen(const uint8_t * public, const uint8_t * private, uint8_t * shared);

ECDH compute shared key. Returns non-zero on success, 0 on failure.

Example

Sign and Verify

uint8_t pub[ECDSA256_PUBLIC_KEY_SIZE];
uint8_t priv[ECDSA256_PRIVATE_KEY_SIZE];
uint8_t msg[32] = { ... };
uint8_t sign[ECDSA256_SIGNATURE_SIZE];

ecdsa256_keygen(pub, priv);
ecdsa256_sign(priv, msg, sign);

if(ecdsa256_verify(pub, msg, sign))
/* signature verified */

ECDH Key Exchange

uint8_t shared[ECDSA256_SHARED_KEY_SIZE];
ecdh256_keygen(remote_public, local_private, shared);