diff options
author | Werner Koch <wk@gnupg.org> | 2008-09-30 17:58:22 +0000 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2008-09-30 17:58:22 +0000 |
commit | 7d31a0c3fd7613f86929ce0f0b2cda052080eb1a (patch) | |
tree | a1ec576eb38a27f85bad06a6454406f32700f02a /cipher | |
parent | 8e1654e4fb4c93c1d2e79669d319bc758b837bb3 (diff) | |
download | libgcrypt-7d31a0c3fd7613f86929ce0f0b2cda052080eb1a.tar.gz |
Fix bug #936.
cleaned up internal symbol usage.
Add domain parameter.
Diffstat (limited to 'cipher')
-rw-r--r-- | cipher/ChangeLog | 26 | ||||
-rw-r--r-- | cipher/dsa.c | 85 | ||||
-rw-r--r-- | cipher/pubkey.c | 32 | ||||
-rw-r--r-- | cipher/rijndael.c | 26 | ||||
-rw-r--r-- | cipher/rsa.c | 67 |
5 files changed, 140 insertions, 96 deletions
diff --git a/cipher/ChangeLog b/cipher/ChangeLog index 502fb4c6..b8ed7921 100644 --- a/cipher/ChangeLog +++ b/cipher/ChangeLog @@ -1,3 +1,29 @@ +2008-09-30 Werner Koch <wk@g10code.com> + + * rijndael.c (do_setkey): Properly align "t" and "tk". + (prepare_decryption): Properly align "w". Fixes bug #936. + +2008-09-18 Werner Koch <wk@g10code.com> + + + * pubkey.c (gcry_pk_genkey): Parse domain parameter. + (pubkey_generate): Add new arg DOMAIN and remove special case for + DSA with qbits. + * rsa.c (rsa_generate): Add dummy args QBITS, NAME and DOMAIN and + rename to rsa_generate_ext. Change caller. + (_gcry_rsa_generate, _gcry_rsa_check_secret_key) + (_gcry_rsa_encrypt, _gcry_rsa_decrypt, _gcry_rsa_sign) + (_gcry_rsa_verify, _gcry_rsa_get_nbits): Make static and remove + _gcry_ prefix. + (_gcry_pubkey_spec_rsa, _gcry_pubkey_extraspec_rsa): Adjust names. + * dsa.c (dsa_generate_ext): New. + (_gcry_dsa_generate): Replace code by a call to dsa_generate. + (_gcry_dsa_check_secret_key, _gcry_dsa_sign, _gcry_dsa_verify) + (_gcry_dsa_get_nbits): Make static and remove _gcry prefix. + (_gcry_dsa_generate2): Remove. + (_gcry_pubkey_spec_dsa): Adjust to name changes. + (_gcry_pubkey_extraspec_rsa): Add dsa_generate_ext. + 2008-09-16 Werner Koch <wk@g10code.com> * ecc.c (run_selftests): Add arg EXTENDED. diff --git a/cipher/dsa.c b/cipher/dsa.c index 3c9e42b5..fe210fa0 100644 --- a/cipher/dsa.c +++ b/cipher/dsa.c @@ -1,4 +1,4 @@ -/* dsa.c - DSA signature scheme +/* dsa.c - DSA signature algorithm * Copyright (C) 1998, 2000, 2001, 2002, 2003, * 2006, 2008 Free Software Foundation, Inc. * @@ -458,18 +458,24 @@ verify (gcry_mpi_t r, gcry_mpi_t s, gcry_mpi_t hash, DSA_public_key *pkey ) ************** interface ****************** *********************************************/ -gcry_err_code_t -_gcry_dsa_generate (int algo, unsigned int nbits, unsigned long dummy, - gcry_mpi_t *skey, gcry_mpi_t **retfactors) +static gcry_err_code_t +dsa_generate_ext (int algo, unsigned int nbits, unsigned int qbits, + unsigned long use_e, + const char *name, const gcry_sexp_t domain, + unsigned int keygen_flags, + gcry_mpi_t *skey, gcry_mpi_t **retfactors) { - gpg_err_code_t err; + gpg_err_code_t ec; DSA_secret_key sk; (void)algo; - (void)dummy; + (void)use_e; + (void)name; + (void)domain; + (void)keygen_flags; - err = generate (&sk, nbits, 0, retfactors); - if (!err) + ec = generate (&sk, nbits, qbits, retfactors); + if (!ec) { skey[0] = sk.p; skey[1] = sk.q; @@ -478,42 +484,22 @@ _gcry_dsa_generate (int algo, unsigned int nbits, unsigned long dummy, skey[4] = sk.x; } - return err; + return ec; } -/* We don't want to break our API. Thus we use a hack in pubkey.c to - link directly to this function. Note that we can't reuse the dummy - parameter because we can't be sure that applicaions accidently pass - a USE_E (that is for what dummy is used with RSA) to a DSA - generation. */ -gcry_err_code_t -_gcry_dsa_generate2 (int algo, unsigned int nbits, unsigned int qbits, - unsigned long dummy, - gcry_mpi_t *skey, gcry_mpi_t **retfactors) +static gcry_err_code_t +dsa_generate (int algo, unsigned int nbits, unsigned long dummy, + gcry_mpi_t *skey, gcry_mpi_t **retfactors) { - gpg_err_code_t err; - DSA_secret_key sk; - - (void)algo; (void)dummy; - - err = generate (&sk, nbits, qbits, retfactors); - if (!err) - { - skey[0] = sk.p; - skey[1] = sk.q; - skey[2] = sk.g; - skey[3] = sk.y; - skey[4] = sk.x; - } - - return err; + return dsa_generate_ext (algo, nbits, 0, 0, NULL, NULL, 0, skey, retfactors); } -gcry_err_code_t -_gcry_dsa_check_secret_key (int algo, gcry_mpi_t *skey) + +static gcry_err_code_t +dsa_check_secret_key (int algo, gcry_mpi_t *skey) { gcry_err_code_t err = GPG_ERR_NO_ERROR; DSA_secret_key sk; @@ -537,8 +523,8 @@ _gcry_dsa_check_secret_key (int algo, gcry_mpi_t *skey) } -gcry_err_code_t -_gcry_dsa_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey) +static gcry_err_code_t +dsa_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey) { gcry_err_code_t err = GPG_ERR_NO_ERROR; DSA_secret_key sk; @@ -563,9 +549,9 @@ _gcry_dsa_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey) return err; } -gcry_err_code_t -_gcry_dsa_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, gcry_mpi_t *pkey, - int (*cmp) (void *, gcry_mpi_t), void *opaquev) +static gcry_err_code_t +dsa_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, gcry_mpi_t *pkey, + int (*cmp) (void *, gcry_mpi_t), void *opaquev) { gcry_err_code_t err = GPG_ERR_NO_ERROR; DSA_public_key pk; @@ -590,8 +576,8 @@ _gcry_dsa_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, gcry_mpi_t *pkey, } -unsigned int -_gcry_dsa_get_nbits (int algo, gcry_mpi_t *pkey) +static unsigned int +dsa_get_nbits (int algo, gcry_mpi_t *pkey) { (void)algo; @@ -743,16 +729,17 @@ gcry_pk_spec_t _gcry_pubkey_spec_dsa = "DSA", dsa_names, "pqgy", "pqgyx", "", "rs", "pqgy", GCRY_PK_USAGE_SIGN, - _gcry_dsa_generate, - _gcry_dsa_check_secret_key, + dsa_generate, + dsa_check_secret_key, NULL, NULL, - _gcry_dsa_sign, - _gcry_dsa_verify, - _gcry_dsa_get_nbits, + dsa_sign, + dsa_verify, + dsa_get_nbits }; pk_extra_spec_t _gcry_pubkey_extraspec_dsa = { - run_selftests + run_selftests, + dsa_generate_ext }; diff --git a/cipher/pubkey.c b/cipher/pubkey.c index aabcf944..1d7e1d09 100644 --- a/cipher/pubkey.c +++ b/cipher/pubkey.c @@ -531,15 +531,16 @@ pubkey_get_nenc (int algorithm) /* Generate a new public key with algorithm ALGORITHM of size NBITS and return it at SKEY. The use of the arguments QBITS, USE_E, - XVALUE and CURVE_NAME depend on the ALGORITHM. RETFACTOR is used - by some algorithms to return certain additional information which - are in general not required. + XVALUE, CURVE_NAME and DOMAIN depend on the ALGORITHM. RETFACTOR + is used by some algorithms to return certain additional information + which are in general not required. The function returns the error code number or 0 on success. */ static gcry_err_code_t pubkey_generate (int algorithm, unsigned int nbits, unsigned int qbits, unsigned long use_e, gcry_mpi_t xvalue, - const char *curve_name, unsigned int keygen_flags, + const char *curve_name, gcry_sexp_t domain, + unsigned int keygen_flags, gcry_mpi_t *skey, gcry_mpi_t **retfactors) { gcry_err_code_t ec = GPG_ERR_PUBKEY_ALGO; @@ -561,13 +562,6 @@ pubkey_generate (int algorithm, unsigned int nbits, unsigned int qbits, security sensitive.. */ ec = GPG_ERR_INV_FLAG; } - else if (qbits && pubkey->spec == &_gcry_pubkey_spec_dsa) - { - /* Hack to pass QBITS to the DSA generation. fixme: We - should merge this into an ext_generate fucntion. */ - ec = _gcry_dsa_generate2 - (algorithm, nbits, qbits, 0, skey, retfactors); - } #ifdef USE_ELGAMAL else if (xvalue && pubkey->spec == &_gcry_pubkey_spec_elg) { @@ -587,10 +581,17 @@ pubkey_generate (int algorithm, unsigned int nbits, unsigned int qbits, else if (extraspec && extraspec->ext_generate) { /* Use the extended generate function if available. */ - ec = extraspec->ext_generate (algorithm, nbits, use_e, - keygen_flags, + ec = extraspec->ext_generate (algorithm, nbits, qbits, use_e, + NULL, domain, keygen_flags, skey, retfactors); } + else if (qbits || domain) + { + /* A qbits or domain parameter is specified but the + algorithm does not feature an extended generation + function. */ + ec = GPG_ERR_INV_PARAMETER; + } else { /* Use the standard generate function. */ @@ -2258,8 +2259,11 @@ gcry_pk_genkey (gcry_sexp_t *r_key, gcry_sexp_t s_parms) else nbits = 0; + /* Extract the optional domain parameter and call the key generation. */ + l2 = gcry_sexp_find_token (list, "domain", 0); rc = pubkey_generate (module->mod_id, nbits, qbits, use_e, xvalue, - curve, keygen_flags, skey, &factors); + curve, l2, keygen_flags, skey, &factors); + gcry_sexp_release (l2); if (rc) goto leave; diff --git a/cipher/rijndael.c b/cipher/rijndael.c index 755a6942..cb8e7fcd 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -97,11 +97,21 @@ do_setkey (RIJNDAEL_context *ctx, const byte *key, const unsigned keylen) static int initialized = 0; static const char *selftest_failed=0; int ROUNDS; - byte k[MAXKC][4]; int i,j, r, t, rconpointer = 0; - byte tk[MAXKC][4]; int KC; - + union + { + PROPERLY_ALIGNED_TYPE dummy; + byte k[MAXKC][4]; + } k; +#define k k.k + union + { + PROPERLY_ALIGNED_TYPE dummy; + byte tk[MAXKC][4]; + } tk; +#define tk tk.tk + /* The on-the-fly self tests are only run in non-fips mode. In fips mode explicit self-tests are required. Actually the on-the-fly self-tests are not fully thread-safe and it might happen that a @@ -237,6 +247,8 @@ do_setkey (RIJNDAEL_context *ctx, const byte *key, const unsigned keylen) } return 0; +#undef tk +#undef k } @@ -256,7 +268,12 @@ static void prepare_decryption( RIJNDAEL_context *ctx ) { int r; - byte *w; + union + { + PROPERLY_ALIGNED_TYPE dummy; + byte *w; + } w; +#define w w.w for (r=0; r < MAXROUNDS+1; r++ ) { @@ -285,6 +302,7 @@ prepare_decryption( RIJNDAEL_context *ctx ) ^ *((u32*)U3[w[2]]) ^ *((u32*)U4[w[3]]); } #undef W +#undef w } diff --git a/cipher/rsa.c b/cipher/rsa.c index 9bedcaab..72ee8a8b 100644 --- a/cipher/rsa.c +++ b/cipher/rsa.c @@ -532,15 +532,20 @@ rsa_unblind (gcry_mpi_t x, gcry_mpi_t ri, gcry_mpi_t n) *********************************************/ static gcry_err_code_t -rsa_generate (int algo, unsigned int nbits, unsigned long use_e, - unsigned int keygen_flags, - gcry_mpi_t *skey, gcry_mpi_t **retfactors) +rsa_generate_ext (int algo, unsigned int nbits, unsigned int qbits, + unsigned long use_e, + const char *name, const gcry_sexp_t domain, + unsigned int keygen_flags, + gcry_mpi_t *skey, gcry_mpi_t **retfactors) { RSA_secret_key sk; gpg_err_code_t ec; int i; (void)algo; + (void)qbits; + (void)name; + (void)domain; ec = generate (&sk, nbits, use_e, !!(keygen_flags & PUBKEY_FLAG_TRANSIENT_KEY) ); @@ -572,16 +577,17 @@ rsa_generate (int algo, unsigned int nbits, unsigned long use_e, } -gcry_err_code_t -_gcry_rsa_generate (int algo, unsigned int nbits, unsigned long use_e, - gcry_mpi_t *skey, gcry_mpi_t **retfactors) +static gcry_err_code_t +rsa_generate (int algo, unsigned int nbits, unsigned long use_e, + gcry_mpi_t *skey, gcry_mpi_t **retfactors) { - return rsa_generate (algo, nbits, use_e, 0, skey, retfactors); + return rsa_generate_ext (algo, nbits, 0, use_e, NULL, NULL, 0, + skey, retfactors); } -gcry_err_code_t -_gcry_rsa_check_secret_key( int algo, gcry_mpi_t *skey ) +static gcry_err_code_t +rsa_check_secret_key (int algo, gcry_mpi_t *skey) { gcry_err_code_t err = GPG_ERR_NO_ERROR; RSA_secret_key sk; @@ -605,9 +611,9 @@ _gcry_rsa_check_secret_key( int algo, gcry_mpi_t *skey ) } -gcry_err_code_t -_gcry_rsa_encrypt (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, - gcry_mpi_t *pkey, int flags) +static gcry_err_code_t +rsa_encrypt (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, + gcry_mpi_t *pkey, int flags) { RSA_public_key pk; @@ -622,9 +628,10 @@ _gcry_rsa_encrypt (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, return GPG_ERR_NO_ERROR; } -gcry_err_code_t -_gcry_rsa_decrypt (int algo, gcry_mpi_t *result, gcry_mpi_t *data, - gcry_mpi_t *skey, int flags) + +static gcry_err_code_t +rsa_decrypt (int algo, gcry_mpi_t *result, gcry_mpi_t *data, + gcry_mpi_t *skey, int flags) { RSA_secret_key sk; gcry_mpi_t r = MPI_NULL; /* Random number needed for blinding. */ @@ -701,8 +708,9 @@ _gcry_rsa_decrypt (int algo, gcry_mpi_t *result, gcry_mpi_t *data, return GPG_ERR_NO_ERROR; } -gcry_err_code_t -_gcry_rsa_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey) + +static gcry_err_code_t +rsa_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey) { RSA_secret_key sk; @@ -720,8 +728,9 @@ _gcry_rsa_sign (int algo, gcry_mpi_t *resarr, gcry_mpi_t data, gcry_mpi_t *skey) return GPG_ERR_NO_ERROR; } -gcry_err_code_t -_gcry_rsa_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, gcry_mpi_t *pkey, + +static gcry_err_code_t +rsa_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, gcry_mpi_t *pkey, int (*cmp) (void *opaque, gcry_mpi_t tmp), void *opaquev) { @@ -752,8 +761,8 @@ _gcry_rsa_verify (int algo, gcry_mpi_t hash, gcry_mpi_t *data, gcry_mpi_t *pkey, } -unsigned int -_gcry_rsa_get_nbits (int algo, gcry_mpi_t *pkey) +static unsigned int +rsa_get_nbits (int algo, gcry_mpi_t *pkey) { (void)algo; @@ -1080,18 +1089,18 @@ gcry_pk_spec_t _gcry_pubkey_spec_rsa = "RSA", rsa_names, "ne", "nedpqu", "a", "s", "n", GCRY_PK_USAGE_SIGN | GCRY_PK_USAGE_ENCR, - _gcry_rsa_generate, - _gcry_rsa_check_secret_key, - _gcry_rsa_encrypt, - _gcry_rsa_decrypt, - _gcry_rsa_sign, - _gcry_rsa_verify, - _gcry_rsa_get_nbits, + rsa_generate, + rsa_check_secret_key, + rsa_encrypt, + rsa_decrypt, + rsa_sign, + rsa_verify, + rsa_get_nbits, }; pk_extra_spec_t _gcry_pubkey_extraspec_rsa = { run_selftests, - rsa_generate, + rsa_generate_ext, compute_keygrip }; |