aboutsummaryrefslogtreecommitdiffstats
path: root/g10/pubkey-enc.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2000-01-24 21:14:42 +0000
committerWerner Koch <[email protected]>2000-01-24 21:14:42 +0000
commitdb43afc923f32d39d06c20c1d4fb698cbad0897c (patch)
tree9acd52a1070205f7aa290374045092e3b64e1a94 /g10/pubkey-enc.c
parentAdd files to new directory. (diff)
downloadgnupg-db43afc923f32d39d06c20c1d4fb698cbad0897c.tar.gz
gnupg-db43afc923f32d39d06c20c1d4fb698cbad0897c.zip
See ChangeLog: Mon Jan 24 22:24:38 CET 2000 Werner Koch
Diffstat (limited to 'g10/pubkey-enc.c')
-rw-r--r--g10/pubkey-enc.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c
index 925b5a4d0..70e4bc6c1 100644
--- a/g10/pubkey-enc.c
+++ b/g10/pubkey-enc.c
@@ -37,6 +37,74 @@
static int get_it( PKT_pubkey_enc *k,
DEK *dek, PKT_secret_key *sk, u32 *keyid );
+
+/****************
+ * Emulate our old PK interface here - sometime in the future we might
+ * change the internal design to directly fit to libgcrypt.
+ */
+static int
+pk_decrypt( int algo, MPI *result, MPI *data, MPI *skey )
+{
+ GCRY_SEXP s_skey, s_data, s_plain;
+ int rc;
+
+ *result = NULL;
+ /* make a sexp from skey */
+ if( algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E ) {
+ s_skey = SEXP_CONS( SEXP_NEW( "private-key", 0 ),
+ gcry_sexp_vlist( SEXP_NEW( "elg", 0 ),
+ gcry_sexp_new_name_mpi( "p", skey[0] ),
+ gcry_sexp_new_name_mpi( "g", skey[1] ),
+ gcry_sexp_new_name_mpi( "y", skey[2] ),
+ gcry_sexp_new_name_mpi( "x", skey[3] ),
+ NULL ));
+ }
+ else if( algo == GCRY_PK_RSA ) {
+ s_skey = SEXP_CONS( SEXP_NEW( "private-key", 0 ),
+ gcry_sexp_vlist( SEXP_NEW( "rsa", 0 ),
+ gcry_sexp_new_name_mpi( "n", skey[0] ),
+ gcry_sexp_new_name_mpi( "e", skey[1] ),
+ gcry_sexp_new_name_mpi( "d", skey[2] ),
+ gcry_sexp_new_name_mpi( "p", skey[3] ),
+ gcry_sexp_new_name_mpi( "q", skey[4] ),
+ gcry_sexp_new_name_mpi( "u", skey[5] ),
+ NULL ));
+ }
+ else
+ return G10ERR_PUBKEY_ALGO;
+
+ /* put data into a S-Exp s_data */
+ if( algo == GCRY_PK_ELG || algo == GCRY_PK_ELG_E ) {
+ s_data = SEXP_CONS( SEXP_NEW( "enc-val", 0 ),
+ gcry_sexp_vlist( SEXP_NEW( "elg", 0 ),
+ gcry_sexp_new_name_mpi( "a", data[0] ),
+ gcry_sexp_new_name_mpi( "b", data[1] ),
+ NULL ));
+ }
+ else if( algo == GCRY_PK_RSA ) {
+ s_data = SEXP_CONS( SEXP_NEW( "enc-val", 0 ),
+ gcry_sexp_vlist( SEXP_NEW( "rsa", 0 ),
+ gcry_sexp_new_name_mpi( "a", data[0] ),
+ NULL ));
+ }
+ else
+ BUG();
+
+ rc = gcry_pk_decrypt( &s_plain, s_data, s_skey );
+ gcry_sexp_release( s_skey );
+ gcry_sexp_release( s_data);
+ if( rc )
+ return rc;
+
+ *result = gcry_sexp_car_mpi( s_plain, 0 );
+ if( !*result )
+ return -1; /* oops */
+
+ return 0;
+}
+
+
+
/****************
* Get the session key from a pubkey enc paket and return
* it in DEK, which should have been allocated in secure memory.
@@ -106,7 +174,7 @@ get_it( PKT_pubkey_enc *k, DEK *dek, PKT_secret_key *sk, u32 *keyid )
size_t nframe;
u16 csum, csum2;
- rc = pubkey_decrypt(sk->pubkey_algo, &plain_dek, k->data, sk->skey );
+ rc = pk_decrypt(sk->pubkey_algo, &plain_dek, k->data, sk->skey );
if( rc )
goto leave;
if( gcry_mpi_aprint( GCRYMPI_FMT_USG, &frame, &nframe, plain_dek ) )