aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--agent/ChangeLog5
-rw-r--r--agent/pksign.c69
2 files changed, 27 insertions, 47 deletions
diff --git a/agent/ChangeLog b/agent/ChangeLog
index 10f4d45fa..0c7857811 100644
--- a/agent/ChangeLog
+++ b/agent/ChangeLog
@@ -1,3 +1,8 @@
+2003-08-14 Timo Schulz <[email protected]>
+
+ * pksign.c: do_encode_md: Due to the fact pkcs#1 padding
+ is now in Libgcrypt, use the new interface.
+
2003-07-31 Werner Koch <[email protected]>
* Makefile.am (gpg_agent_LDADD): Added INTLLIBS.
diff --git a/agent/pksign.c b/agent/pksign.c
index fba2c652c..37c85cad8 100644
--- a/agent/pksign.c
+++ b/agent/pksign.c
@@ -32,54 +32,32 @@
static int
-do_encode_md (const unsigned char *digest, size_t digestlen, int algo,
- unsigned int nbits, gcry_mpi_t *r_val)
+do_encode_md (const byte * md, size_t mdlen, int algo, gcry_sexp_t * r_hash)
{
- int nframe = (nbits+7) / 8;
- byte *frame;
- int i, n;
- byte asn[100];
- size_t asnlen;
-
- asnlen = DIM(asn);
- if (gcry_md_algo_info (algo, GCRYCTL_GET_ASNOID, asn, &asnlen))
+ gcry_sexp_t hash;
+ const char * s;
+ char * p, tmp[16];
+ int i, rc;
+
+ p = xmalloc (64+mdlen);
+ s = gcry_md_algo_name (algo);
+ if (s && strlen (s) < 16)
{
- log_error ("no object identifier for algo %d\n", algo);
- return gpg_error (GPG_ERR_INTERNAL);
+ for (i=0; i < strlen (s); i++)
+ tmp[i] = tolower (s[i]);
+ tmp[i] = '\0';
}
-
- if (digestlen + asnlen + 4 > nframe )
+ sprintf (p, "(data\n (flags pkcs1)\n (hash %s #", tmp);
+ for (i=0; i < mdlen; i++)
{
- log_error ("can't encode a %d bit MD into a %d bits frame\n",
- (int)(digestlen*8), (int)nbits);
- return gpg_error (GPG_ERR_INTERNAL);
+ sprintf (tmp, "%02x", md[i]);
+ strcat (p, tmp);
}
-
- /* We encode the MD in this way:
- *
- * 0 1 PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes)
- *
- * PAD consists of FF bytes.
- */
- frame = xtrymalloc (nframe);
- if (!frame)
- return out_of_core ();
- n = 0;
- frame[n++] = 0;
- frame[n++] = 1; /* block type */
- i = nframe - digestlen - asnlen -3 ;
- assert ( i > 1 );
- memset ( frame+n, 0xff, i ); n += i;
- frame[n++] = 0;
- memcpy ( frame+n, asn, asnlen ); n += asnlen;
- memcpy ( frame+n, digest, digestlen ); n += digestlen;
- assert ( n == nframe );
- if (DBG_CRYPTO)
- log_printhex ("encoded hash:", frame, nframe);
-
- gcry_mpi_scan (r_val, GCRYMPI_FMT_USG, frame, n, &nframe);
- xfree (frame);
- return 0;
+ strcat (p, "#))\n");
+ rc = gcry_sexp_sscan (&hash, NULL, p, strlen (p));
+ xfree (p);
+ *r_hash = hash;
+ return rc;
}
@@ -132,12 +110,9 @@ agent_pksign (CTRL ctrl, FILE *outfp, int ignore_cache)
rc = do_encode_md (ctrl->digest.value,
ctrl->digest.valuelen,
ctrl->digest.algo,
- gcry_pk_get_nbits (s_skey),
- &frame);
+ &s_hash);
if (rc)
goto leave;
- if ( gcry_sexp_build (&s_hash, NULL, "%m", frame) )
- BUG ();
if (DBG_CRYPTO)
{