diff options
-rw-r--r-- | sm/ChangeLog | 15 | ||||
-rw-r--r-- | sm/base64.c | 52 | ||||
-rw-r--r-- | sm/certdump.c | 23 | ||||
-rw-r--r-- | sm/decrypt.c | 23 | ||||
-rw-r--r-- | sm/gpgsm.h | 2 | ||||
-rw-r--r-- | sm/keydb.c | 6 | ||||
-rw-r--r-- | sm/keylist.c | 14 | ||||
-rw-r--r-- | sm/verify.c | 49 |
8 files changed, 101 insertions, 83 deletions
diff --git a/sm/ChangeLog b/sm/ChangeLog index e9b8bfad4..42ed3319f 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,3 +1,18 @@ +2001-12-20 Werner Koch <[email protected]> + + * base64.c (base64_reader_cb): Try to detect an S/MIME body part. + + * certdump.c (print_sexp): Renamed to gpgsm_dump_serial, made + global. + (print_time): Renamed to gpgsm_dump_time, made global. + (gpgsm_dump_serial): Take a real S-Expression as argument and + print the first item. + * keylist.c (list_cert_colon): Ditto. + * keydb.c (keydb_search_issuer_sn): Ditto. + * decrypt.c (print_integer_sexp): Removed and made callers + use gpgsm_dump_serial. + * verify.c (print_time): Removed, made callers use gpgsm_dump_time. + 2001-12-19 Marcus Brinkmann <[email protected]> * call-agent.c (start_agent): Add new argument to assuan_pipe_connect. diff --git a/sm/base64.c b/sm/base64.c index 4d1620975..b53009b85 100644 --- a/sm/base64.c +++ b/sm/base64.c @@ -49,12 +49,13 @@ struct reader_cb_parm_s { int autodetect; /* try to detect the input encoding */ int assume_pem; /* assume input encoding is PEM */ - int assume_base64; /* assume inpout is base64 encoded */ + int assume_base64; /* assume input is base64 encoded */ int identified; int is_pem; int is_base64; int stop_seen; + int might_be_smime; struct { int idx; @@ -121,6 +122,31 @@ static unsigned char asctobin[256] = { }; +static int +has_only_base64 (const unsigned char *line, int linelen) +{ + if (linelen < 20) + return 0; + for (; linelen; line++, linelen--) + { + if (*line == '\n' || (linelen > 1 && *line == '\r' && line[1] == '\n')) + break; + if ( !strchr (bintoasc, *line) ) + return 0; + } + return 1; /* yes */ +} + +static int +is_empty_line (const unsigned char *line, int linelen) +{ + if (linelen >= 2 && *line == '\r' && line[1] == '\n') + return 1; + if (linelen >= 1 && *line == '\n') + return 1; + return 0; +} + static int base64_reader_cb (void *cb_value, char *buffer, size_t count, size_t *nread) @@ -197,6 +223,30 @@ base64_reader_cb (void *cb_value, char *buffer, size_t count, size_t *nread) parm->is_pem = 1; parm->linelen = parm->readpos = 0; } + else if ( parm->have_lf && parm->line_counter == 1 + && !strncmp (parm->line, "Content-Type:", 13)) + { /* Might be a S/MIME body */ + parm->might_be_smime = 1; + parm->linelen = parm->readpos = 0; + goto next; + } + else if (parm->might_be_smime == 1 + && is_empty_line (parm->line, parm->linelen)) + { + parm->might_be_smime = 2; + parm->linelen = parm->readpos = 0; + goto next; + } + else if (parm->might_be_smime == 2) + { + parm->might_be_smime = 0; + if ( !has_only_base64 (parm->line, parm->linelen)) + { + parm->linelen = parm->readpos = 0; + goto next; + } + parm->is_pem = 1; + } else { parm->linelen = parm->readpos = 0; diff --git a/sm/certdump.c b/sm/certdump.c index 733fcea4f..eb8264578 100644 --- a/sm/certdump.c +++ b/sm/certdump.c @@ -33,20 +33,24 @@ #include "gpgsm.h" #include "keydb.h" -static void -print_sexp (KsbaConstSexp p) +/* print the first element of an S-Expression */ +void +gpgsm_dump_serial (KsbaConstSexp p) { unsigned long n; KsbaConstSexp endp; if (!p) log_printf ("none"); + else if (*p != '(') + log_printf ("ERROR - not an S-expression"); else { + p++; n = strtoul (p, (char**)&endp, 10); p = endp; if (*p!=':') - log_printf ("ERROR - invalid value"); + log_printf ("ERROR - invalid S-expression"); else { for (p++; n; n--, p++) @@ -57,8 +61,8 @@ print_sexp (KsbaConstSexp p) -static void -print_time (time_t t) +void +gpgsm_dump_time (time_t t) { if (!t) @@ -77,6 +81,7 @@ print_time (time_t t) } } + static void print_dn (char *p) { @@ -100,17 +105,17 @@ gpgsm_dump_cert (const char *text, KsbaCert cert) { sexp = ksba_cert_get_serial (cert); log_debug (" serial: "); - print_sexp (sexp); + gpgsm_dump_serial (sexp); ksba_free (sexp); log_printf ("\n"); t = ksba_cert_get_validity (cert, 0); log_debug (" notBefore: "); - print_time (t); + gpgsm_dump_time (t); log_printf ("\n"); t = ksba_cert_get_validity (cert, 1); log_debug (" notAfter: "); - print_time (t); + gpgsm_dump_time (t); log_printf ("\n"); dn = ksba_cert_get_issuer (cert, 0); @@ -133,3 +138,5 @@ gpgsm_dump_cert (const char *text, KsbaCert cert) } log_debug ("END Certificate\n"); } + + diff --git a/sm/decrypt.c b/sm/decrypt.c index 7237fef7c..3068262d7 100644 --- a/sm/decrypt.c +++ b/sm/decrypt.c @@ -50,27 +50,6 @@ struct decrypt_filter_parm_s { }; -static void -print_integer_sexp (unsigned char *p) -{ - unsigned long len; - - if (!p) - log_printf ("none"); - else - { - len = gcry_sexp_canon_len (p, 0, NULL, NULL); - if (!len) - log_printf ("invalid encoding"); - else - { - for (; len && *p != ':'; len--, p++) - ; - for (p++; len; len--, p++) - log_printf ("%02X", *p); - } - } -} /* decrypt the session key and fill in the parm structure. The algo and the IV is expected to be already in PARM. */ @@ -370,7 +349,7 @@ gpgsm_decrypt (CTRL ctrl, int in_fd, FILE *out_fp) log_debug ("recp %d - issuer: `%s'\n", recp, issuer? issuer:"[NONE]"); log_debug ("recp %d - serial: ", recp); - print_integer_sexp (serial); + gpgsm_dump_serial (serial); log_printf ("\n"); keydb_search_reset (kh); diff --git a/sm/gpgsm.h b/sm/gpgsm.h index 44f6b3fb8..8717b2cad 100644 --- a/sm/gpgsm.h +++ b/sm/gpgsm.h @@ -138,6 +138,8 @@ void gpgsm_destroy_writer (Base64Context ctx); /*-- certdump.c --*/ void gpgsm_dump_cert (const char *text, KsbaCert cert); +void gpgsm_dump_serial (KsbaConstSexp p); +void gpgsm_dump_time (time_t t); /*-- certcheck.c --*/ int gpgsm_check_cert_sig (KsbaCert issuer_cert, KsbaCert cert); diff --git a/sm/keydb.c b/sm/keydb.c index b80f42642..9a39b67fb 100644 --- a/sm/keydb.c +++ b/sm/keydb.c @@ -842,7 +842,11 @@ keydb_search_issuer_sn (KEYDB_HANDLE hd, memset (&desc, 0, sizeof desc); desc.mode = KEYDB_SEARCH_MODE_ISSUER_SN; - for (s=serial,desc.snlen = 0; digitp (s); s++) + s = serial; + if (*s !='(') + return GNUPG_Invalid_Value; + s++; + for (desc.snlen = 0; digitp (s); s++) desc.snlen = 10*desc.snlen + atoi_1 (s); if (*s !=':') return GNUPG_Invalid_Value; diff --git a/sm/keylist.c b/sm/keylist.c index 07844fed1..f4c90939f 100644 --- a/sm/keylist.c +++ b/sm/keylist.c @@ -150,11 +150,15 @@ list_cert_colon (KsbaCert cert, FILE *fp) int len; const unsigned char *s = sexp; - for (len=0; *s && *s != ':' && digitp (s); s++) - len = len*10 + atoi_1 (s); - if (*s == ':') - for (s++; len; len--, s++) - fprintf (fp,"%02X", *s); + if (*s == '(') + { + s++; + for (len=0; *s && *s != ':' && digitp (s); s++) + len = len*10 + atoi_1 (s); + if (*s == ':') + for (s++; len; len--, s++) + fprintf (fp,"%02X", *s); + } xfree (sexp); } putc (':', fp); diff --git a/sm/verify.c b/sm/verify.c index cb57682f1..b52b905fd 100644 --- a/sm/verify.c +++ b/sm/verify.c @@ -84,49 +84,6 @@ store_cert (KsbaCert cert) -static void -print_integer_sexp (unsigned char *p) -{ - unsigned long len; - - if (!p) - log_printf ("none"); - else - { - len = gcry_sexp_canon_len (p, 0, NULL, NULL); - if (!len) - log_printf ("invalid encoding"); - else - { - for (; len && *p != ':'; len--, p++) - ; - for (p++; len; len--, p++) - log_printf ("%02X", *p); - } - } -} - -static void -print_time (time_t t) -{ - - if (!t) - log_printf ("none"); - else if ( t == (time_t)(-1) ) - log_printf ("error"); - else - { - struct tm *tp; - - tp = gmtime (&t); - log_printf ("%04d-%02d-%02d %02d:%02d:%02d", - 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday, - tp->tm_hour, tp->tm_min, tp->tm_sec); - assert (!tp->tm_isdst); - } -} - - static void @@ -307,7 +264,7 @@ gpgsm_verify (CTRL ctrl, int in_fd, int data_fd) break; log_debug ("signer %d - issuer: `%s'\n", signer, issuer? issuer:"[NONE]"); log_debug ("signer %d - serial: ", signer); - print_integer_sexp (serial); + gpgsm_dump_serial (serial); log_printf ("\n"); err = ksba_cms_get_signing_time (cms, signer, &sigtime); @@ -317,7 +274,7 @@ gpgsm_verify (CTRL ctrl, int in_fd, int data_fd) sigtime = (time_t)-1; } log_debug ("signer %d - sigtime: ", signer); - print_time (sigtime); + gpgsm_dump_time (sigtime); log_printf ("\n"); @@ -341,7 +298,7 @@ gpgsm_verify (CTRL ctrl, int in_fd, int data_fd) log_error ("no signature value available\n"); goto next_signer; } - log_debug ("signer %d - signature: `%s'\n", signer, sigval); + log_debug ("signer %d - signature available", signer); /* Find the certificate of the signer */ keydb_search_reset (kh); |