new release
[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
35 static int pwfd = -1;
36
37 static void hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create );
38
39 void
40 set_passphrase_fd( int fd )
41 {
42     pwfd = fd;
43 }
44
45 int
46 get_passphrase_fd()
47 {
48     return pwfd;
49 }
50
51
52 /****************
53  * Get a passphrase for the secret key with KEYID, display TEXT
54  * if the user needs to enter the passphrase.
55  * mode 0 = standard, 2 = create new passphrase
56  * Returns: a DEK with a session key; caller must free
57  *          or NULL if the passphrase was not correctly repeated.
58  *          (only for mode 2)
59  *          a dek->keylen of 0 means: no passphrase entered.
60  *          (only for mode 2)
61  */
62 DEK *
63 passphrase_to_dek( u32 *keyid, int cipher_algo, STRING2KEY *s2k, int mode )
64 {
65     char *pw;
66     DEK *dek;
67     STRING2KEY help_s2k;
68
69     if( !s2k ) {
70         s2k = &help_s2k;
71         s2k->mode = 0;
72         /* this should be MD5 if cipher is IDEA, but because we do
73          * not have IDEA, we use the default one, the user
74          * can select it from the commandline
75          */
76         s2k->hash_algo = opt.def_digest_algo?opt.def_digest_algo
77                                             :DEFAULT_DIGEST_ALGO;
78     }
79
80     if( keyid && !opt.batch ) {
81         char *ustr;
82         tty_printf("Need a pass phrase to unlock the secret key for:\n");
83         tty_printf("  \"" );
84         ustr = get_user_id_string( keyid );
85         tty_print_string( ustr, strlen(ustr) );
86         m_free(ustr);
87         tty_printf("\"\n\n");
88
89     }
90     if( pwfd != -1 ) { /* read the passphrase from the given descriptor */
91         int i, len;
92
93         if( !opt.batch )
94             tty_printf("Reading from file descriptor %d ...", pwfd );
95         for( pw = NULL, i = len = 100; ; i++ ) {
96             if( i >= len-1 ) {
97                 char *pw2 = pw;
98                 len += 100;
99                 pw = m_alloc_secure( len );
100                 if( pw2 )
101                     memcpy(pw, pw2, i );
102                 i=0;
103             }
104             if( read( pwfd, pw+i, 1) != 1 || pw[i] == '\n' )
105                 break;
106         }
107         pw[i] = 0;
108         if( !opt.batch )
109             tty_printf("\b\b\b   \n" );
110     }
111     else if( opt.batch )
112         log_fatal("Can't query password in batchmode\n");
113     else {
114         pw = tty_get_hidden("Enter pass phrase: " );
115         tty_kill_prompt();
116         if( mode == 2 ) {
117             char *pw2 = tty_get_hidden("Repeat pass phrase: " );
118             tty_kill_prompt();
119             if( strcmp(pw, pw2) ) {
120                 m_free(pw2);
121                 m_free(pw);
122                 return NULL;
123             }
124             m_free(pw2);
125         }
126     }
127     dek = m_alloc_secure( sizeof *dek );
128     dek->algo = cipher_algo;
129     if( !*pw && mode == 2 )
130         dek->keylen = 0;
131     else
132         hash_passphrase( dek, pw, s2k, mode==2 );
133     m_free(pw); /* is allocated in secure memory, so it will be burned */
134     return dek;
135 }
136
137
138 /****************
139  * Hash a passphrase using the supplied s2k. If create is true, create
140  * a new salt or whatelse must be filled into the s2k for a new key.
141  * always needs: dek->algo, s2k->mode, s2k->hash_algo.
142  */
143 static void
144 hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create )
145 {
146     MD_HANDLE md;
147
148     assert( s2k->hash_algo );
149     dek->keylen = 0;
150     md = md_open( s2k->hash_algo, 1);
151     if( s2k->mode == 1 || s2k->mode == 4 ) {
152         if( create )
153             randomize_buffer(s2k->salt, 8, 1);
154         md_write( md, s2k->salt, 8 );
155     }
156     md_write( md, pw, strlen(pw) );
157     md_final( md );
158     dek->keylen = cipher_get_keylen( dek->algo ) / 8;
159     assert(dek->keylen > 0 && dek->keylen <= DIM(dek->key) );
160     memcpy( dek->key, md_read(md,0), dek->keylen );
161     md_close(md);
162 }
163