int DSA_check_signature(int *out_valid, const uint8_t *digest, size_t digest_len, const uint8_t *sig, size_t sig_len, const DSA *dsa) { DSA_SIG *s = NULL; int ret = 0; uint8_t *der = NULL; s = DSA_SIG_new(); if (s == NULL) { goto err; } const uint8_t *sigp = sig; if (d2i_DSA_SIG(&s, &sigp, sig_len) == NULL || sigp != sig + sig_len) { goto err; } /* Ensure that the signature uses DER and doesn't have trailing garbage. */ int der_len = i2d_DSA_SIG(s, &der); if (der_len < 0 || (size_t)der_len != sig_len || memcmp(sig, der, sig_len)) { goto err; } ret = DSA_do_check_signature(out_valid, digest, digest_len, s, dsa); err: OPENSSL_free(der); DSA_SIG_free(s); return ret; }
int DSA_verify(int type, const uint8_t *digest, size_t digest_len, const uint8_t *sig, size_t sig_len, const DSA *dsa) { DSA_SIG *s = NULL; int ret = -1, valid; s = DSA_SIG_new(); if (s == NULL) { goto err; } if (d2i_DSA_SIG(&s, &sig, sig_len) == NULL) { goto err; } if (!DSA_do_check_signature(&valid, digest, digest_len, s, dsa)) { goto err; } ret = valid; err: if (s) { DSA_SIG_free(s); } return ret; }
int DSA_do_verify(const uint8_t *digest, size_t digest_len, DSA_SIG *sig, const DSA *dsa) { int valid; if (!DSA_do_check_signature(&valid, digest, digest_len, sig, dsa)) { return -1; } return valid; }
int DSA_check_signature(int *out_valid, const uint8_t *digest, size_t digest_len, const uint8_t *sig, size_t sig_len, const DSA *dsa) { DSA_SIG *s = NULL; int ret = 0; s = DSA_SIG_new(); if (s == NULL) { goto err; } if (d2i_DSA_SIG(&s, &sig, sig_len) == NULL) { goto err; } ret = DSA_do_check_signature(out_valid, digest, digest_len, s, dsa); err: if (s) { DSA_SIG_free(s); } return ret; }