1 /* 2 * Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <openssl/dsa.h> 11 #include "internal/refcount.h" 12 13 struct dsa_st { 14 /* 15 * This first variable is used to pick up errors where a DSA is passed 16 * instead of of a EVP_PKEY 17 */ 18 int pad; 19 int32_t version; 20 BIGNUM *p; 21 BIGNUM *q; /* == 20 */ 22 BIGNUM *g; 23 BIGNUM *pub_key; /* y public key */ 24 BIGNUM *priv_key; /* x private key */ 25 int flags; 26 /* Normally used to cache montgomery values */ 27 BN_MONT_CTX *method_mont_p; 28 CRYPTO_REF_COUNT references; 29 CRYPTO_EX_DATA ex_data; 30 const DSA_METHOD *meth; 31 /* functional reference if 'meth' is ENGINE-provided */ 32 ENGINE *engine; 33 CRYPTO_RWLOCK *lock; 34 }; 35 36 struct DSA_SIG_st { 37 BIGNUM *r; 38 BIGNUM *s; 39 }; 40 41 struct dsa_method { 42 char *name; 43 DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa); 44 int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, 45 BIGNUM **rp); 46 int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len, 47 DSA_SIG *sig, DSA *dsa); 48 int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, const BIGNUM *a1, 49 const BIGNUM *p1, const BIGNUM *a2, const BIGNUM *p2, 50 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont); 51 /* Can be null */ 52 int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, const BIGNUM *a, const BIGNUM *p, 53 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); 54 int (*init) (DSA *dsa); 55 int (*finish) (DSA *dsa); 56 int flags; 57 void *app_data; 58 /* If this is non-NULL, it is used to generate DSA parameters */ 59 int (*dsa_paramgen) (DSA *dsa, int bits, 60 const unsigned char *seed, int seed_len, 61 int *counter_ret, unsigned long *h_ret, 62 BN_GENCB *cb); 63 /* If this is non-NULL, it is used to generate DSA keys */ 64 int (*dsa_keygen) (DSA *dsa); 65 }; 66 67 int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, 68 const EVP_MD *evpmd, const unsigned char *seed_in, 69 size_t seed_len, unsigned char *seed_out, 70 int *counter_ret, unsigned long *h_ret, 71 BN_GENCB *cb); 72 73 int dsa_builtin_paramgen2(DSA *ret, size_t L, size_t N, 74 const EVP_MD *evpmd, const unsigned char *seed_in, 75 size_t seed_len, int idx, unsigned char *seed_out, 76 int *counter_ret, unsigned long *h_ret, 77 BN_GENCB *cb); 78