int ECDSA_verify(int type, const uint8_t *digest, size_t digest_len, const uint8_t *sig, size_t sig_len, const EC_KEY *eckey) { ECDSA_SIG *s; int ret = 0; uint8_t *der = NULL; /* Decode the ECDSA signature. */ s = ECDSA_SIG_from_bytes(sig, sig_len); if (s == NULL) { goto err; } /* Defend against potential laxness in the DER parser. */ size_t der_len; if (!ECDSA_SIG_to_bytes(&der, &der_len, s) || der_len != sig_len || OPENSSL_memcmp(sig, der, sig_len) != 0) { /* This should never happen. crypto/bytestring is strictly DER. */ OPENSSL_PUT_ERROR(ECDSA, ERR_R_INTERNAL_ERROR); goto err; } ret = ECDSA_do_verify(digest, digest_len, s, eckey); err: OPENSSL_free(der); ECDSA_SIG_free(s); return ret; }
int i2d_ECDSA_SIG(const ECDSA_SIG *sig, uint8_t **outp) { uint8_t *der; size_t der_len; if (!ECDSA_SIG_to_bytes(&der, &der_len, sig)) { return -1; } if (der_len > INT_MAX) { OPENSSL_PUT_ERROR(ECDSA, ERR_R_OVERFLOW); OPENSSL_free(der); return -1; } if (outp != NULL) { if (*outp == NULL) { *outp = der; der = NULL; } else { memcpy(*outp, der, der_len); *outp += der_len; } } OPENSSL_free(der); return (int)der_len; }