diff options
Diffstat (limited to 'g10')
-rw-r--r-- | g10/ChangeLog | 20 | ||||
-rw-r--r-- | g10/armor.c | 2 | ||||
-rw-r--r-- | g10/g10.c | 9 | ||||
-rw-r--r-- | g10/g10maint.c | 9 | ||||
-rw-r--r-- | g10/mainproc.c | 31 | ||||
-rw-r--r-- | g10/ringedit.c | 31 | ||||
-rw-r--r-- | g10/sig-check.c | 4 | ||||
-rw-r--r-- | g10/sign.c | 45 |
8 files changed, 111 insertions, 40 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog index d558e148a..56c825119 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,23 @@ +Fri Feb 27 18:14:03 1998 Werner Koch ([email protected]) + + * armor.c (find_header): Removed trailing CR on headers. + +Fri Feb 27 18:02:48 1998 Werner Koch ([email protected]) + + * ringedit.c (keyring_search) [MINGW32]: Open and close file here + because rename does not work on open files. Chnaged callers. + +Fri Feb 27 16:43:11 1998 Werner Koch ([email protected]) + + * sig-check.c (do_check): Add an md_enable. + * mainproc.c (do_check_sig): Use md_open in case of detached sig + (proc_tree): Take detached sigs into account. + +Fri Feb 27 15:22:46 1998 Werner Koch ([email protected]) + + * g10.c (main): Make use of GNUPGHOME envvar. + * g10main.c (main): Ditto. + Wed Feb 25 11:40:04 1998 Werner Koch ([email protected]) * plaintext.c (ask_for_detached_datafile): add opt.verbose to diff --git a/g10/armor.c b/g10/armor.c index 80de65551..142e0bd82 100644 --- a/g10/armor.c +++ b/g10/armor.c @@ -318,6 +318,8 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen, if( n < buflen || c == '\n' ) { if( n && buf[0] != '\r') { /* maybe a header */ if( strchr( buf, ':') ) { /* yes */ + if( buf[n-1] == '\r' ) + buf[--n] = 0; if( opt.verbose ) { log_info("armor header: "); print_string( stderr, buf, n ); @@ -326,7 +326,14 @@ main( int argc, char **argv ) opt.def_digest_algo = DIGEST_ALGO_RMD160; opt.completes_needed = 1; opt.marginals_needed = 3; - opt.homedir = "~/.gnupg"; + opt.homedir = getenv("GNUPGHOME"); + if( !opt.homedir || !*opt.homedir ) { + #ifdef __MINGW32__ + opt.homedir = "c:/gnupg"; + #else + opt.homedir = "~/.gnupg"; + #endif + } /* check wether we have a config file on the commandline */ orig_argc = argc; diff --git a/g10/g10maint.c b/g10/g10maint.c index ed0f90e56..b35106c0d 100644 --- a/g10/g10maint.c +++ b/g10/g10maint.c @@ -258,7 +258,14 @@ main( int argc, char **argv ) opt.def_digest_algo = DIGEST_ALGO_RMD160; opt.completes_needed = 1; opt.marginals_needed = 3; - opt.homedir = "~/.gnupg"; + opt.homedir = getenv("GNUPGHOME"); + if( !opt.homedir || !*opt.homedir ) { + #ifdef __MINGW32__ + opt.homedir = "c:/gnupg"; + #else + opt.homedir = "~/.gnupg"; + #endif + } /* check wether we have a config file on the commandline */ orig_argc = argc; diff --git a/g10/mainproc.c b/g10/mainproc.c index e2c0b703d..153496f60 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -272,12 +272,18 @@ do_check_sig( CTX c, KBNODE node ) return rc; if( sig->sig_class == 0x00 ) { - md = md_copy( c->mfx.md ); + if( c->mfx.md ) + md = md_copy( c->mfx.md ); + else /* detached signature */ + md = md_open( 0, 0 ); /* signature_check() will enable the md*/ } else if( sig->sig_class == 0x01 ) { /* how do we know that we have to hash the (already hashed) text * in canonical mode ??? (calculating both modes???) */ - md = md_copy( c->mfx.md ); + if( c->mfx.md ) + md = md_copy( c->mfx.md ); + else /* detached signature */ + md = md_open( 0, 0 ); /* signature_check() will enable the md*/ } else if( (sig->sig_class&~3) == 0x10 || sig->sig_class == 0x20 @@ -620,19 +626,18 @@ proc_tree( CTX c, KBNODE node ) else if( node->pkt->pkttype == PKT_SIGNATURE ) { PKT_signature *sig = node->pkt->pkt.signature; - if( !c->have_data && (sig->sig_class&~3) == 0x10 ) { - log_info("old style signature\n"); - if( !c->have_data ) { - free_md_filter_context( &c->mfx ); - c->mfx.md = md_open(digest_algo_from_sig(sig), 0); - rc = ask_for_detached_datafile( &c->mfx, - iobuf_get_fname(c->iobuf)); - if( rc ) { - log_error("can't hash datafile: %s\n", g10_errstr(rc)); - return; - } + if( !c->have_data ) { + free_md_filter_context( &c->mfx ); + c->mfx.md = md_open(digest_algo_from_sig(sig), 0); + rc = ask_for_detached_datafile( &c->mfx, + iobuf_get_fname(c->iobuf)); + if( rc ) { + log_error("can't hash datafile: %s\n", g10_errstr(rc)); + return; } } + else + log_info("old style signature\n"); check_sig_and_print( c, node ); } diff --git a/g10/ringedit.c b/g10/ringedit.c index b5d6ec8b1..ba71f0e67 100644 --- a/g10/ringedit.c +++ b/g10/ringedit.c @@ -73,7 +73,8 @@ static RESTBL resource_table[MAX_RESOURCES]; static int search( PACKET *pkt, KBPOS *kbpos, int secret ); -static int keyring_search( PACKET *pkt, KBPOS *kbpos, IOBUF iobuf ); +static int keyring_search( PACKET *pkt, KBPOS *kbpos, IOBUF iobuf, + const char *fname ); static int keyring_search2( PUBKEY_FIND_INFO info, KBPOS *kbpos, const char *fname); static int keyring_read( KBPOS *kbpos, KBNODE *ret_root ); @@ -113,9 +114,13 @@ add_keyblock_resource( const char *filename, int force, int secret ) if( i == MAX_RESOURCES ) return G10ERR_RESOURCE_LIMIT; + #if __MINGW32__ + iobuf = NULL; + #else iobuf = iobuf_open( filename ); if( !iobuf && !force ) return G10ERR_OPEN_FILE; + #endif resource_table[i].used = 1; resource_table[i].secret = !!secret; resource_table[i].fname = m_strdup(filename); @@ -211,7 +216,8 @@ search( PACKET *pkt, KBPOS *kbpos, int secret ) if( resource_table[i].used && !resource_table[i].secret == !secret ) { /* note: here we have to add different search functions, * depending on the type of the resource */ - rc = keyring_search( pkt, kbpos, resource_table[i].iobuf ); + rc = keyring_search( pkt, kbpos, resource_table[i].iobuf, + resource_table[i].fname ); if( !rc ) { kbpos->resno = i; kbpos->fp = NULL; @@ -469,7 +475,7 @@ update_keyblock( KBPOS *kbpos, KBNODE root ) * search one keyring, return 0 if found, -1 if not found or an errorcode. */ static int -keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf ) +keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf, const char *fname ) { int rc; PACKET pkt; @@ -482,11 +488,21 @@ keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf ) init_packet(&pkt); save_mode = set_packet_list_mode(0); + #if __MINGW32__ + assert(!iobuf); + iobuf = iobuf_open( fname ); + if( !iobuf ) { + log_error("%s: can't open keyring file\n", fname); + rc = G10ERR_KEYRING_OPEN; + goto leave; + } + #else if( iobuf_seek( iobuf, 0 ) ) { log_error("can't rewind keyring file\n"); rc = G10ERR_KEYRING_OPEN; goto leave; } + #endif while( !(rc=search_packet(iobuf, &pkt, pkttype, &offset)) ) { if( pkt.pkttype == PKT_SECRET_CERT ) { @@ -539,6 +555,9 @@ keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf ) leave: free_packet(&pkt); set_packet_list_mode(save_mode); + #if __MINGW32__ + iobuf_close(iobuf); + #endif return rc; } @@ -872,7 +891,11 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) } /* close both files */ - iobuf_close(fp); + if( iobuf_close(fp) ) { + log_error("%s: close failed: %s\n", rentry->fname, strerror(errno) ); + rc = G10ERR_CLOSE_FILE; + goto leave; + } if( iobuf_close(newfp) ) { log_error("%s: close failed: %s\n", tmpfname, strerror(errno) ); rc = G10ERR_CLOSE_FILE; diff --git a/g10/sig-check.c b/g10/sig-check.c index 299fedc83..32371b359 100644 --- a/g10/sig-check.c +++ b/g10/sig-check.c @@ -68,6 +68,9 @@ do_check( PKT_public_cert *pkc, PKT_signature *sig, MD_HANDLE digest ) if( (rc=check_digest_algo(sig->d.elg.digest_algo)) ) goto leave; + /* make sure the digest algo is enabled (in case of a detached + * signature */ + md_enable( digest, sig->d.elg.digest_algo ); /* complete the digest */ md_putc( digest, sig->sig_class ); { u32 a = sig->timestamp; @@ -124,6 +127,7 @@ do_check( PKT_public_cert *pkc, PKT_signature *sig, MD_HANDLE digest ) if( (rc=check_digest_algo(sig->d.rsa.digest_algo)) ) goto leave; /* unsupported algo */ + md_enable( digest, sig->d.rsa.digest_algo ); asn = md_asn_oid( sig->d.rsa.digest_algo, &asnlen, &mdlen ); for(i=mdlen,j=asnlen-1; (c=mpi_getbyte(result, i)) != -1 && j >= 0; diff --git a/g10/sign.c b/g10/sign.c index a3ad4ba80..e3af619e2 100644 --- a/g10/sign.c +++ b/g10/sign.c @@ -163,27 +163,30 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, iobuf_push_filter( out, encrypt_filter, &efx ); } - /* loop over the secret certificates and build headers */ - for( skc_rover = skc_list; skc_rover; skc_rover = skc_rover->next ) { - PKT_secret_cert *skc; - PKT_onepass_sig *ops; - - skc = skc_rover->skc; - ops = m_alloc_clear( sizeof *ops ); - ops->sig_class = opt.textmode && !outfile ? 0x01 : 0x00; - ops->digest_algo = DIGEST_ALGO_RMD160; - ops->pubkey_algo = skc->pubkey_algo; - keyid_from_skc( skc, ops->keyid ); - ops->last = !skc_rover->next; - - init_packet(&pkt); - pkt.pkttype = PKT_ONEPASS_SIG; - pkt.pkt.onepass_sig = ops; - rc = build_packet( out, &pkt ); - free_packet( &pkt ); - if( rc ) { - log_error("build onepass_sig packet failed: %s\n", g10_errstr(rc)); - goto leave; + if( !detached ) { + /* loop over the secret certificates and build headers */ + for( skc_rover = skc_list; skc_rover; skc_rover = skc_rover->next ) { + PKT_secret_cert *skc; + PKT_onepass_sig *ops; + + skc = skc_rover->skc; + ops = m_alloc_clear( sizeof *ops ); + ops->sig_class = opt.textmode && !outfile ? 0x01 : 0x00; + ops->digest_algo = DIGEST_ALGO_RMD160; + ops->pubkey_algo = skc->pubkey_algo; + keyid_from_skc( skc, ops->keyid ); + ops->last = !skc_rover->next; + + init_packet(&pkt); + pkt.pkttype = PKT_ONEPASS_SIG; + pkt.pkt.onepass_sig = ops; + rc = build_packet( out, &pkt ); + free_packet( &pkt ); + if( rc ) { + log_error("build onepass_sig packet failed: %s\n", + g10_errstr(rc)); + goto leave; + } } } |