aboutsummaryrefslogtreecommitdiffstats
path: root/g10/seskey.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1999-10-26 12:14:37 +0000
committerWerner Koch <[email protected]>1999-10-26 12:14:37 +0000
commitcf70ca8d68eb836b952f2c234f064b1afc205962 (patch)
treeaa33afbc79efd1f8538e5286b13d900321a8f14b /g10/seskey.c
parentChanged the way it works - now needs an extra program to to most tasks. (diff)
downloadgnupg-cf70ca8d68eb836b952f2c234f064b1afc205962.tar.gz
gnupg-cf70ca8d68eb836b952f2c234f064b1afc205962.zip
See ChangeLog: Tue Oct 26 14:10:21 CEST 1999 Werner Koch
Diffstat (limited to 'g10/seskey.c')
-rw-r--r--g10/seskey.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/g10/seskey.c b/g10/seskey.c
index bb158abc0..db8f6c62c 100644
--- a/g10/seskey.c
+++ b/g10/seskey.c
@@ -23,6 +23,8 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+
+#include <gcrypt.h>
#include "util.h"
#include "cipher.h"
#include "mpi.h"
@@ -36,19 +38,28 @@
void
make_session_key( DEK *dek )
{
- CIPHER_HANDLE chd;
+ GCRY_CIPHER_HD chd;
int i, rc;
- dek->keylen = cipher_get_keylen( dek->algo ) / 8;
+ dek->keylen = gcry_cipher_get_algo_keylen( dek->algo );
+
+ if( !(chd = gcry_cipher_open( dek->algo, GCRY_CIPHER_MODE_CFB,
+ GCRY_CIPHER_SECURE
+ | (dek->algo >= 100 ?
+ 0 : GCRY_CIPHER_ENABLE_SYNC) ))
+ ) {
+ BUG();
+ }
- chd = cipher_open( dek->algo, CIPHER_MODE_AUTO_CFB, 1 );
randomize_buffer( dek->key, dek->keylen, 1 );
for(i=0; i < 16; i++ ) {
- rc = cipher_setkey( chd, dek->key, dek->keylen );
+ rc = gcry_cipher_setkey( chd, dek->key, dek->keylen );
if( !rc ) {
- cipher_close( chd );
+ gcry_cipher_close( chd );
return;
}
+ if( rc != GCRYERR_WEAK_KEY )
+ BUG();
log_info(_("weak key created - retrying\n") );
/* Renew the session key until we get a non-weak key. */
randomize_buffer( dek->key, dek->keylen, 1 );
@@ -141,8 +152,8 @@ encode_session_key( DEK *dek, unsigned nbits )
static MPI
-do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits,
- const byte *asn, size_t asnlen )
+do_encode_md( GCRY_MD_HD md, int algo, size_t len, unsigned nbits,
+ const byte *asn, size_t asnlen )
{
int nframe = (nbits+7) / 8;
byte *frame;
@@ -159,7 +170,8 @@ do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits,
*
* PAD consists of FF bytes.
*/
- frame = md_is_secure(md)? m_alloc_secure( nframe ) : m_alloc( nframe );
+ frame = gcry_md_is_secure(md)? m_alloc_secure( nframe )
+ : m_alloc( nframe );
n = 0;
frame[n++] = 0;
frame[n++] = algo;
@@ -168,9 +180,9 @@ do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits,
memset( frame+n, 0xff, i ); n += i;
frame[n++] = 0;
memcpy( frame+n, asn, asnlen ); n += asnlen;
- memcpy( frame+n, md_read(md, algo), len ); n += len;
+ memcpy( frame+n, gcry_md_read(md, algo), len ); n += len;
assert( n == nframe );
- a = md_is_secure(md)?
+ a = gcry_md_is_secure(md)?
mpi_alloc_secure( (nframe+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB )
: mpi_alloc( (nframe+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB );
mpi_set_buffer( a, frame, nframe, 0 );
@@ -180,24 +192,33 @@ do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits,
MPI
-encode_md_value( int pubkey_algo, MD_HANDLE md, int hash_algo, unsigned nbits )
+encode_md_value( int pubkey_algo, GCRY_MD_HD md, int hash_algo, unsigned nbits )
{
- int algo = hash_algo? hash_algo : md_get_algo(md);
- const byte *asn;
- size_t asnlen, mdlen;
+ int algo = hash_algo? hash_algo : gcry_md_get_algo(md);
MPI frame;
if( pubkey_algo == PUBKEY_ALGO_DSA ) {
- frame = md_is_secure(md)? mpi_alloc_secure((md_digest_length(hash_algo)
+ frame = gcry_md_is_secure(md)? mpi_alloc_secure(
+ (gcry_md_get_algo_dlen(hash_algo)
+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB )
- : mpi_alloc((md_digest_length(hash_algo)
+ : mpi_alloc((gcry_md_get_algo_dlen(hash_algo)
+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB );
- mpi_set_buffer( frame, md_read(md, hash_algo),
- md_digest_length(hash_algo), 0 );
+ mpi_set_buffer( frame, gcry_md_read(md, hash_algo),
+ gcry_md_get_algo_dlen(hash_algo), 0 );
}
else {
- asn = md_asn_oid( algo, &asnlen, &mdlen );
- frame = do_encode_md( md, algo, mdlen, nbits, asn, asnlen );
+ byte *asn;
+ size_t asnlen;
+
+ if( gcry_md_algo_info( algo, GCRYCTL_GET_ASNOID, NULL, &asnlen ) )
+ log_fatal("can't get OID of algo %d: %s\n",
+ algo, gcry_strerror(-1));
+ asn = m_alloc( asnlen );
+ if( gcry_md_algo_info( algo, GCRYCTL_GET_ASNOID, asn, &asnlen ) )
+ BUG();
+ frame = do_encode_md( md, algo, gcry_md_get_algo_dlen( algo ),
+ nbits, asn, asnlen );
+ m_free( asn );
}
return frame;
}