summaryrefslogtreecommitdiff
path: root/cipher
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2008-09-30 17:58:22 +0000
committerWerner Koch <wk@gnupg.org>2008-09-30 17:58:22 +0000
commit7d31a0c3fd7613f86929ce0f0b2cda052080eb1a (patch)
treea1ec576eb38a27f85bad06a6454406f32700f02a /cipher
parent8e1654e4fb4c93c1d2e79669d319bc758b837bb3 (diff)
downloadlibgcrypt-7d31a0c3fd7613f86929ce0f0b2cda052080eb1a.tar.gz
Fix bug #936.
cleaned up internal symbol usage. Add domain parameter.
Diffstat (limited to 'cipher')
-rw-r--r--cipher/ChangeLog26
-rw-r--r--cipher/dsa.c85
-rw-r--r--cipher/pubkey.c32
-rw-r--r--cipher/rijndael.c26
-rw-r--r--cipher/rsa.c67
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
};