diff options
author | Tomas Mraz <tomas@openssl.org> | 2023-01-13 17:59:52 +0100 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2023-02-03 12:38:44 +0100 |
commit | fab4973801bdc11c29c4c8ccf65cf39cbc63ce9b (patch) | |
tree | 63d28be04eb8c9eebc71923ac242ad8ce5d78f3f /crypto | |
parent | c1b4467a7cc129a74fc5205b80a5c47556b99416 (diff) |
Do not create DSA keys without parameters by decoder
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/x509/x_pubkey.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/crypto/x509/x_pubkey.c b/crypto/x509/x_pubkey.c index bc90ddd89b..77790faa1f 100644 --- a/crypto/x509/x_pubkey.c +++ b/crypto/x509/x_pubkey.c @@ -745,6 +745,30 @@ DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length) return key; } +/* Called from decoders; disallows provided DSA keys without parameters. */ +DSA *ossl_d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length) +{ + DSA *key = NULL; + const unsigned char *data; + const BIGNUM *p, *q, *g; + + data = *pp; + key = d2i_DSA_PUBKEY(NULL, &data, length); + if (key == NULL) + return NULL; + DSA_get0_pqg(key, &p, &q, &g); + if (p == NULL || q == NULL || g == NULL) { + DSA_free(key); + return NULL; + } + *pp = data; + if (a != NULL) { + DSA_free(*a); + *a = key; + } + return key; +} + int i2d_DSA_PUBKEY(const DSA *a, unsigned char **pp) { EVP_PKEY *pktmp; |