7dbaeb46697ee18c028fe86c538db966c5b9f070
[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 int pwfd = -1;
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 void
44 set_passphrase_fd( int fd )
45 {
46     pwfd = fd;
47 }
48
49 int
50 get_passphrase_fd()
51 {
52     return pwfd;
53 }
54
55 /****************
56  * Set the passphrase to be used for the next query and only for the next
57  * one.
58  */
59 void
60 set_next_passphrase( const char *s )
61 {
62     m_free(next_pw);
63     next_pw = NULL;
64     if( s ) {
65         next_pw = m_alloc_secure( strlen(s)+1 );
66         strcpy(next_pw, s );
67     }
68 }
69
70 /****************
71  * Get the last passphrase used in passphrase_to_dek.
72  * Note: This removes the passphrase from this modules and
73  * the caller must free the result.  May return NULL:
74  */
75 char *
76 get_last_passphrase()
77 {
78     char *p = last_pw;
79     last_pw = NULL;
80     return p;
81 }
82
83
84 /****************
85  * Get a passphrase for the secret key with KEYID, display TEXT
86  * if the user needs to enter the passphrase.
87  * mode 0 = standard, 2 = create new passphrase
88  * Returns: a DEK with a session key; caller must free
89  *          or NULL if the passphrase was not correctly repeated.
90  *          (only for mode 2)
91  *          a dek->keylen of 0 means: no passphrase entered.
92  *          (only for mode 2)
93  */
94 DEK *
95 passphrase_to_dek( u32 *keyid, int cipher_algo, STRING2KEY *s2k, int mode )
96 {
97     char *pw = NULL;
98     DEK *dek;
99     STRING2KEY help_s2k;
100
101     if( !s2k ) {
102         s2k = &help_s2k;
103         s2k->mode = 0;
104         /* this should be MD5 if cipher is IDEA, but because we do
105          * not have IDEA, we use the default one, the user
106          * can select it from the commandline
107          */
108         s2k->hash_algo = opt.def_digest_algo?opt.def_digest_algo
109                                             :DEFAULT_DIGEST_ALGO;
110     }
111
112     if( keyid && !opt.batch && !next_pw ) {
113         PKT_public_key *pk = m_alloc_clear( sizeof *pk );
114         size_t n;
115         char *p;
116
117         tty_printf(_("\nYou need a passphrase to unlock the secret key for\n"
118                      "user: \"") );
119         p = get_user_id( keyid, &n );
120         tty_print_string( p, n );
121         m_free(p);
122         tty_printf("\"\n");
123
124         if( !get_pubkey( pk, keyid ) ) {
125             const char *s = pubkey_algo_to_string( pk->pubkey_algo );
126             tty_printf( _("(%u-bit %s key, ID %08lX, created %s)\n"),
127                        nbits_from_pk( pk ), s?s:"?", (ulong)keyid[1],
128                        strtimestamp(pk->timestamp) );
129         }
130         tty_printf("\n");
131         free_public_key( pk );
132     }
133     else if( keyid && !next_pw ) {
134         char buf[20];
135         sprintf( buf, "%08lX%08lX", (ulong)keyid[0], (ulong)keyid[1] );
136         write_status_text( STATUS_NEED_PASSPHRASE, buf );
137     }
138
139     if( next_pw ) {
140         pw = next_pw;
141         next_pw = NULL;
142     }
143     else if( pwfd != -1 ) { /* read the passphrase from the file */
144         int i, len;
145
146         if( !opt.batch )
147             tty_printf("Reading from file descriptor %d ...", pwfd );
148         for( pw = NULL, i = len = 100; ; i++ ) {
149             if( i >= len-1 ) {
150                 char *pw2 = pw;
151                 len += 100;
152                 pw = m_alloc_secure( len );
153                 if( pw2 )
154                     memcpy(pw, pw2, i );
155                 i=0;
156             }
157             if( read( pwfd, pw+i, 1) != 1 || pw[i] == '\n' )
158                 break;
159         }
160         pw[i] = 0;
161         if( !opt.batch )
162             tty_printf("\b\b\b   \n" );
163     }
164     else if( opt.batch )
165         log_fatal("Can't query password in batchmode\n");
166     else {
167         pw = cpr_get_hidden(N_("passphrase.enter"), _("Enter pass phrase: ") );
168         tty_kill_prompt();
169         if( mode == 2 && !cpr_enabled() ) {
170             char *pw2 = cpr_get_hidden(N_("passphrase.repeat"),
171                                        _("Repeat pass phrase: ") );
172             tty_kill_prompt();
173             if( strcmp(pw, pw2) ) {
174                 m_free(pw2);
175                 m_free(pw);
176                 return NULL;
177             }
178             m_free(pw2);
179         }
180     }
181     dek = m_alloc_secure( sizeof *dek );
182     dek->algo = cipher_algo;
183     if( !*pw && mode == 2 )
184         dek->keylen = 0;
185     else
186         hash_passphrase( dek, pw, s2k, mode==2 );
187     m_free(last_pw);
188     last_pw = pw;
189     return dek;
190 }
191
192
193 /****************
194  * Hash a passphrase using the supplied s2k. If create is true, create
195  * a new salt or whatelse must be filled into the s2k for a new key.
196  * always needs: dek->algo, s2k->mode, s2k->hash_algo.
197  */
198 static void
199 hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create )
200 {
201     MD_HANDLE md;
202
203     assert( s2k->hash_algo );
204     dek->keylen = 0;
205     md = md_open( s2k->hash_algo, 1);
206     if( s2k->mode == 1 || s2k->mode == 3 ) {
207         ulong count = 0;
208         int len = strlen(pw);
209         int len2 = len + 8;
210
211         if( create )
212             randomize_buffer(s2k->salt, 8, 1);
213
214         if( s2k->mode == 3 ) {
215             count = (16ul + (s2k->count & 15)) << ((s2k->count >> 4) + 6);
216             log_debug("s2k iteration count=%lu\n", count );
217         }
218         for(;;) {
219             md_write( md, s2k->salt, 8 );
220             md_write( md, pw, len );
221             if( count <= len2 )
222                 break;
223             count -= len2;
224         }
225         if( count ) {
226             if( count < 8 ) {
227                 md_write( md, s2k->salt, count );
228             }
229             else {
230                 md_write( md, s2k->salt, 8 );
231                 count -= 8;
232                 assert( count <= len );
233                 md_write( md, pw, count );
234             }
235         }
236     }
237     else
238         md_write( md, pw, strlen(pw) );
239     md_final( md );
240     dek->keylen = cipher_get_keylen( dek->algo ) / 8;
241     assert(dek->keylen > 0 && dek->keylen <= DIM(dek->key) );
242     memcpy( dek->key, md_read(md,0), dek->keylen );
243     md_close(md);
244 }
245