* server.c (skip_options): Skip leading spaces.
(has_option): Honor "--".
(cmd_export): Add option --data to do an inline export.  Skip all
options.

* certdump.c (gpgsm_fpr_and_name_for_status): New.
* verify.c (gpgsm_verify): Use it to print correct status messages.

doc/
* gpgsm.texi (GPGSM EXPORT): Document changes.
This commit is contained in:
Werner Koch 2006-11-14 10:23:21 +00:00
parent f48d38e7df
commit 650293c4f6
12 changed files with 1387 additions and 1707 deletions

View File

@ -153,7 +153,7 @@ has_option_name (const char *line, const char *name)
/* Skip over options. It is assumed that leading spaces have been
removed (this is the case for lines passed to a handler from
assuan). Bkanls after the options are also removed. */
assuan). Blanks after the options are also removed. */
static char *
skip_options (char *line)
{

View File

@ -1,3 +1,7 @@
2006-11-14 Werner Koch <wk@g10code.com>
* gpgsm.texi (GPGSM EXPORT): Document changes.
2006-11-11 Werner Koch <wk@g10code.com>
* gnupg.texi (Top): Move gpg-agent part before gpg.

View File

@ -199,48 +199,62 @@ more arguments in future versions.
is useful to define a context for parsing ERROR status
messages. No arguments are currently defined.
GOODSIG <long keyid> <username>
GOODSIG <long_keyid_or_fpr> <username>
The signature with the keyid is good. For each signature only
one of the three codes GOODSIG, BADSIG or ERRSIG will be
emitted and they may be used as a marker for a new signature.
The username is the primary one encoded in UTF-8 and %XX
escaped.
escaped. The fingerprint may be used instead of the long keyid
if it is available. This is the case with CMS and might
eventually also be available for OpenPGP.
EXPSIG <long keyid> <username>
EXPSIG <long_keyid_or_fpr> <username>
The signature with the keyid is good, but the signature is
expired. The username is the primary one encoded in UTF-8 and
%XX escaped.
%XX escaped. The fingerprint may be used instead of the long
keyid if it is available. This is the case with CMS and might
eventually also be available for OpenPGP.
EXPKEYSIG <long keyid> <username>
The signature with the keyid is good, but the signature was
EXPKEYSIG <long_keyid_or_fpr> <username>
The signature with the keyid is good, but the signature was
made by an expired key. The username is the primary one
encoded in UTF-8 and %XX escaped.
encoded in UTF-8 and %XX escaped. The fingerprint may be used
instead of the long keyid if it is available. This is the
case with CMS and might eventually also be available for
OpenPGP.
REVKEYSIG <long keyid> <username>
REVKEYSIG <long_keyid_or_fpr> <username>
The signature with the keyid is good, but the signature was
made by a revoked key. The username is the primary one
encoded in UTF-8 and %XX escaped.
made by a revoked key. The username is the primary one encoded
in UTF-8 and %XX escaped. The fingerprint may be used instead
of the long keyid if it is available. This is the case with
CMS and might eventually also be available for OpenPGP.
BADSIG <long keyid> <username>
The signature with the keyid has not been verified okay.
The username is the primary one encoded in UTF-8 and %XX
escaped.
BADSIG <long_keyid_or_fpr> <username>
The signature with the keyid has not been verified okay. The
username is the primary one encoded in UTF-8 and %XX
escaped. The fingerprint may be used instead of the long keyid
if it is available. This is the case with CMS and might
eventually also be available for OpenPGP.
ERRSIG <long keyid> <pubkey_algo> <hash_algo> \
ERRSIG <long_keyid_or_fpr> <pubkey_algo> <hash_algo> \
<sig_class> <timestamp> <rc>
It was not possible to check the signature. This may be
caused by a missing public key or an unsupported algorithm.
A RC of 4 indicates unknown algorithm, a 9 indicates a missing
public key. The other fields give more information about
this signature. sig_class is a 2 byte hex-value.
caused by a missing public key or an unsupported algorithm. A
RC of 4 indicates unknown algorithm, a 9 indicates a missing
public key. The other fields give more information about this
signature. sig_class is a 2 byte hex-value. The fingerprint
may be used instead of the long keyid if it is available.
This is the case with CMS and might eventually also be
available for OpenPGP.
Note, that TIMESTAMP may either be a number with seconds since
epoch or an ISO 8601 string which can be detected by the
presence of the letter 'T' inside.
VALIDSIG <fingerprint in hex> <sig_creation_date> <sig-timestamp>
<expire-timestamp> <sig-version> <reserved> <pubkey-algo>
<hash-algo> <sig-class> <primary-key-fpr>
<expire-timestamp> [ <sig-version> <reserved> <pubkey-algo>
<hash-algo> <sig-class> <primary-key-fpr> ]
The signature with the keyid is good. This is the same as
GOODSIG but has the fingerprint as the argument. Both status
@ -255,6 +269,9 @@ more arguments in future versions.
useful to get back to the primary key without running gpg
again for this purpose.
The optional parameters are used for OpenPGP and are not
available for CMS signatures.
Note, that *-TIMESTAMP may either be a number with seconds
since epoch or an ISO 8601 string which can be detected by the
presence of the letter 'T' inside.

188
doc/announce-2.0.txt Normal file
View File

@ -0,0 +1,188 @@
Hello!
The GNU project is pleased to announce the availability of a new
stable GnuPG release: Version 2.0.0.
The GNU Privacy Guard (GnuPG) is GNU's tool for secure communication
and data storage. It can be used to encrypt data, create digital
signatures, help authenticating using Secure Shell and to provide a
framework for public key cryptography. It includes an advanced key
management facility and is compliant with the OpenPGP and S/MIME
standards.
GnuPG-2 has a different architecture than GnuPG-1 (e.g. 1.4.5) in that
it splits up functionality into several modules. However, both
versions may be installed alongside without any conflict. In fact,
the gpg version from GnuPG-1 is able to make use of the gpg-agent as
included in GnuPG-2 and allows for seamless passphrase caching. The
advantage of GnuPG-1 is its smaller size and the lack of dependency on
other modules at run and build time. We will keep maintaining GnuPG-1
versions because they are very useful for small systems and for server
based applications requiring only OpenPGP support.
GnuPG is distributed under the terms of the GNU General Public License
(GPL). GnuPG-2 works best on GNU/Linux or *BSD systems. Other POSIX
compliant systems are also supported but have not yet been tested very
well.
What's New in GnuPG-2
=====================
* The *gpg-agent* is the central place to maintain private keys and
to cache passphrases. It is implemented as a daemon to be started
with a user session.
* *gpgsm* is an implementation of the X.509 and CMS standards and
provides the cryptographic core to implement the S/MIME protocol.
The command line interface is very similar to the one of gpg. This
helps adding S/MIME to application currently providing OpenPGP
support.
* *scdaemon* is a daemon run by gpg-agent to access different types
of smart cards using a unified interface.
* *gpg-connect-agent* is a tool to help scripts directly accessing
services of gpg-agent and scdaemon.
* *gpgconf* is a tool to maintain the configuration files of all
modules using a well defined API.
* Support for Dirmngr, a separate package to maintain certificate
revocation lists, do OCSP requests and to run LDAP queries.
* Support for the Secure Shell Agent protocol. In fact, gpg-agent
may be used as full replacement of the commonly used ssh-agent
daemon.
* Smart card support for the Secure Shell.
* Documentation is now done in Texinfo. Thus besides Info, HTML and
PDF versions may easily be generated.
* Man pages for all tools.
Getting the Software
====================
Please follow the instructions found at http://www.gnupg.org/download/
or read on:
GnuPG 2.0.0 may be downloaded from one of the GnuPG mirror sites or
direct from ftp://ftp.gnupg.org/gcrypt/ . The list of mirrors can be
found at http://www.gnupg.org/mirrors.html . Note, that GnuPG is not
available at ftp.gnu.org.
On the mirrors you should find the following files in the *gnupg*
directory:
gnupg-2.0.0.tar.bz2 (3.8M)
gnupg-2.0.0.tar.bz2.sig
GnuPG source compressed using BZIP2 and OpenPGP signature.
Please try another mirror if exceptional your mirror is not yet up to
date. GnuPG-2 requires a couple of libraries to be installed; see the
README file or the output of the configure run for details.
Checking the Integrity
======================
In order to check that the version of GnuPG which you are going to
install is an original and unmodified one, you can do it in one of
the following ways:
* If you already have a trusted version of GnuPG installed, you
can simply check the supplied signature. For example to check the
signature of the file gnupg-2.0.0.tar.bz2 you would use this command:
gpg --verify gnupg-2.0.0.tar.bz2.sig
This checks whether the signature file matches the source file.
You should see a message indicating that the signature is good and
made by that signing key. Make sure that you have the right key,
either by checking the fingerprint of that key with other sources
or by checking that the key has been signed by a trustworthy other
key. Note, that you can retrieve the signing key using the command
finger wk ,at' g10code.com
or using a key server like
gpg --recv-key 1CE0C630
The distribution key 1CE0C630 is signed by the well known key
5B0358A2. If you get an key expired message, you should retrieve a
fresh copy as the expiration date might have been prolonged.
NEVER USE A GNUPG VERSION YOU JUST DOWNLOADED TO CHECK THE
INTEGRITY OF THE SOURCE - USE AN EXISTING GNUPG INSTALLATION!
* If you are not able to use an existing version of GnuPG, you have
to verify the SHA-1 checksum. Assuming you downloaded the file
gnupg-2.0.0.tar.bz2, you would run the sha1sum command like this:
sha1sum gnupg-2.0.0.tar.bz2
and check that the output matches this:
c335957368ea88bcb658922e7d3aae7e3ac6896d gnupg-2.0.0.tar.bz2
Internationalization
====================
GnuPG comes with support for 27 languages. Due to a lot of new and
changed strings most translations are not entirely complete. However
the Turkish and German translators have been very fast in completing
their translations. The Russian one came in just a few hours too
late. Updates of the other translations are expected for the next
releases.
Documentation
=============
We are currently working on an installation guide to explain in more
detail how to configure the new features. As of now the chapters on
gpg-agent and gpgsm include brief information on how to set up the
whole thing. Please watch the GnuPG website for updates of the
documentation. In the meantime you may search the GnuPG mailing list
archives or ask on the gnupg-users mailing lists for advise on how to
solve problems. Many of the new features are around for several years
and thus enough public knowledge is already available.
Support
=======
Improving GnuPG is costly, but you can help! We are looking for
organizations that find GnuPG useful and wish to contribute back. You
can contribute by reporting bugs, improve the software, or by donating
money.
Commercial support contracts for GnuPG are available, and they help
finance continued maintenance. g10 Code GmbH, a Duesseldorf based
company owned and headed by GnuPG's principal author, is currently
funding GnuPG development. We are always looking for interesting
development projects.
A service directory is available at:
http://www.gnupg.org/service.html
Thanks
======
We have to thank all the people who helped with this release, be it
testing, coding, translating, suggesting, auditing, administering the
servers, spreading the word or answering questions on the mailing
lists.
Happy Hacking,
The GnuPG Team (David, Werner and all other contributors)

View File

@ -1072,16 +1072,22 @@ Note that options are valid for the entire session.
To export certificate from the internal key database the command:
@example
EXPORT @var{pattern}
EXPORT [--data [--armor] [--base64]] [--] @var{pattern}
@end example
is used. To allow multiple patterns (which are ORed) quoting is
required: Spaces are to be translated into "+" or into "%20"; in turn
this requires that the usual escape quoting rules are done.
The format of the output depends on what was set with the OUTPUT
command. When using @acronym{PEM} encoding a few informational lines
are prepended.
If the @option{--data} option has not been given, the format of the
output depends on what was set with the OUTPUT command. When using
@acronym{PEM} encoding a few informational lines are prepended.
If the @option{--data} has been given, a target set via OUTPUT is
ignored and the data is returned inline using standard
@code{D}-lines. This avoids the need for an extra file descriptor. In
this case the options @option{--armor} and @option{--base64} may be used
in the same way as with the OUTPUT command.
@node GPGSM IMPORT

View File

@ -1,3 +1,7 @@
2006-11-13 Werner Koch <wk@g10code.com>
* ru.po: Update from Maxim.
2006-11-10 Werner Koch <wk@g10code.com>
* de.po: Received complete update from Walter.

2592
po/ru.po

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,17 @@
2006-11-14 Werner Koch <wk@g10code.com>
* server.c (skip_options): Skip leading spaces.
(has_option): Honor "--".
(cmd_export): Add option --data to do an inline export. Skip all
options.
* certdump.c (gpgsm_fpr_and_name_for_status): New.
* verify.c (gpgsm_verify): Use it to print correct status messages.
2006-11-11 Werner Koch <wk@g10code.com>
* server.c (skip_options): New.
2006-10-24 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (AM_CFLAGS): Add $(LIBASSUAN_CFLAGS).

View File

@ -705,6 +705,59 @@ gpgsm_format_name (const char *name)
}
/* Return fingerprint and a percent escaped name in a human readable
format suitable for status messages like GOODSIG. May return NULL
on error (out of core). */
char *
gpgsm_fpr_and_name_for_status (ksba_cert_t cert)
{
char *fpr, *name, *p;
char *buffer;
fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
if (!fpr)
return NULL;
name = ksba_cert_get_subject (cert, 0);
if (!name)
{
xfree (fpr);
return NULL;
}
p = gpgsm_format_name2 (name, 0);
ksba_free (name);
name = p;
if (!name)
{
xfree (fpr);
return NULL;
}
buffer = xtrymalloc (strlen (fpr) + 1 + 3*strlen (name) + 1);
if (buffer)
{
const unsigned char *s;
p = stpcpy (stpcpy (buffer, fpr), " ");
for (s = name; *s; s++)
{
if (*s < ' ')
{
sprintf (p, "%%%02X", *s);
p += 3;
}
else
*p++ = *s;
}
*p = 0;
}
xfree (fpr);
xfree (name);
return buffer;
}
/* Create a key description for the CERT, this may be passed to the
pinentry. The caller must free the returned string. NULL may be
returned on error. */
@ -800,3 +853,4 @@ gpgsm_format_keydesc (ksba_cert_t cert)
return buffer;
}

View File

@ -241,6 +241,8 @@ char *gpgsm_format_serial (ksba_const_sexp_t p);
char *gpgsm_format_name2 (const char *name, int translate);
char *gpgsm_format_name (const char *name);
char *gpgsm_fpr_and_name_for_status (ksba_cert_t cert);
char *gpgsm_format_keydesc (ksba_cert_t cert);

View File

@ -74,6 +74,22 @@ strcpy_escaped_plus (char *d, const char *s)
}
/* Skip over options.
Blanks after the options are also removed. */
static char *
skip_options (const char *line)
{
while (spacep (line))
line++;
while ( *line == '-' && line[1] == '-' )
{
while (*line && !spacep (line))
line++;
while (spacep (line))
line++;
}
return (char*)line;
}
/* Check whether the option NAME appears in LINE */
@ -84,6 +100,8 @@ has_option (const char *line, const char *name)
int n = strlen (name);
s = strstr (line, name);
if (s && s >= skip_options (line))
return 0;
return (s && (s == line || spacep (s-1)) && (!s[n] || spacep (s+n)));
}
@ -530,6 +548,10 @@ cmd_import (assuan_context_t ctx, char *line)
}
/* EXPORT [--data [--armor|--base64]] [--] pattern
*/
static int
cmd_export (assuan_context_t ctx, char *line)
{
@ -538,11 +560,20 @@ cmd_export (assuan_context_t ctx, char *line)
FILE *out_fp;
char *p;
strlist_t list, sl;
if (fd == -1)
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
int use_data;
/* break the line down into an strlist_t */
use_data = has_option (line, "--data");
if (use_data)
{
/* We need to override any possible setting done by an OUTPUT command. */
ctrl->create_pem = has_option (line, "--armor");
ctrl->create_base64 = has_option (line, "--base64");
}
line = skip_options (line);
/* Break the line down into an strlist_t. */
list = NULL;
for (p=line; *p; line = p)
{
@ -565,17 +596,36 @@ cmd_export (assuan_context_t ctx, char *line)
}
}
out_fp = fdopen ( dup(fd), "w");
if (!out_fp)
if (use_data)
{
free_strlist (list);
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
out_fp = assuan_get_data_fp (ctx);
if (!out_fp)
{
free_strlist (list);
return set_error (GPG_ERR_ASS_GENERAL, "no data stream");
}
gpgsm_export (ctrl, list, out_fp);
}
else
{
if (fd == -1)
{
free_strlist (list);
return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);
}
out_fp = fdopen ( dup(fd), "w");
if (!out_fp)
{
free_strlist (list);
return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed");
}
gpgsm_export (ctrl, list, out_fp);
fclose (out_fp);
}
gpgsm_export (ctrl, list, out_fp);
fclose (out_fp);
free_strlist (list);
/* close and reset the fd */
/* Close and reset the fds. */
close_message_fd (ctrl);
assuan_close_input_fd (ctx);
assuan_close_output_fd (ctx);
@ -1097,67 +1147,3 @@ gpgsm_status_with_err_code (ctrl_t ctrl, int no, const char *text,
return gpgsm_status2 (ctrl, no, buf, NULL);
}
#if 0
/*
* Write a status line with a buffer using %XX escapes. If WRAP is >
* 0 wrap the line after this length. If STRING is not NULL it will
* be prepended to the buffer, no escaping is done for string.
* A wrap of -1 forces spaces not to be encoded as %20.
*/
void
write_status_text_and_buffer ( int no, const char *string,
const char *buffer, size_t len, int wrap )
{
const char *s, *text;
int esc, first;
int lower_limit = ' ';
size_t n, count, dowrap;
if( !statusfp )
return; /* not enabled */
if (wrap == -1) {
lower_limit--;
wrap = 0;
}
text = get_status_string (no);
count = dowrap = first = 1;
do {
if (dowrap) {
fprintf (statusfp, "[GNUPG:] %s ", text );
count = dowrap = 0;
if (first && string) {
fputs (string, statusfp);
count += strlen (string);
}
first = 0;
}
for (esc=0, s=buffer, n=len; n && !esc; s++, n-- ) {
if ( *s == '%' || *(const byte*)s <= lower_limit
|| *(const byte*)s == 127 )
esc = 1;
if ( wrap && ++count > wrap ) {
dowrap=1;
break;
}
}
if (esc) {
s--; n++;
}
if (s != buffer)
fwrite (buffer, s-buffer, 1, statusfp );
if ( esc ) {
fprintf (statusfp, "%%%02X", *(const unsigned char*)s );
s++; n--;
}
buffer = s;
len = n;
if ( dowrap && len )
putc ( '\n', statusfp );
} while ( len );
putc ('\n',statusfp);
fflush (statusfp);
}
#endif

View File

@ -410,7 +410,7 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
log_error ("invalid signature: message digest attribute "
"does not match calculated one\n");
fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
fpr = gpgsm_fpr_and_name_for_status (cert);
gpgsm_status (ctrl, STATUS_BADSIG, fpr);
xfree (fpr);
goto next_signer;
@ -447,7 +447,7 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
char *fpr;
log_error ("invalid signature: %s\n", gpg_strerror (rc));
fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
fpr = gpgsm_fpr_and_name_for_status (cert);
gpgsm_status (ctrl, STATUS_BADSIG, fpr);
xfree (fpr);
goto next_signer;
@ -463,16 +463,19 @@ gpgsm_verify (ctrl_t ctrl, int in_fd, int data_fd, FILE *out_fp)
if (DBG_X509)
log_debug ("signature okay - checking certs\n");
rc = gpgsm_validate_chain (ctrl, cert, keyexptime, 0, NULL, 0);
if (gpg_err_code (rc) == GPG_ERR_CERT_EXPIRED)
{
gpgsm_status (ctrl, STATUS_EXPKEYSIG, NULL);
rc = 0;
}
else
gpgsm_status (ctrl, STATUS_GOODSIG, NULL);
{
char *buf, *fpr, *tstr;
char *fpr, *buf, *tstr;
fpr = gpgsm_fpr_and_name_for_status (cert);
if (gpg_err_code (rc) == GPG_ERR_CERT_EXPIRED)
{
gpgsm_status (ctrl, STATUS_EXPKEYSIG, fpr);
rc = 0;
}
else
gpgsm_status (ctrl, STATUS_GOODSIG, fpr);
xfree (fpr);
fpr = gpgsm_get_fingerprint_hexstring (cert, GCRY_MD_SHA1);
tstr = strtimestamp_r (sigtime);