diff options
author | Werner Koch <[email protected]> | 1998-06-13 06:59:14 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 1998-06-13 06:59:14 +0000 |
commit | 37d2adfe61d9671086fa701b779c3b47895afe4c (patch) | |
tree | 3af3791cb54dbd56687ee09e6a2666fabdecdc15 /g10/sign.c | |
parent | . (diff) | |
download | gnupg-37d2adfe61d9671086fa701b779c3b47895afe4c.tar.gz gnupg-37d2adfe61d9671086fa701b779c3b47895afe4c.zip |
a whole bunch of internal cleanups
Diffstat (limited to '')
-rw-r--r-- | g10/sign.c | 109 |
1 files changed, 63 insertions, 46 deletions
diff --git a/g10/sign.c b/g10/sign.c index bd435a7c9..a85f1f952 100644 --- a/g10/sign.c +++ b/g10/sign.c @@ -38,22 +38,53 @@ #include "i18n.h" +static int +do_sign( PKT_secret_cert *skc, PKT_signature *sig, + MD_HANDLE md, int digest_algo ) +{ + MPI frame; + byte *dp; + int rc; + + if( !digest_algo ) + digest_algo = md_get_algo(md); + + dp = md_read( md, digest_algo ); + sig->digest_algo = digest_algo; + sig->digest_start[0] = dp[0]; + sig->digest_start[1] = dp[1]; + if( skc->pubkey_algo == PUBKEY_ALGO_DSA ) { + frame = mpi_alloc( (md_digest_length(digest_algo)+BYTES_PER_MPI_LIMB-1) + / BYTES_PER_MPI_LIMB ); + mpi_set_buffer( frame, md_read(md, digest_algo), + md_digest_length(digest_algo), 0 ); + } + else + frame = encode_md_value( md, digest_algo, mpi_get_nbits(skc->skey[0])); + rc = pubkey_sign( skc->pubkey_algo, sig->data, frame, skc->skey ); + mpi_free(frame); + if( rc ) + log_error("pubkey_sign failed: %s\n", g10_errstr(rc) ); + else { + if( opt.verbose ) { + char *ustr = get_user_id_string( sig->keyid ); + log_info("%s signature from: %s\n", + pubkey_algo_to_string(skc->pubkey_algo), ustr ); + m_free(ustr); + } + } + return rc; +} + + int complete_sig( PKT_signature *sig, PKT_secret_cert *skc, MD_HANDLE md ) { int rc=0; - if( (rc=check_secret_key( skc )) ) - ; - else if( is_ELGAMAL(sig->pubkey_algo) ) - g10_elg_sign( skc, sig, md, 0 ); - else if( sig->pubkey_algo == PUBKEY_ALGO_DSA ) - g10_dsa_sign( skc, sig, md, 0 ); - else if( is_RSA(sig->pubkey_algo) ) - g10_rsa_sign( skc, sig, md, 0 ); - else - BUG(); + if( !(rc=check_secret_key( skc )) ) + rc = do_sign( skc, sig, md, 0 ); /* fixme: should we check whether the signature is okay? * maybe by using an option */ @@ -334,27 +365,20 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr, } md_final( md ); - if( is_ELGAMAL(sig->pubkey_algo) ) - g10_elg_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); - else if( sig->pubkey_algo == PUBKEY_ALGO_DSA ) - g10_dsa_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); - else if( is_RSA(sig->pubkey_algo) ) - g10_rsa_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); - else - BUG(); - + rc = do_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); md_close( md ); - /* and write it */ - init_packet(&pkt); - pkt.pkttype = PKT_SIGNATURE; - pkt.pkt.signature = sig; - rc = build_packet( out, &pkt ); - free_packet( &pkt ); - if( rc ) { - log_error("build signature packet failed: %s\n", g10_errstr(rc) ); - goto leave; + if( !rc ) { /* and write it */ + init_packet(&pkt); + pkt.pkttype = PKT_SIGNATURE; + pkt.pkt.signature = sig; + rc = build_packet( out, &pkt ); + free_packet( &pkt ); + if( rc ) + log_error("build signature packet failed: %s\n", g10_errstr(rc) ); } + if( rc ) + goto leave; } @@ -538,27 +562,20 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile ) } md_final( md ); - if( is_ELGAMAL(sig->pubkey_algo) ) - g10_elg_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); - else if( sig->pubkey_algo == PUBKEY_ALGO_DSA ) - g10_dsa_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); - else if( is_RSA(sig->pubkey_algo) ) - g10_rsa_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); - else - BUG(); - + rc = do_sign( skc, sig, md, hash_for(sig->pubkey_algo) ); md_close( md ); - /* and write it */ - init_packet(&pkt); - pkt.pkttype = PKT_SIGNATURE; - pkt.pkt.signature = sig; - rc = build_packet( out, &pkt ); - free_packet( &pkt ); - if( rc ) { - log_error("build signature packet failed: %s\n", g10_errstr(rc) ); - goto leave; + if( !rc ) { /* and write it */ + init_packet(&pkt); + pkt.pkttype = PKT_SIGNATURE; + pkt.pkt.signature = sig; + rc = build_packet( out, &pkt ); + free_packet( &pkt ); + if( rc ) + log_error("build signature packet failed: %s\n", g10_errstr(rc) ); } + if( rc ) + goto leave; } |