Implement ECDSA sign and verify operations.

Very basic at the moment, doesn't hash the input first,
and uses OpenSSL's DER encoded signature as output.
This commit is contained in:
Guus Sliepen 2011-07-07 22:27:17 +02:00
parent 86d83bd9bd
commit 03582eb669

View file

@ -70,12 +70,31 @@ size_t ecdsa_size(ecdsa_t *ecdsa) {
return ECDSA_size(*ecdsa); return ECDSA_size(*ecdsa);
} }
// TODO: hash first, standardise output format?
bool ecdsa_sign(ecdsa_t *ecdsa, const void *in, size_t len, void *sig) { bool ecdsa_sign(ecdsa_t *ecdsa, const void *in, size_t len, void *sig) {
logger(LOG_ERR, "Unable to perform ECDSA signature: %s", ERR_error_string(ERR_get_error(), NULL)); unsigned int siglen = ECDSA_size(*ecdsa);
memset(sig, 0, siglen);
if(!ECDSA_sign(0, in, len, sig, &siglen, *ecdsa)) {
logger(LOG_DEBUG, "ECDSA_sign() failed: %s", ERR_error_string(ERR_get_error(), NULL));
return false; return false;
}
if(siglen != ECDSA_size(*ecdsa)) {
logger(LOG_ERR, "Signature length %d != %d", siglen, ECDSA_size(*ecdsa));
}
return true;
} }
bool ecdsa_verify(ecdsa_t *ecdsa, const void *in, size_t len, const void *sig) { bool ecdsa_verify(ecdsa_t *ecdsa, const void *in, size_t len, const void *sig) {
logger(LOG_ERR, "Unable to perform ECDSA verification: %s", ERR_error_string(ERR_get_error(), NULL)); unsigned int siglen = ECDSA_size(*ecdsa);
if(!ECDSA_verify(0, in, len, sig, siglen, *ecdsa)) {
logger(LOG_DEBUG, "ECDSA_verify() failed: %s", ERR_error_string(ERR_get_error(), NULL));
return false; return false;
}
return true;
} }