See ChangeLog: Fri Apr 9 12:26:25 CEST 1999 Werner Koch
[gnupg.git] / g10 / passphrase.c
1 /* passphrase.c -  Get a passphrase
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26 #include <assert.h>
27 #include "util.h"
28 #include "memory.h"
29 #include "options.h"
30 #include "ttyio.h"
31 #include "cipher.h"
32 #include "keydb.h"
33 #include "main.h"
34 #include "i18n.h"
35 #include "status.h"
36
37 static char *fd_passwd = NULL;
38 static char *next_pw = NULL;
39 static char *last_pw = NULL;
40
41 static void hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create );
42
43 int
44 have_static_passphrase()
45 {
46     return !!fd_passwd;
47 }
48
49 /****************
50  * Set the passphrase to be used for the next query and only for the next
51  * one.
52  */
53 void
54 set_next_passphrase( const char *s )
55 {
56     m_free(next_pw);
57     next_pw = NULL;
58     if( s ) {
59         next_pw = m_alloc_secure( strlen(s)+1 );
60         strcpy(next_pw, s );
61     }
62 }
63
64 /****************
65  * Get the last passphrase used in passphrase_to_dek.
66  * Note: This removes the passphrase from this modules and
67  * the caller must free the result.  May return NULL:
68  */
69 char *
70 get_last_passphrase()
71 {
72     char *p = last_pw;
73     last_pw = NULL;
74     return p;
75 }
76
77
78 void
79 read_passphrase_from_fd( int fd )
80 {
81     int i, len;
82     char *pw;
83
84     if( !opt.batch )
85         tty_printf("Reading passphrase from file descriptor %d ...", fd );
86     for( pw = NULL, i = len = 100; ; i++ ) {
87         if( i >= len-1 ) {
88             char *pw2 = pw;
89             len += 100;
90             pw = m_alloc_secure( len );
91             if( pw2 )
92                 memcpy(pw, pw2, i );
93             else
94                 i=0;
95         }
96         if( read( fd, pw+i, 1) != 1 || pw[i] == '\n' )
97             break;
98     }
99     pw[i] = 0;
100     if( !opt.batch )
101         tty_printf("\b\b\b   \n" );
102
103     m_free( fd_passwd );
104     fd_passwd = pw;
105 }
106
107
108 /****************
109  * Get a passphrase for the secret key with KEYID, display TEXT
110  * if the user needs to enter the passphrase.
111  * mode 0 = standard, 2 = create new passphrase
112  * Returns: a DEK with a session key; caller must free
113  *          or NULL if the passphrase was not correctly repeated.
114  *          (only for mode 2)
115  *          a dek->keylen of 0 means: no passphrase entered.
116  *          (only for mode 2)
117  */
118 DEK *
119 passphrase_to_dek( u32 *keyid, int cipher_algo, STRING2KEY *s2k, int mode )
120 {
121     char *pw = NULL;
122     DEK *dek;
123     STRING2KEY help_s2k;
124
125     if( !s2k ) {
126         s2k = &help_s2k;
127         s2k->mode = 0;
128         /* this should be MD5 if cipher is IDEA, but because we do
129          * not have IDEA, we use the default one, the user
130          * can select it from the commandline
131          */
132         s2k->hash_algo = opt.def_digest_algo?opt.def_digest_algo
133                                             :DEFAULT_DIGEST_ALGO;
134     }
135
136     if( !next_pw && is_status_enabled() ) {
137         char buf[50];
138         if( keyid ) {
139             sprintf( buf, "%08lX%08lX", (ulong)keyid[0], (ulong)keyid[1] );
140             if( keyid[2] && keyid[3] && keyid[0] != keyid[2]
141                                      && keyid[1] != keyid[3] )
142                 sprintf( buf+strlen(buf), " %08lX%08lX",
143                                           (ulong)keyid[2], (ulong)keyid[3] );
144             write_status_text( STATUS_NEED_PASSPHRASE, buf );
145         }
146         else {
147             sprintf( buf, "%d %d %d", cipher_algo, s2k->mode, s2k->hash_algo );
148             write_status_text( STATUS_NEED_PASSPHRASE_SYM, buf );
149         }
150     }
151
152     if( keyid && !opt.batch && !next_pw ) {
153         PKT_public_key *pk = m_alloc_clear( sizeof *pk );
154         size_t n;
155         char *p;
156
157         tty_printf(_("\nYou need a passphrase to unlock the secret key for\n"
158                      "user: \"") );
159         p = get_user_id( keyid, &n );
160         tty_print_string( p, n );
161         m_free(p);
162         tty_printf("\"\n");
163
164         if( !get_pubkey( pk, keyid ) ) {
165             const char *s = pubkey_algo_to_string( pk->pubkey_algo );
166             tty_printf( _("%u-bit %s key, ID %08lX, created %s"),
167                        nbits_from_pk( pk ), s?s:"?", (ulong)keyid[1],
168                        strtimestamp(pk->timestamp) );
169             if( keyid[2] && keyid[3] && keyid[0] != keyid[2]
170                                      && keyid[1] != keyid[3] )
171                 tty_printf( _(" (main key ID %08lX)"), (ulong)keyid[3] );
172             tty_printf("\n");
173         }
174
175         tty_printf("\n");
176         free_public_key( pk );
177     }
178
179     if( next_pw ) {
180         pw = next_pw;
181         next_pw = NULL;
182     }
183     else if( fd_passwd ) {
184         pw = m_alloc_secure( strlen(fd_passwd)+1 );
185         strcpy( pw, fd_passwd );
186     }
187     else if( opt.batch )
188         log_fatal("Can't query password in batchmode\n");
189     else {
190         pw = cpr_get_hidden("passphrase.enter", _("Enter passphrase: ") );
191         tty_kill_prompt();
192         if( mode == 2 && !cpr_enabled() ) {
193             char *pw2 = cpr_get_hidden("passphrase.repeat",
194                                        _("Repeat passphrase: ") );
195             tty_kill_prompt();
196             if( strcmp(pw, pw2) ) {
197                 m_free(pw2);
198                 m_free(pw);
199                 return NULL;
200             }
201             m_free(pw2);
202         }
203     }
204
205     if( !pw || !*pw )
206         write_status( STATUS_MISSING_PASSPHRASE );
207
208     dek = m_alloc_secure( sizeof *dek );
209     dek->algo = cipher_algo;
210     if( !*pw && mode == 2 )
211         dek->keylen = 0;
212     else
213         hash_passphrase( dek, pw, s2k, mode==2 );
214     m_free(last_pw);
215     last_pw = pw;
216     return dek;
217 }
218
219
220 /****************
221  * Hash a passphrase using the supplied s2k. If create is true, create
222  * a new salt or what else must be filled into the s2k for a new key.
223  * always needs: dek->algo, s2k->mode, s2k->hash_algo.
224  */
225 static void
226 hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create )
227 {
228     MD_HANDLE md;
229     int pass, i;
230     int used = 0;
231     int pwlen = strlen(pw);
232
233     assert( s2k->hash_algo );
234     dek->keylen = cipher_get_keylen( dek->algo ) / 8;
235     if( !(dek->keylen > 0 && dek->keylen <= DIM(dek->key)) )
236         BUG();
237
238     md = md_open( s2k->hash_algo, 1);
239     for(pass=0; used < dek->keylen ; pass++ ) {
240         if( pass ) {
241             md_reset(md);
242             for(i=0; i < pass; i++ ) /* preset the hash context */
243                 md_putc(md, 0 );
244         }
245
246         if( s2k->mode == 1 || s2k->mode == 3 ) {
247             int len2 = pwlen + 8;
248             ulong count = len2;
249
250             if( create && !pass ) {
251                 randomize_buffer(s2k->salt, 8, 1);
252                 if( s2k->mode == 3 )
253                     s2k->count = 96; /* 65536 iterations */
254             }
255
256             if( s2k->mode == 3 ) {
257                 count = (16ul + (s2k->count & 15)) << ((s2k->count >> 4) + 6);
258                 if( count < len2 )
259                     count = len2;
260             }
261             /* a little bit complicated because we need a ulong for count */
262             while( count > len2 ) { /* maybe iterated+salted */
263                 md_write( md, s2k->salt, 8 );
264                 md_write( md, pw, pwlen );
265                 count -= len2;
266             }
267             if( count < 8 )
268                 md_write( md, s2k->salt, count );
269             else {
270                 md_write( md, s2k->salt, 8 );
271                 count -= 8;
272                 assert( count >= 0 );
273                 md_write( md, pw, count );
274             }
275         }
276         else
277             md_write( md, pw, pwlen );
278         md_final( md );
279         i = md_digest_length( s2k->hash_algo );
280         if( i > dek->keylen - used )
281             i = dek->keylen - used;
282         memcpy( dek->key+used, md_read(md, s2k->hash_algo), i );
283         used += i;
284     }
285     md_close(md);
286 }
287