diff options
author | Werner Koch <wk@gnupg.org> | 2006-12-21 20:40:00 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2006-12-21 20:40:00 +0100 |
commit | 12ca74c836ccacf79f2f193afac334377e41995e (patch) | |
tree | 3a70382f306fe0602b8c9acbd9e995336dc1f097 /g10/verify.c | |
parent | The keypad is now also used for OpenPGP signing keys. (diff) | |
download | gnupg2-12ca74c836ccacf79f2f193afac334377e41995e.tar.xz gnupg2-12ca74c836ccacf79f2f193afac334377e41995e.zip |
Started to code a --server mode.
It is far from being ready!
Diffstat (limited to 'g10/verify.c')
-rw-r--r-- | g10/verify.c | 83 |
1 files changed, 69 insertions, 14 deletions
diff --git a/g10/verify.c b/g10/verify.c index 5145525f5..e8f5891a4 100644 --- a/g10/verify.c +++ b/g10/verify.c @@ -55,15 +55,13 @@ int verify_signatures( int nfiles, char **files ) { IOBUF fp; - armor_filter_context_t *afx; - progress_filter_context_t *pfx; + armor_filter_context_t *afx = NULL; + progress_filter_context_t *pfx = new_progress_context (); const char *sigfile; int i, rc; strlist_t sl; - pfx = new_progress_context (); - afx = new_armor_context (); - /* decide whether we should handle a detached or a normal signature, + /* Decide whether we should handle a detached or a normal signature, * which is needed so that the code later can hash the correct data and * not have a normal signature act as detached signature and ignoring the * indended signed material from the 2nd file or stdin. @@ -72,7 +70,7 @@ verify_signatures( int nfiles, char **files ) * 3. gpg file <file2 - detached * 4. gpg file file2 - detached * The question is how decide between case 2 and 3? The only way - * we can do it is by reading one byte from stdin and the unget + * we can do it is by reading one byte from stdin and then unget * it; the problem here is that we may be reading from the * terminal (which could be detected using isatty() but won't work * when under contol of a pty using program (e.g. expect)) and @@ -87,7 +85,6 @@ verify_signatures( int nfiles, char **files ) * that all quite easily in mainproc.c */ - sigfile = nfiles? *files : NULL; /* open the signature file */ @@ -102,13 +99,15 @@ verify_signatures( int nfiles, char **files ) rc = gpg_error_from_syserror (); log_error(_("can't open `%s': %s\n"), print_fname_stdin(sigfile), strerror (errno)); - release_progress_context (pfx); - return rc; + goto leave; } handle_progress (pfx, fp, sigfile); - if( !opt.no_armor && use_armor_filter( fp ) ) + if ( !opt.no_armor && use_armor_filter( fp ) ) + { + afx = new_armor_context (); push_armor_filter (afx, fp); + } sl = NULL; for(i=nfiles-1 ; i > 0 ; i-- ) @@ -123,12 +122,14 @@ verify_signatures( int nfiles, char **files ) rc = 0; } + leave: release_armor_context (afx); release_progress_context (pfx); return rc; } + void print_file_status( int status, const char *name, int what ) { @@ -144,10 +145,9 @@ verify_one_file( const char *name ) { IOBUF fp; armor_filter_context_t *afx = NULL; - progress_filter_context_t *pfx; + progress_filter_context_t *pfx = new_progress_context (); int rc; - pfx = new_progress_context (); print_file_status( STATUS_FILE_START, name, 1 ); fp = iobuf_open(name); if (fp) @@ -163,8 +163,7 @@ verify_one_file( const char *name ) log_error(_("can't open `%s': %s\n"), print_fname_stdin(name), strerror (errno)); print_file_status( STATUS_FILE_ERROR, name, 1 ); - release_progress_context (pfx); - return rc; + goto leave; } handle_progress (pfx, fp, name); @@ -178,6 +177,8 @@ verify_one_file( const char *name ) rc = proc_signature_packets( NULL, fp, NULL, name ); iobuf_close(fp); write_status( STATUS_FILE_DONE ); + + leave: release_armor_context (afx); release_progress_context (pfx); return rc; @@ -217,3 +218,57 @@ verify_files( int nfiles, char **files ) } return 0; } + + + + +/* Perform a verify operation. To verify detached signatures, DATA_FD + shall be the descriptor of the signed data; for regular signatures + it needs to be -1. If OUT_FP is not NULL and DATA_FD is not -1 the + the signed material gets written that stream. + + FIXME: OUTFP is not yet implemented. +*/ +int +gpg_verify (ctrl_t ctrl, int sig_fd, int data_fd, FILE *out_fp) +{ + int rc; + iobuf_t fp; + armor_filter_context_t *afx = NULL; + progress_filter_context_t *pfx = new_progress_context (); + + fp = iobuf_fdopen (sig_fd, "rb"); + if (fp && is_secured_file (sig_fd)) + { + fp = NULL; + errno = EPERM; + } + if ( !fp ) + { + rc = gpg_error_from_syserror (); + log_error (_("can't open fd %d: %s\n"), sig_fd, strerror (errno)); + goto leave; + } + + handle_progress (pfx, fp, NULL); + + if ( !opt.no_armor && use_armor_filter (fp) ) + { + afx = new_armor_context (); + push_armor_filter (afx, fp); + } + + rc = proc_signature_packets_by_fd ( NULL, fp, data_fd ); + + if ( afx && afx->no_openpgp_data + && (rc == -1 || gpg_err_code (rc) == GPG_ERR_EOF) ) + rc = gpg_error (GPG_ERR_NO_DATA); + + leave: + if (fp) + iobuf_close (fp); + release_progress_context (pfx); + release_armor_context (afx); + return rc; +} + |