1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-04-17 15:44:34 +02:00

ready for a new release

This commit is contained in:
Werner Koch 1998-08-08 19:27:00 +00:00
parent a43709eb8a
commit 6ccf4e0f80
32 changed files with 470 additions and 164 deletions

26
NEWS
View File

@ -1,5 +1,24 @@
Noteworthy changes in version 0.3.3 Noteworthy changes in version 0.3.3
----------------------------------- -----------------------------------
* IMPORTANT: I found yet another bug in the way the secret keys
are encrypted - I did it the way pgp 2.x did it, but OpenPGP
and pgp 5.x specifiy another (in some aspects simpler) method.
To convert your secret keys you have to do this:
1. Build the new release but don't install it and keep
a copy of the old program.
2. Disable the network, make sure that you are the only
user, be sure that there are no trojan horses etc ....
3. Use your old gpg (version 0.3.[12]) and set the
passphrases of ALL your secret keys to empty!
(gpg --change-passphrase your-user-id).
4. Save your ownertrusts (see the next point)
5. rm ~/.gnupg/trustd.gpg
6. install the new version of gpg (0.3.3)
7. For every secret key call "gpg --edit-key your-user-id",
enter "passwd" at the prompt, follow the instructions and
change your passward back, enter "save" to store it.
8. Restore the ownertrust (see next point).
* The format of the trust database has changed; you must delete * The format of the trust database has changed; you must delete
the old one, so gnupg can create a new one. the old one, so gnupg can create a new one.
IMPORTANT: Use version 0.3.[12] to save your assigned ownertrusts IMPORTANT: Use version 0.3.[12] to save your assigned ownertrusts
@ -43,8 +62,13 @@ Noteworthy changes in version 0.3.3
Twofish is the AES submission from Schneier et al.; see Twofish is the AES submission from Schneier et al.; see
"www.counterpane.com/twofish.html" for more information. "www.counterpane.com/twofish.html" for more information.
* [talk about --emulate-encr-mpi-bug] * Started with a help system: If you enter a question mark at some
prompt; you should get a specific help for this prompt.
* There is no more backup copy of the secret keyring.
* A lot of new bugs. I think this release is not as stable as
the previous one.
Noteworthy changes in version 0.3.2 Noteworthy changes in version 0.3.2

4
README
View File

@ -2,6 +2,10 @@
------------------------------- -------------------------------
Version 0.3 Version 0.3
WARNING: IF YOU ARE ALREADY USING GNUPG YOU SHOULD NOW MAKE A BACKUP
OF "gpg" BECAUSE YOU NEED IT TO CONVERT YOUR PASSPHRASE AND OTHER
THINGS - SEE "NEWS"!
As you can see from the version number, the program may have some As you can see from the version number, the program may have some
bugs and some features may not work at all - please report this to bugs and some features may not work at all - please report this to

5
TODO
View File

@ -1,4 +1,5 @@
* Fix Oscaris problems with the trustdb.
* salted and iterated S2Ks don't work (see passphrase.c).
* Replace the SIGUSR1 stuff by semaphores to avoid loss of a signal. * Replace the SIGUSR1 stuff by semaphores to avoid loss of a signal.
@ -11,6 +12,7 @@
what does pgp 5 do, what does OpenPGP say= what does pgp 5 do, what does OpenPGP say=
==> I think it is okay, should be tested against pgp5 ==> I think it is okay, should be tested against pgp5
* Fix Oscaris problems with the trustdb.
* invalid packets (Marco) und Markus Gruber * invalid packets (Marco) und Markus Gruber
* add some sanity checks to read_keyblock, so that we are sure that * add some sanity checks to read_keyblock, so that we are sure that
@ -47,4 +49,5 @@
* change the fake_data stuff to mpi_set_opaque * change the fake_data stuff to mpi_set_opaque
* Is it okay to use gettext for the help system???

View File

@ -1 +1 @@
0.3.2b 0.3.2c

View File

@ -1,12 +1,18 @@
#!/bin/sh #!/bin/sh
[ -n "$show_cmds" ] && echo "../g10/gpg --homedir . $*"
if ! ../g10/gpg --homedir . $* 2>err.tmp.$$ ; then if ! ../g10/gpg --homedir . $* 2>err.tmp.$$ ; then
echo "(../g10/gpg --homedir . $*) failed" >&2 echo "(../g10/gpg --homedir . $*) failed" >&2
cat err.tmp.$$ >&2 cat err.tmp.$$ >&2
rm err.tmp.$$ rm err.tmp.$$
exit 1 exit 1
fi fi
grep -v 'gpg: Good signature from' err.tmp.$$ \ fgrep -v -f - err.tmp.$$ <<EOF
| grep -v 'gpg: Signature made ' || true gpg: Good signature from
gpg: Signature made
gpg: note: cipher algorithm 3 not found in preferences
gpg: note: cipher algorithm 4 not found in preferences
EOF
rm err.tmp.$$ rm err.tmp.$$

View File

@ -36,3 +36,9 @@ g10c_generate_secret_prime( unsigned nbits )
} }
char *
g10c_get_random_bits( unsigned nbits, int level, int secure )
{
return (char*)get_random_bits( nbits, level, secure );
}

View File

@ -21,7 +21,7 @@ fi
VERSION=`cat $srcdir/VERSION` VERSION=`cat $srcdir/VERSION`
PACKAGE=gnupg PACKAGE=gnupg
ALL_LINGUAS="de it" ALL_LINGUAS="en de it"
AC_SUBST(VERSION) AC_SUBST(VERSION)
AC_SUBST(PACKAGE) AC_SUBST(PACKAGE)
AC_DEFINE_UNQUOTED(VERSION, "$VERSION") AC_DEFINE_UNQUOTED(VERSION, "$VERSION")

View File

@ -1,3 +1,11 @@
Sat Aug 8 17:26:12 1998 Werner Koch (wk@(none))
* openfile (overwrite_filep): Changed semantics and all callers.
Sat Aug 8 12:17:07 1998 Werner Koch (wk@(none))
* status.c (display_help): New.
Thu Aug 6 16:30:41 1998 Werner Koch,mobil,,, (wk@tobold) Thu Aug 6 16:30:41 1998 Werner Koch,mobil,,, (wk@tobold)
* seskey.c (encode_session_key): Now uses get_random_bits(). * seskey.c (encode_session_key): Now uses get_random_bits().

View File

@ -310,9 +310,11 @@ do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk )
} }
else else
iobuf_put(a, 0 ); iobuf_put(a, 0 );
if( sk->is_protected && sk->version >= 4 if( sk->is_protected && sk->version >= 4 ) {
&& !(opt.emulate_bugs & EMUBUG_ENCR_MPI) ) { byte *p;
BUG(); assert( mpi_is_opaque( sk->skey[npkey] ) );
p = mpi_get_opaque( sk->skey[npkey], &i );
iobuf_write(a, p, i );
} }
else { else {
for( ; i < nskey; i++ ) for( ; i < nskey; i++ )

View File

@ -173,7 +173,7 @@ static ARGPARSE_OPTS opts[] = {
{ 559, "always-trust", 0, "@"}, { 559, "always-trust", 0, "@"},
{ 562, "emulate-checksum-bug", 0, "@"}, { 562, "emulate-checksum-bug", 0, "@"},
{ 554, "run-as-shm-coprocess", 4, "@" }, { 554, "run-as-shm-coprocess", 4, "@" },
{ 568, "emulate-encr-mpi-bug", 0, "@"}, /* 568 unused */
{0} }; {0} };
@ -598,7 +598,6 @@ main( int argc, char **argv )
log_error("shared memory coprocessing is not available\n"); log_error("shared memory coprocessing is not available\n");
#endif #endif
break; break;
case 568: opt.emulate_bugs |= EMUBUG_ENCR_MPI; break;
default : errors++; pargs.err = configfp? 1:2; break; default : errors++; pargs.err = configfp? 1:2; break;
} }
} }

View File

@ -266,7 +266,7 @@ sign_uids( KBNODE keyblock, STRLIST locusr, int *ret_modified )
tty_print_string( p, n ); tty_print_string( p, n );
tty_printf("\"\n\n"); tty_printf("\"\n\n");
m_free(p); m_free(p);
p = cpr_get("sign_uid.really", _("Really sign? ")); p = cpr_get(N_("sign_uid.okay"), _("Really sign? "));
cpr_kill_prompt(); cpr_kill_prompt();
if( !answer_is_yes(p) ) { if( !answer_is_yes(p) ) {
m_free(p); m_free(p);
@ -400,7 +400,8 @@ delete_key( const char *username, int secret )
m_free(p); m_free(p);
tty_printf("\n\n"); tty_printf("\n\n");
p = cpr_get( secret? "delete_key.secret.really":"delete_key.really", p = cpr_get( secret? N_("delete_key.secret.okay")
: N_("delete_key.okay"),
_("Delete this key from the keyring? ")); _("Delete this key from the keyring? "));
cpr_kill_prompt(); cpr_kill_prompt();
if( !cpr_enabled() && secret && answer_is_yes(p)) { if( !cpr_enabled() && secret && answer_is_yes(p)) {
@ -410,7 +411,8 @@ delete_key( const char *username, int secret )
* basic texts about security. * basic texts about security.
*/ */
m_free(p); m_free(p);
p = tty_get(_("This is a secret key! - really delete? ")); p = cpr_get(N_("delete_key.secret.okay"),
_("This is a secret key! - really delete? "));
} }
if( answer_is_yes(p) ) if( answer_is_yes(p) )
okay++; okay++;
@ -496,7 +498,7 @@ change_passphrase( KBNODE keyblock )
rc = 0; rc = 0;
tty_printf(_( "You don't want a passphrase -" tty_printf(_( "You don't want a passphrase -"
" this is probably a *bad* idea!\n\n")); " this is probably a *bad* idea!\n\n"));
if( cpr_get_answer_is_yes("change_passwd.empty", if( cpr_get_answer_is_yes(N_("change_passwd.empty.okay"),
_("Do you really want to do this? "))) _("Do you really want to do this? ")))
changed++; changed++;
break; break;
@ -632,7 +634,7 @@ keyedit_menu( const char *username, STRLIST locusr )
redisplay = 0; redisplay = 0;
} }
m_free(answer); m_free(answer);
answer = cpr_get("keyedit.cmd", _("Command> ")); answer = cpr_get(N_("keyedit.cmd"), _("Command> "));
cpr_kill_prompt(); cpr_kill_prompt();
trim_spaces(answer); trim_spaces(answer);
@ -674,9 +676,11 @@ keyedit_menu( const char *username, STRLIST locusr )
case cmdQUIT: case cmdQUIT:
if( !modified && !sec_modified ) if( !modified && !sec_modified )
goto leave; goto leave;
if( !cpr_get_answer_is_yes("keyedit.save",_("Save changes? ")) ) { if( !cpr_get_answer_is_yes(N_("keyedit.save.okay"),
_("Save changes? ")) ) {
if( cpr_enabled() if( cpr_enabled()
|| tty_get_answer_is_yes(_("Quit without saving? ")) ) || cpr_get_answer_is_yes(N_("keyedit.cancel.okay"),
_("Quit without saving? ")) )
goto leave; goto leave;
break; break;
} }
@ -731,7 +735,8 @@ keyedit_menu( const char *username, STRLIST locusr )
case cmdSIGN: /* sign (only the public key) */ case cmdSIGN: /* sign (only the public key) */
if( count_uids(keyblock) > 1 && !count_selected_uids(keyblock) ) { if( count_uids(keyblock) > 1 && !count_selected_uids(keyblock) ) {
if( !tty_get_answer_is_yes(_("Really sign all user ids? ")) ) { if( !cpr_get_answer_is_yes(N_("keyedit.signall.okay"),
_("Really sign all user ids? ")) ) {
tty_printf(_("Hint: Select the user ids to sign\n")); tty_printf(_("Hint: Select the user ids to sign\n"));
break; break;
} }
@ -763,7 +768,8 @@ keyedit_menu( const char *username, STRLIST locusr )
tty_printf(_("You must select at least one user id.\n")); tty_printf(_("You must select at least one user id.\n"));
else if( count_uids(keyblock) - n1 < 1 ) else if( count_uids(keyblock) - n1 < 1 )
tty_printf(_("You can't delete the last user id!\n")); tty_printf(_("You can't delete the last user id!\n"));
else if( tty_get_answer_is_yes( else if( cpr_get_answer_is_yes(
N_("keyedit.remove.uid.okay"),
n1 > 1? _("Really remove all selected user ids? ") n1 > 1? _("Really remove all selected user ids? ")
: _("Really remove this user id? ") : _("Really remove this user id? ")
) ) { ) ) {
@ -789,7 +795,8 @@ keyedit_menu( const char *username, STRLIST locusr )
if( !(n1=count_selected_keys( keyblock )) ) if( !(n1=count_selected_keys( keyblock )) )
tty_printf(_("You must select at least one key.\n")); tty_printf(_("You must select at least one key.\n"));
else if( sec_keyblock && !tty_get_answer_is_yes( else if( sec_keyblock && !cpr_get_answer_is_yes(
N_("keyedit.remove.subkey.okay"),
n1 > 1? n1 > 1?
_("Do you really want to delete the selected keys? "): _("Do you really want to delete the selected keys? "):
_("Do you really want to delete this key? ") _("Do you really want to delete this key? ")

View File

@ -390,8 +390,8 @@ ask_algo( int *ret_v4, int addmode )
*ret_v4 = 1; *ret_v4 = 1;
for(;;) { for(;;) {
answer = cpr_get("keygen.algo",_("Your selection? ")); answer = cpr_get(N_("keygen.algo"),_("Your selection? "));
tty_kill_prompt(); cpr_kill_prompt();
algo = *answer? atoi(answer): 1; algo = *answer? atoi(answer): 1;
m_free(answer); m_free(answer);
if( algo == 1 && !addmode ) { if( algo == 1 && !addmode ) {
@ -434,8 +434,9 @@ ask_keysize( int algo )
" highest suggested keysize is 2048 bits\n"), " highest suggested keysize is 2048 bits\n"),
pubkey_algo_to_string(algo) ); pubkey_algo_to_string(algo) );
for(;;) { for(;;) {
answer = cpr_get("keygen.size",_("What keysize do you want? (1024) ")); answer = cpr_get(N_("keygen.size"),
tty_kill_prompt(); _("What keysize do you want? (1024) "));
cpr_kill_prompt();
nbits = *answer? atoi(answer): 1024; nbits = *answer? atoi(answer): 1024;
m_free(answer); m_free(answer);
if( algo == PUBKEY_ALGO_DSA && (nbits < 512 || nbits > 1024) ) if( algo == PUBKEY_ALGO_DSA && (nbits < 512 || nbits > 1024) )
@ -445,7 +446,7 @@ ask_keysize( int algo )
else if( nbits > 2048 && !cpr_enabled() ) { else if( nbits > 2048 && !cpr_enabled() ) {
tty_printf(_("Keysizes larger than 2048 are not suggested because " tty_printf(_("Keysizes larger than 2048 are not suggested because "
"computations take REALLY long!\n")); "computations take REALLY long!\n"));
if( tty_get_answer_is_yes(_( if( cpr_get_answer_is_yes(N_("keygen.size.huge.okay"),_(
"Are you sure that you want this keysize? ")) ) { "Are you sure that you want this keysize? ")) ) {
tty_printf(_("Okay, but keep in mind that your monitor " tty_printf(_("Okay, but keep in mind that your monitor "
"and keyboard radiation is also very vulnerable " "and keyboard radiation is also very vulnerable "
@ -454,7 +455,7 @@ ask_keysize( int algo )
} }
} }
else if( nbits > 1536 && !cpr_enabled() ) { else if( nbits > 1536 && !cpr_enabled() ) {
if( tty_get_answer_is_yes(_( if( cpr_get_answer_is_yes(N_("keygen.size.large.okay"),_(
"Do you really need such a large keysize? ")) ) "Do you really need such a large keysize? ")) )
break; break;
} }
@ -495,8 +496,8 @@ ask_valid_days()
int mult; int mult;
m_free(answer); m_free(answer);
answer = cpr_get("keygen.valid",_("Key is valid for? (0) ")); answer = cpr_get(N_("keygen.valid"),_("Key is valid for? (0) "));
tty_kill_prompt(); cpr_kill_prompt();
trim_spaces(answer); trim_spaces(answer);
if( !*answer ) if( !*answer )
valid_days = 0; valid_days = 0;
@ -519,7 +520,8 @@ ask_valid_days()
} }
if( !cpr_enabled() if( !cpr_enabled()
&& tty_get_answer_is_yes(_("Is this correct (y/n)? ")) ) && cpr_get_answer_is_yes(N_("keygen.valid.okay"),
_("Is this correct (y/n)? ")) )
break; break;
} }
m_free(answer); m_free(answer);
@ -558,9 +560,9 @@ ask_user_id( int mode )
if( !aname ) { if( !aname ) {
for(;;) { for(;;) {
m_free(aname); m_free(aname);
aname = cpr_get("keygen.name",_("Real name: ")); aname = cpr_get(N_("keygen.name"),_("Real name: "));
trim_spaces(aname); trim_spaces(aname);
tty_kill_prompt(); cpr_kill_prompt();
if( strpbrk( aname, "<([])>" ) ) if( strpbrk( aname, "<([])>" ) )
tty_printf(_("Invalid character in name\n")); tty_printf(_("Invalid character in name\n"));
else if( isdigit(*aname) ) else if( isdigit(*aname) )
@ -574,10 +576,10 @@ ask_user_id( int mode )
if( !amail ) { if( !amail ) {
for(;;) { for(;;) {
m_free(amail); m_free(amail);
amail = cpr_get("keygen.email",_("Email address: ")); amail = cpr_get(N_("keygen.email"),_("Email address: "));
trim_spaces(amail); trim_spaces(amail);
strlwr(amail); strlwr(amail);
tty_kill_prompt(); cpr_kill_prompt();
if( !*amail ) if( !*amail )
break; /* no email address is okay */ break; /* no email address is okay */
else if( has_invalid_email_chars(amail) else if( has_invalid_email_chars(amail)
@ -594,9 +596,9 @@ ask_user_id( int mode )
if( !acomment ) { if( !acomment ) {
for(;;) { for(;;) {
m_free(acomment); m_free(acomment);
acomment = cpr_get("keygen.comment",_("Comment: ")); acomment = cpr_get(N_("keygen.comment"),_("Comment: "));
trim_spaces(acomment); trim_spaces(acomment);
tty_kill_prompt(); cpr_kill_prompt();
if( !*acomment ) if( !*acomment )
break; /* no comment is okay */ break; /* no comment is okay */
else if( strpbrk( acomment, "()" ) ) else if( strpbrk( acomment, "()" ) )
@ -630,9 +632,9 @@ ask_user_id( int mode )
answer[1] = 0; answer[1] = 0;
} }
else { else {
answer = tty_get(_( answer = cpr_get(N_("keygen.userid.cmd"),_(
"Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? ")); "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "));
tty_kill_prompt(); cpr_kill_prompt();
} }
if( strlen(answer) > 1 ) if( strlen(answer) > 1 )
; ;
@ -959,7 +961,8 @@ generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock )
assert(algo); assert(algo);
nbits = ask_keysize( algo ); nbits = ask_keysize( algo );
ndays = ask_valid_days(); ndays = ask_valid_days();
if( !cpr_enabled() && !tty_get_answer_is_yes( _("Really create? ") ) ) if( !cpr_enabled() && !cpr_get_answer_is_yes(N_("keygen.sub.okay"),
_("Really create? ") ) )
goto leave; goto leave;
if( passphrase ) { if( passphrase ) {

View File

@ -30,51 +30,35 @@
#include "ttyio.h" #include "ttyio.h"
#include "options.h" #include "options.h"
#include "main.h" #include "main.h"
#include "status.h"
#include "i18n.h"
/**************** /****************
* Check whether FNAME exists and ask if it's okay to overwrite an * Check whether FNAME exists and ask if it's okay to overwrite an
* existing one. * existing one.
* Returns: -1 : Do not overwrite * Returns: True: it's okay to overwrite or the file does not exist
* 0 : it's okay to overwrite or the file does not exist * False: Do not overwrite
* >0 : other error
*/ */
int int
overwrite_filep( const char *fname ) overwrite_filep( const char *fname )
{ {
if( !fname || (*fname == '-' && !fname[1]) ) if( !fname || (*fname == '-' && !fname[1]) )
return 0; /* stdout */ return 1; /* writing to stdout is always okay */
if( !access( fname, F_OK ) ) {
char *p;
int okay;
int first = 1;
if( access( fname, F_OK ) )
return 1; /* does not exist */
/* fixme: add some backup stuff in case of overwrite */
if( opt.answer_yes ) if( opt.answer_yes )
okay = 1; return 1;
else if( opt.answer_no || opt.batch ) if( opt.answer_no || opt.batch )
okay = 2; return 0; /* do not overwrite */
else
okay = 0;
while( !okay ) { tty_printf(_("File '%s' exists. "), fname);
if( first ) { if( cpr_get_answer_is_yes(N_("openfile.overwrite.okay"),
tty_printf("File '%s' exists. ", fname); _("Overwrite (y/N)? ")) )
first = 0; return 1;
}
p = tty_get("Overwrite (y/N)? ");
tty_kill_prompt();
if( (*p == 'y' || *p == 'Y') && !p[1] )
okay = 1;
else if( !*p || ((*p == 'n' || *p == 'N') && !p[1]) )
okay = 2;
else
okay = 0;
m_free(p);
}
if( okay == 2 )
return -1;
/* fixme: add some backup stuff */
}
return 0; return 0;
} }
@ -90,7 +74,6 @@ IOBUF
open_outfile( const char *iname, int mode ) open_outfile( const char *iname, int mode )
{ {
IOBUF a = NULL; IOBUF a = NULL;
int rc;
if( (!iname || (*iname=='-' && !iname[1])) && !opt.outfile ) { if( (!iname || (*iname=='-' && !iname[1])) && !opt.outfile ) {
if( !(a = iobuf_create(NULL)) ) if( !(a = iobuf_create(NULL)) )
@ -110,14 +93,12 @@ open_outfile( const char *iname, int mode )
mode==2 ? ".sig" : ".gpg"); mode==2 ? ".sig" : ".gpg");
name = buf; name = buf;
} }
if( !(rc=overwrite_filep( name )) ) { if( overwrite_filep( name ) ) {
if( !(a = iobuf_create( name )) ) if( !(a = iobuf_create( name )) )
log_error("can't create %s: %s\n", name, strerror(errno) ); log_error("can't create %s: %s\n", name, strerror(errno) );
else if( opt.verbose ) else if( opt.verbose )
log_info("writing to '%s'\n", name ); log_info("writing to '%s'\n", name );
} }
else if( rc != -1 )
log_error("oops: overwrite_filep(%s): %s\n", name, g10_errstr(rc) );
m_free(buf); m_free(buf);
} }
return a; return a;

View File

@ -56,7 +56,6 @@ struct {
#define EMUBUG_GPGCHKSUM 1 #define EMUBUG_GPGCHKSUM 1
#define EMUBUG_ENCR_MPI 2
#define DBG_PACKET_VALUE 1 /* debug packet reading/writing */ #define DBG_PACKET_VALUE 1 /* debug packet reading/writing */
#define DBG_MPI_VALUE 2 /* debug mpi details */ #define DBG_MPI_VALUE 2 /* debug mpi details */

View File

@ -1102,8 +1102,8 @@ parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
* If the user is so careless, not to protect his secret key, * If the user is so careless, not to protect his secret key,
* we can assume, that he operates an open system :=(. * we can assume, that he operates an open system :=(.
* So we put the key into secure memory when we unprotect it. */ * So we put the key into secure memory when we unprotect it. */
if( is_v4 && sk->is_protected && !(opt.emulate_bugs & EMUBUG_ENCR_MPI)){ if( is_v4 && sk->is_protected ){
/* ugly; the length is encrypted too, so wee read all /* ugly; the length is encrypted too, so we read all
* stuff up to the end of the packet into the first * stuff up to the end of the packet into the first
* skey element */ * skey element */
sk->skey[npkey] = mpi_set_opaque(NULL, sk->skey[npkey] = mpi_set_opaque(NULL,

View File

@ -32,6 +32,7 @@
#include "keydb.h" #include "keydb.h"
#include "main.h" #include "main.h"
#include "i18n.h" #include "i18n.h"
#include "status.h"
static int pwfd = -1; static int pwfd = -1;
static char *next_pw = NULL; static char *next_pw = NULL;
@ -129,6 +130,12 @@ passphrase_to_dek( u32 *keyid, int cipher_algo, STRING2KEY *s2k, int mode )
tty_printf("\n"); tty_printf("\n");
free_public_key( pk ); free_public_key( pk );
} }
else if( keyid && !next_pw ) {
char buf[20];
sprintf( buf, "%08lX%08lX", (ulong)keyid[0], (ulong)keyid[1] );
write_status_text( STATUS_NEED_PASSPHRASE, buf );
}
if( next_pw ) { if( next_pw ) {
pw = next_pw; pw = next_pw;
next_pw = NULL; next_pw = NULL;
@ -157,10 +164,11 @@ passphrase_to_dek( u32 *keyid, int cipher_algo, STRING2KEY *s2k, int mode )
else if( opt.batch ) else if( opt.batch )
log_fatal("Can't query password in batchmode\n"); log_fatal("Can't query password in batchmode\n");
else { else {
pw = tty_get_hidden("Enter pass phrase: " ); pw = cpr_get_hidden(N_("passphrase.enter"), _("Enter pass phrase: ") );
tty_kill_prompt(); tty_kill_prompt();
if( mode == 2 ) { if( mode == 2 && !cpr_enabled() ) {
char *pw2 = tty_get_hidden("Repeat pass phrase: " ); char *pw2 = cpr_get_hidden(N_("passphrase.repeat"),
_("Repeat pass phrase: ") );
tty_kill_prompt(); tty_kill_prompt();
if( strcmp(pw, pw2) ) { if( strcmp(pw, pw2) ) {
m_free(pw2); m_free(pw2);
@ -205,7 +213,7 @@ hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create )
if( s2k->mode == 3 ) { if( s2k->mode == 3 ) {
count = (16ul + (s2k->count & 15)) << ((s2k->count >> 4) + 6); count = (16ul + (s2k->count & 15)) << ((s2k->count >> 4) + 6);
log_info("s2k iteration count=%lu\n", count ); log_debug("s2k iteration count=%lu\n", count );
} }
for(;;) { for(;;) {
md_write( md, s2k->salt, 8 ); md_write( md, s2k->salt, 8 );

View File

@ -84,17 +84,11 @@ edit_ownertrust( ulong lid, int mode )
" s = please show me more information\n\n") ); " s = please show me more information\n\n") );
for(;;) { for(;;) {
p = tty_get(_("Your decision? ")); p = cpr_get(N_("edit_ownertrust.value"),_("Your decision? "));
trim_spaces(p); trim_spaces(p);
tty_kill_prompt(); cpr_kill_prompt();
if( *p && p[1] ) if( *p && p[1] )
; ;
else if( *p == '?' ) {
tty_printf(_(
"It's up to you to assign a value here; this value will never be exported\n"
"to any 3rd party. We need it to implement the web-of-trust; it has nothing\n"
"to do with the (implicitly created) web-of-certificates.\n"));
}
else if( !p[1] && (*p >= '1' && *p <= '4') ) { else if( !p[1] && (*p >= '1' && *p <= '4') ) {
unsigned trust; unsigned trust;
switch( *p ) { switch( *p ) {
@ -173,18 +167,12 @@ do_we_trust( PKT_public_key *pk, int trustlevel )
int rc; int rc;
if( (trustlevel & TRUST_FLAG_REVOKED) ) { if( (trustlevel & TRUST_FLAG_REVOKED) ) {
char *answer;
int yes;
log_info("key has been revoked!\n"); log_info("key has been revoked!\n");
if( opt.batch ) if( opt.batch )
return 0; return 0;
answer = tty_get("Use this key anyway? "); if( !cpr_get_answer_is_yes(N_("revoked_key.override"),
tty_kill_prompt(); _("Use this key anyway? ")) )
yes = answer_is_yes(answer);
m_free(answer);
if( !yes )
return 0; return 0;
} }
@ -265,18 +253,14 @@ do_we_trust_pre( PKT_public_key *pk, int trustlevel )
int rc = do_we_trust( pk, trustlevel ); int rc = do_we_trust( pk, trustlevel );
if( !opt.batch && !rc ) { if( !opt.batch && !rc ) {
char *answer;
tty_printf(_( tty_printf(_(
"It is NOT certain that the key belongs to its owner.\n" "It is NOT certain that the key belongs to its owner.\n"
"If you *really* know what you are doing, you may answer\n" "If you *really* know what you are doing, you may answer\n"
"the next question with yes\n\n") ); "the next question with yes\n\n") );
answer = tty_get("Use this key anyway? "); if( cpr_get_answer_is_yes(N_("untrusted_key.override"),
tty_kill_prompt(); _("Use this key anyway? ")) )
if( answer_is_yes(answer) )
rc = 1; rc = 1;
m_free(answer);
} }
else if( opt.always_trust && !rc ) { else if( opt.always_trust && !rc ) {
log_info(_("WARNING: Using untrusted key!\n")); log_info(_("WARNING: Using untrusted key!\n"));
@ -421,9 +405,10 @@ build_pk_list( STRLIST remusr, PK_LIST *ret_pk_list, unsigned usage )
for(;;) { for(;;) {
rc = 0; rc = 0;
m_free(answer); m_free(answer);
answer = tty_get(_("Enter the user ID: ")); answer = cpr_get(N_("pklist.user_id.enter"),
_("Enter the user ID: "));
trim_spaces(answer); trim_spaces(answer);
tty_kill_prompt(); cpr_kill_prompt();
if( !*answer ) if( !*answer )
break; break;
if( pk ) if( pk )

View File

@ -30,6 +30,7 @@
#include "ttyio.h" #include "ttyio.h"
#include "filter.h" #include "filter.h"
#include "main.h" #include "main.h"
#include "status.h"
#include "i18n.h" #include "i18n.h"
@ -109,8 +110,7 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
/* no filename or "-" given; write to stdout */ /* no filename or "-" given; write to stdout */
fp = stdout; fp = stdout;
} }
else if( (rc=overwrite_filep( fname )) ) { else if( !overwrite_filep( fname ) ) {
if( rc == -1 )
rc = G10ERR_CREATE_FILE; rc = G10ERR_CREATE_FILE;
goto leave; goto leave;
} }
@ -207,8 +207,9 @@ ask_for_detached_datafile( md_filter_context_t *mfx, const char *inname )
tty_printf("Detached signature.\n"); tty_printf("Detached signature.\n");
do { do {
m_free(answer); m_free(answer);
answer = tty_get("Please enter name of data file: "); answer = cpr_get(N_("detached_signature.filename"),
tty_kill_prompt(); _("Please enter name of data file: "));
cpr_kill_prompt();
if( any && !*answer ) { if( any && !*answer ) {
rc = G10ERR_READ_FILE; rc = G10ERR_READ_FILE;
goto leave; goto leave;

View File

@ -31,6 +31,7 @@
#include "trustdb.h" #include "trustdb.h"
#include "cipher.h" #include "cipher.h"
#include "status.h" #include "status.h"
#include "i18n.h"
/**************** /****************
@ -134,7 +135,7 @@ get_session_key( PKT_pubkey_enc *k, DEK *dek )
log_error("can't check algorithm against preferences\n"); log_error("can't check algorithm against preferences\n");
else if( dek->algo != CIPHER_ALGO_3DES else if( dek->algo != CIPHER_ALGO_3DES
&& !is_algo_in_prefs( pk->local_id, PREFTYPE_SYM, dek->algo ) ) && !is_algo_in_prefs( pk->local_id, PREFTYPE_SYM, dek->algo ) )
log_info("note: cipher algorithm %d not found in preferences\n", log_info(_("note: cipher algorithm %d not found in preferences\n"),
dek->algo ); dek->algo );
free_public_key( pk ); free_public_key( pk );
rc = 0; rc = 0;

View File

@ -33,6 +33,8 @@
#include "util.h" #include "util.h"
#include "main.h" #include "main.h"
#include "ttyio.h" #include "ttyio.h"
#include "status.h"
#include "i18n.h"
/**************** /****************
@ -53,8 +55,6 @@ gen_revoke( const char *uname )
KBNODE keyblock = NULL; KBNODE keyblock = NULL;
KBNODE node; KBNODE node;
KBPOS kbpos; KBPOS kbpos;
char *answer;
int yes;
if( opt.batch ) { if( opt.batch ) {
log_error("sorry, can't do this in batch mode\n"); log_error("sorry, can't do this in batch mode\n");
@ -117,11 +117,8 @@ gen_revoke( const char *uname )
} }
tty_printf("\n"); tty_printf("\n");
answer = tty_get("Create a revocation certificate for this key? "); if( !cpr_get_answer_is_yes(N_("gen_revoke.okay"),
tty_kill_prompt(); _("Create a revocation certificate for this key? ")) ){
yes = answer_is_yes(answer);
m_free(answer);
if( !yes ) {
rc = 0; rc = 0;
goto leave; goto leave;
} }

View File

@ -67,10 +67,11 @@ do_check( PKT_secret_key *sk )
memcpy(save_iv, sk->protect.iv, 8 ); memcpy(save_iv, sk->protect.iv, 8 );
cipher_decrypt( cipher_hd, sk->protect.iv, sk->protect.iv, 8 ); cipher_decrypt( cipher_hd, sk->protect.iv, sk->protect.iv, 8 );
csum = 0; csum = 0;
if( sk->version >= 4 && !(opt.emulate_bugs & EMUBUG_ENCR_MPI) ) { if( sk->version >= 4 ) {
int ndata; int ndata;
byte *p, *data; byte *p, *data;
i = pubkey_get_npkey(sk->pubkey_algo); i = pubkey_get_npkey(sk->pubkey_algo);
assert( mpi_is_opaque( sk->skey[i] ) ); assert( mpi_is_opaque( sk->skey[i] ) );
p = mpi_get_opaque( sk->skey[i], &ndata ); p = mpi_get_opaque( sk->skey[i], &ndata );
@ -78,10 +79,15 @@ do_check( PKT_secret_key *sk )
cipher_decrypt( cipher_hd, data, p, ndata ); cipher_decrypt( cipher_hd, data, p, ndata );
mpi_free( sk->skey[i] ); sk->skey[i] = NULL ; mpi_free( sk->skey[i] ); sk->skey[i] = NULL ;
p = data; p = data;
csum = checksum( data, ndata); if( ndata < 2 ) {
if( ndata < 2 ) log_error("not enough bytes for checksum\n");
log_bug("not enough bytes for checksum\n"); sk->csum = 0;
csum = 1;
}
else {
csum = checksum( data, ndata-2);
sk->csum = data[ndata-2] << 8 | data[ndata-1]; sk->csum = data[ndata-2] << 8 | data[ndata-1];
}
/* must check it here otherwise the mpi_read_xx would fail /* must check it here otherwise the mpi_read_xx would fail
* because the length das an abritary value */ * because the length das an abritary value */
if( sk->csum == csum ) { if( sk->csum == csum ) {
@ -198,7 +204,7 @@ is_secret_key_protected( PKT_secret_key *sk )
int int
protect_secret_key( PKT_secret_key *sk, DEK *dek ) protect_secret_key( PKT_secret_key *sk, DEK *dek )
{ {
int i, rc = 0; int i,j, rc = 0;
byte *buffer; byte *buffer;
unsigned nbytes; unsigned nbytes;
u16 csum; u16 csum;
@ -219,12 +225,53 @@ protect_secret_key( PKT_secret_key *sk, DEK *dek )
cipher_setkey( cipher_hd, dek->key, dek->keylen ); cipher_setkey( cipher_hd, dek->key, dek->keylen );
cipher_setiv( cipher_hd, NULL ); cipher_setiv( cipher_hd, NULL );
cipher_encrypt( cipher_hd, sk->protect.iv, sk->protect.iv, 8 ); cipher_encrypt( cipher_hd, sk->protect.iv, sk->protect.iv, 8 );
if( sk->version >= 4 && !(opt.emulate_bugs & EMUBUG_ENCR_MPI) ) { if( sk->version >= 4 ) {
BUG(); #define NMPIS (PUBKEY_MAX_NSKEY - PUBKEY_MAX_NPKEY)
byte *buffer[NMPIS];
unsigned nbytes[NMPIS];
unsigned nbits[NMPIS];
int ndata=0;
byte *p, *data;
for(j=0, i = pubkey_get_npkey(sk->pubkey_algo);
i < pubkey_get_nskey(sk->pubkey_algo); i++, j++ ) {
assert( !mpi_is_opaque( sk->skey[i] ) );
buffer[j] = mpi_get_buffer( sk->skey[i], &nbytes[j], NULL );
nbits[j] = mpi_get_nbits( sk->skey[i] );
ndata += nbytes[j] + 2;
}
for( ; j < NMPIS; j++ )
buffer[j] = NULL;
ndata += 2; /* for checksum */
data = m_alloc_secure( ndata );
p = data;
for(j=0; j < NMPIS && buffer[j]; j++ ) {
p[0] = nbits[j] >> 8 ;
p[1] = nbits[j];
p += 2;
memcpy(p, buffer[j], nbytes[j] );
p += nbytes[j];
m_free(buffer[j]);
}
#undef NMPIS
csum = checksum( data, ndata-2);
sk->csum = csum;
*p++ = csum >> 8;
*p++ = csum;
assert( p == data+ndata );
cipher_encrypt( cipher_hd, data, data, ndata );
for(i = pubkey_get_npkey(sk->pubkey_algo);
i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {
mpi_free( sk->skey[i] );
sk->skey[i] = NULL;
}
i = pubkey_get_npkey(sk->pubkey_algo);
sk->skey[i] = mpi_set_opaque(NULL, data, ndata );
} }
else { else {
/* NOTE: we always recalculate the checksum because there /* NOTE: we always recalculate the checksum because there
* are some * test releases which calculated it wrong */ * are some test releases which calculated it wrong */
csum = 0; csum = 0;
for(i=pubkey_get_npkey(sk->pubkey_algo); for(i=pubkey_get_npkey(sk->pubkey_algo);
i < pubkey_get_nskey(sk->pubkey_algo); i++ ) { i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {

View File

@ -87,6 +87,24 @@ encode_session_key( DEK *dek, unsigned nbits )
i = nframe - 6 - dek->keylen; i = nframe - 6 - dek->keylen;
assert( i > 0 ); assert( i > 0 );
p = get_random_bits( i*8, 1, 1 ); p = get_random_bits( i*8, 1, 1 );
/* replace zero bytes by new values */
for(;;) {
int j, k;
byte *pp;
/* count the zero bytes */
for(j=k=0; j < i; j++ )
if( !p[j] )
k++;
if( !k )
break; /* okay: no zero bytes */
k += k/128; /* better get some more */
pp = get_random_bits( k*8, 1, 1);
for(j=0; j < i && k ; j++ )
if( !p[j] )
p[j] = pp[--k];
m_free(pp);
}
memcpy( frame+n, p, i ); memcpy( frame+n, p, i );
m_free(p); m_free(p);
n += i; n += i;

View File

@ -37,6 +37,7 @@
#include "ttyio.h" #include "ttyio.h"
#include "options.h" #include "options.h"
#include "main.h" #include "main.h"
#include "i18n.h"
static int fd = -1; static int fd = -1;
#ifdef USE_SHM_COPROCESSING #ifdef USE_SHM_COPROCESSING
@ -87,6 +88,7 @@ write_status_text ( int no, const char *text)
case STATUS_SHM_GET : s = "SHM_GET\n"; break; case STATUS_SHM_GET : s = "SHM_GET\n"; break;
case STATUS_SHM_GET_BOOL : s = "SHM_GET_BOOL\n"; break; case STATUS_SHM_GET_BOOL : s = "SHM_GET_BOOL\n"; break;
case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN\n"; break; case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN\n"; break;
case STATUS_NEED_PASSPHRASE: s = "NEED_PASSPHRASE\n"; break;
default: s = "?\n"; break; default: s = "?\n"; break;
} }
@ -194,6 +196,32 @@ do_shm_get( const char *keyword, int hidden, int bool )
#endif /* USE_SHM_COPROCESSING */ #endif /* USE_SHM_COPROCESSING */
static void
display_help( const char *keyword )
{
char *p;
int hint = 0;
tty_kill_prompt();
if( !keyword ) {
tty_printf(_("No help available") );
hint++;
}
else {
p = _(keyword);
if( !strcmp( p, keyword ) ) {
tty_printf(_("No help available for '%s'"), keyword );
hint++;
}
else
tty_printf("%s", p );
}
tty_printf("\n");
if( hint )
tty_printf("You should set your LANG variable to a valid value.\n"
"Set LANG to \"en\" to see the English help texts.\n" );
}
int int
cpr_enabled() cpr_enabled()
@ -208,21 +236,41 @@ cpr_enabled()
char * char *
cpr_get( const char *keyword, const char *prompt ) cpr_get( const char *keyword, const char *prompt )
{ {
char *p;
#ifdef USE_SHM_COPROCESSING #ifdef USE_SHM_COPROCESSING
if( opt.shm_coprocess ) if( opt.shm_coprocess )
return do_shm_get( keyword, 0, 0 ); return do_shm_get( keyword, 0, 0 );
#endif #endif
return tty_get( prompt ); for(;;) {
p = tty_get( prompt );
if( *p == '?' && !p[1] ) {
m_free(p);
display_help( keyword );
}
else
return p;
}
} }
char * char *
cpr_get_hidden( const char *keyword, const char *prompt ) cpr_get_hidden( const char *keyword, const char *prompt )
{ {
char *p;
#ifdef USE_SHM_COPROCESSING #ifdef USE_SHM_COPROCESSING
if( opt.shm_coprocess ) if( opt.shm_coprocess )
return do_shm_get( keyword, 1, 0 ); return do_shm_get( keyword, 1, 0 );
#endif #endif
return tty_get_hidden( prompt ); for(;;) {
p = tty_get_hidden( prompt );
if( *p == '?' && !p[1] ) {
m_free(p);
display_help( keyword );
}
else
return p;
}
} }
void void

View File

@ -47,6 +47,7 @@
#define STATUS_SHM_GET_BOOL 18 #define STATUS_SHM_GET_BOOL 18
#define STATUS_SHM_GET_HIDDEN 19 #define STATUS_SHM_GET_HIDDEN 19
#define STATUS_NEED_PASSPHRASE 20
/*-- status.c --*/ /*-- status.c --*/
void set_status_fd ( int fd ); void set_status_fd ( int fd );

View File

@ -70,6 +70,8 @@ int g10m_invm( MPI x, MPI u, MPI v );
unsigned g10m_get_nbits( MPI a ); unsigned g10m_get_nbits( MPI a );
unsigned g10m_get_size( MPI a ); unsigned g10m_get_size( MPI a );
void g10m_set_buffer( MPI a, const char *buffer, unsigned nbytes, int sign );
/******************************************** /********************************************
******* symmetric cipher functions ******* ******* symmetric cipher functions *******
@ -98,7 +100,7 @@ const char *g10c_revision_string(int mode);
const char *g10u_revision_string(int mode); const char *g10u_revision_string(int mode);
MPI g10c_generate_secret_prime( unsigned nbits ); MPI g10c_generate_secret_prime( unsigned nbits );
unsigned char g10c_get_random_byte( int level ); char *g10c_get_random_bits( unsigned nbits, int level, int secure );
void *g10_malloc( size_t n ); void *g10_malloc( size_t n );

View File

@ -85,3 +85,11 @@ g10m_get_size( MPI a )
return mpi_get_nlimbs( a ) * BITS_PER_MPI_LIMB; return mpi_get_nlimbs( a ) * BITS_PER_MPI_LIMB;
} }
void
g10m_set_buffer( MPI a, const char *buffer, unsigned nbytes, int sign )
{
mpi_set_buffer( a, buffer, nbytes, sign );
}

View File

@ -30,6 +30,8 @@ g10/sig-check.c
g10/sign.c g10/sign.c
g10/trustdb.c g10/trustdb.c
g10/verify.c g10/verify.c
g10/status.c
g10/pubkey-enc.c
#---end-- #---end--

View File

@ -1259,3 +1259,31 @@ msgid "key %08lX.%lu: trust check failed: %s\n"
msgstr "Schlüssel %08lX.%lu: Vertrauensprüfung fehlgeschlagen: %s\n" msgstr "Schlüssel %08lX.%lu: Vertrauensprüfung fehlgeschlagen: %s\n"
#################################
######## Help msgids ############
#################################
msgid "passphrase.enter"
msgstr ""
"Bitte geben Sie die \"Passhrase\" ein; dies ist ein geheimer Satz der aus\n"
"beliebigen Zeichen bestehen kann. Was Sie eingegeben wird nicht angezeigt.\n"
"Zur ihrer eigenen Sicherbeit benutzen Sie biite einen Satz, den sie sich\n"
"gut merken könne, der aber nicht leicht zu raten ist; Zitate und andere\n"
"bekannte Texte sind eine SCHLECHTE Wahl, da diese mit Sicherheit Online\n"
"verfügbar sind und durch entsprechende Programme zum Raten der \"Passphrase\"\n"
"benutzt werden. Sätze mit persönlicher Bedeutung die auch noch durch\n"
"falsche Groß-/Kleinschreibung und eingestreute Sonderzeichen verändert werden,\n"
"sind i.d.R. eine gute Wahl"
msgid "passphrase.repeat"
msgstr ""
"Um sicher zugehen, daß Sie sich bei der Eingabe der \"Passphrase\" nicht\n"
"vertippt haben, geben Sie diese bitte nochmal ein. Nur wenn beide Eingaben\n"
"übereinstimmen, wird die \"Passphrase\" akzeptiert."
msgid "keyedit.cmd"
msgstr "Geben Sie bitte \"help\" ein."

141
po/en.po
View File

@ -1,29 +1,128 @@
msgid ""
msgid "passphrase.enter"
msgstr "" msgstr ""
"Please enter the passhrase; this is a secret sentence which consists\n" "Date: 1998-08-08 18:07:50+0200\n"
"beliebigen Zeichen bestehen kann. Was Sie eingegeben wird nicht angezeigt.\n" "From: Werner Koch <wk@frodo>\n"
"Zur ihrer eigenen Sicherbeit benutzen Sie biite einen Satz, den sie sich\n" "Content-Type: text/plain; charset=\n"
"gut merken könne, der aber nicht leicht zu raten ist; Zitate und andere\n" "Xgettext-Options: --default-domain=gnupg --directory=.. --add-comments --keyword=_ --keyword=N_ --files-from=./POTFILES.in\n"
"bekannte Texte sind eine SCHLECHTE Wahl, da diese mit Sicherheit Online\n" "Files: util/secmem.c util/argparse.c cipher/random.c cipher/rand-dummy.c cipher/rand-unix.c cipher/rand-w32.c g10/g10.c g10/pkclist.c g10/keygen.c g10/decrypt.c g10/encode.c g10/import.c g10/keyedit.c g10/keylist.c g10/mainproc.c g10/passphrase.c g10/plaintext.c g10/pref.c g10/seckey-cert.c g10/sig-check.c g10/sign.c g10/trustdb.c g10/verify.c g10/status.c g10/pubkey-enc.c\n"
"verfügbar sind und durch entsprechende Programme zum Raten der \"Passphrase\"\n"
"benutzt werden. Sätze mit persönlicher Bedeutung die auch noch durch\n"
"falsche Groß-/Kleinschreibung und eingestreute Sonderzeichen verändert werden,\n"
"sind i.d.R. eine gute Wahl"
msgid "passphrase.repeat"
msgstr ""
"Um sicher zugehen, daß Sie sich bei der Eingabe der \"Passphrase\" nicht\n"
"vertippt haben, geben Sie diese bitte nochmal ein. Nur wenn beide Eingaben\n"
"übereinstimmen, wird die \"Passphrase\" akzeptiert."
msgid "keyedit.cmd"
msgstr "Please enter \"help\"."
#: g10/pkclist.c:87
msgid "edit_ownertrust.value" msgid "edit_ownertrust.value"
msgstr "" msgstr ""
"It's up to you to assign a value here; this value will never be exported\n" "It's up to you to assign a value here; this value will never be exported\n"
"to any 3rd party. We need it to implement the web-of-trust; it has nothing\n" "to any 3rd party. We need it to implement the web-of-trust; it has nothing\n"
"to do with the (implicitly created) web-of-certificates." "to do with the (implicitly created) web-of-certificates."
#: g10/pkclist.c:174
msgid "revoked_key.override"
msgstr "If you want to use this revoked key anyway, answer \"yes\"."
#: g10/pkclist.c:261
msgid "untrusted_key.override"
msgstr "If you want to use this untrusted key anyway, answer \"yes\"."
#: g10/pkclist.c:408
msgid "pklist.user_id.enter"
msgstr "Enter the user id of the addresse to whom you want to send the message."
#: g10/keygen.c:393
msgid "keygen.algo"
msgstr "Select the algorithm to use:"
"Needs more explanation here."
#: g10/keygen.c:437
msgid "keygen.size"
msgstr ""
#: g10/keygen.c:449
msgid "keygen.size.huge.okay"
msgstr ""
#: g10/keygen.c:458
msgid "keygen.size.large.okay"
msgstr ""
#: g10/keygen.c:499
msgid "keygen.valid"
msgstr ""
#: g10/keygen.c:523
msgid "keygen.valid.okay"
msgstr ""
#: g10/keygen.c:563
msgid "keygen.name"
msgstr ""
#: g10/keygen.c:579
msgid "keygen.email"
msgstr ""
#: g10/keygen.c:599
msgid "keygen.comment"
msgstr ""
#: g10/keygen.c:635
msgid "keygen.userid.cmd"
msgstr ""
"N to change the name.\n"
"C to change the comment.\n"
"E to change the email address.\n"
"O to continue with key generation.\n"
"Q to to quit the key generation."
#: g10/keygen.c:964
msgid "keygen.sub.okay"
msgstr "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
#: g10/keyedit.c:269
msgid "sign_uid.okay"
msgstr ""
#: g10/keyedit.c:403 g10/keyedit.c:414
msgid "delete_key.secret.okay"
msgstr ""
#: g10/keyedit.c:404
msgid "delete_key.okay"
msgstr ""
#: g10/keyedit.c:501
msgid "change_passwd.empty.okay"
msgstr ""
#: g10/keyedit.c:637
msgid "keyedit.cmd"
msgstr "Please enter \"help\"."
#: g10/keyedit.c:679
msgid "keyedit.save.okay"
msgstr ""
#: g10/keyedit.c:682
msgid "keyedit.cancel.okay"
msgstr ""
#: g10/keyedit.c:738
msgid "keyedit.signall.okay"
msgstr ""
#: g10/keyedit.c:772
msgid "keyedit.remove.uid.okay"
msgstr ""
#: g10/keyedit.c:799
msgid "keyedit.remove.subkey.okay"
msgstr ""
#: g10/passphrase.c:167
msgid "passphrase.enter"
msgstr ""
"Please enter the passhrase; this is a secret sentence \n"
" Blurb, blurb,.... "
#: g10/passphrase.c:170
msgid "passphrase.repeat"
msgstr ""
"Please repeat the last passphrase, so you are sure what you typed in."

View File

@ -1,3 +1,7 @@
Sat Aug 8 18:35:00 1998 Werner Koch (wk@(none))
* ttyio.c (cleanup): New.
Mon Aug 3 17:06:00 1998 Werner Koch (wk@(none)) Mon Aug 3 17:06:00 1998 Werner Koch (wk@(none))
* secmem.c (MAP_ANON): Add a macro test * secmem.c (MAP_ANON): Add a macro test

View File

@ -56,9 +56,22 @@ static FILE *ttyfp = NULL;
static int initialized; static int initialized;
static int last_prompt_len; static int last_prompt_len;
#ifdef HAVE_TCGETATTR
static struct termios termsave;
static int restore_termios;
#endif
#ifdef HAVE_TCGETATTR
static void
cleanup(void)
{
if( restore_termios ) {
restore_termios = 0; /* do it prios in case it is interrupted again */
if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) )
log_error("tcsetattr() failed: %s\n", strerror(errno) );
}
}
#endif
static void static void
init_ttyfp() init_ttyfp()
@ -94,6 +107,9 @@ init_ttyfp()
ttyfp = fopen("/dev/tty", "r+"); ttyfp = fopen("/dev/tty", "r+");
if( !ttyfp ) if( !ttyfp )
log_fatal("cannot open /dev/tty: %s\n", strerror(errno) ); log_fatal("cannot open /dev/tty: %s\n", strerror(errno) );
#endif
#ifdef HAVE_TCGETATTR
atexit( cleanup );
#endif #endif
initialized = 1; initialized = 1;
} }
@ -199,9 +215,6 @@ do_get( const char *prompt, int hidden )
char *buf; char *buf;
byte cbuf[1]; byte cbuf[1];
int c, n, i; int c, n, i;
#ifdef HAVE_TCGETATTR
struct termios termsave;
#endif
if( !initialized ) if( !initialized )
init_ttyfp(); init_ttyfp();
@ -252,6 +265,7 @@ do_get( const char *prompt, int hidden )
if( tcgetattr(fileno(ttyfp), &termsave) ) if( tcgetattr(fileno(ttyfp), &termsave) )
log_fatal("tcgetattr() failed: %s\n", strerror(errno) ); log_fatal("tcgetattr() failed: %s\n", strerror(errno) );
restore_termios = 1;
term = termsave; term = termsave;
term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
if( tcsetattr( fileno(ttyfp), TCSAFLUSH, &term ) ) if( tcsetattr( fileno(ttyfp), TCSAFLUSH, &term ) )
@ -284,6 +298,7 @@ do_get( const char *prompt, int hidden )
#ifdef HAVE_TCGETATTR #ifdef HAVE_TCGETATTR
if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) ) if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) )
log_error("tcsetattr() failed: %s\n", strerror(errno) ); log_error("tcsetattr() failed: %s\n", strerror(errno) );
restore_termios = 0;
#endif #endif
} }
#endif /* end unix version */ #endif /* end unix version */

View File

@ -66,7 +66,7 @@ host_alias = i586-pc-linux-gnu
host_triplet = i586-pc-linux-gnu host_triplet = i586-pc-linux-gnu
target_alias = i586-pc-linux-gnu target_alias = i586-pc-linux-gnu
target_triplet = i586-pc-linux-gnu target_triplet = i586-pc-linux-gnu
CATALOGS = de.gmo it.gmo CATALOGS = en.gmo de.gmo it.gmo
CATOBJEXT = .gmo CATOBJEXT = .gmo
CC = gcc CC = gcc
CPP = gcc -E CPP = gcc -E
@ -74,7 +74,7 @@ DATADIRNAME = share
DYNLINK_LDFLAGS = -rdynamic DYNLINK_LDFLAGS = -rdynamic
G10_LOCALEDIR = /usr/local/share/locale G10_LOCALEDIR = /usr/local/share/locale
GENCAT = GENCAT =
GMOFILES = de.gmo it.gmo GMOFILES = en.gmo de.gmo it.gmo
GMSGFMT = /usr/local/bin/msgfmt GMSGFMT = /usr/local/bin/msgfmt
GT_NO = GT_NO =
GT_YES = #YES# GT_YES = #YES#
@ -87,12 +87,12 @@ MKINSTALLDIRS = scripts/mkinstalldirs
MPI_EXTRA_ASM_OBJS = MPI_EXTRA_ASM_OBJS =
MSGFMT = /usr/local/bin/msgfmt MSGFMT = /usr/local/bin/msgfmt
PACKAGE = gnupg PACKAGE = gnupg
POFILES = de.po it.po POFILES = en.po de.po it.po
POSUB = po POSUB = po
RANLIB = ranlib RANLIB = ranlib
USE_INCLUDED_LIBINTL = yes USE_INCLUDED_LIBINTL = yes
USE_NLS = yes USE_NLS = yes
VERSION = 0.3.2b VERSION = 0.3.2c
ZLIBS = ZLIBS =
l = l =