* genkey.c (store_key): Protect the key.
[gnupg.git] / agent / keyformat.txt
1 keyformat.txt (wk 2001-12-18)
2 -----------------------------
3
4
5 Some notes on the format of the secret keys used with gpg-agent.
6
7
8 The secret keys[1] are stored on a per file basis in a directory below
9 the ~/.gnupg home directory.  This directory is named
10
11    private-keys-v1.d
12
13 and should have permissions 700.
14
15 The secret keys are stored in files with a name matching the
16 hexadecimal representation of the keygrip[2].  The content of the file
17 is an S-Expression like the ones used with Libgcrypt.  Here is an
18 example of an unprotected file:
19
20 (private-key
21  (rsa
22   (n #00e0ce9..[some bytes not shown]..51#)
23   (e #010001#)
24   (d #046129F..[some bytes not shown]..81#)
25   (p #00e861b..[some bytes not shown]..f1#)
26   (q #00f7a7c..[some bytes not shown]..61#)
27   (u #304559a..[some bytes not shown]..9b#)
28  )
29  (uri http://foo.bar x-foo:whatever_you_want)
30 )
31
32 Actually this form should not be used for regular purposes and only
33 accepted by gpg-agent with the configuration option:
34 --allow-non-canonical-key-format.  The regular way to represent the
35 keys is in canonical representation[3]:
36
37 (private-key
38    (rsa
39     (n #00e0ce9..[some bytes not shown]..51#)
40     (e #010001#)
41     (d #046129F..[some bytes not shown]..81#)
42     (p #00e861b..[some bytes not shown]..f1#)
43     (q #00f7a7c..[some bytes not shown]..61#)
44     (u #304559a..[some bytes not shown]..9b#)
45    )
46    (uri http://foo.bar x-foo:whatever_you_want)
47 )  
48
49
50
51 This describes an unprotected key; a protected key is like this:
52
53 (protected-private-key
54    (rsa
55     (n #00e0ce9..[some bytes not shown]..51#)
56     (e #010001#)
57     (protected mode (parms) encrypted_octet_string)
58    )
59    (uri http://foo.bar x-foo:whatever_you_want)
60 )  
61
62
63 In this scheme the encrypted_octet_string is encrypted according to
64 the algorithm described after the keyword protected; most protection
65 algorithms need some parameters, which are given in a list before the
66 encrypted_octet_string.  The result of the decryption process is a
67 list of the secret key parameters.
68
69 The only available protection mode for now is
70
71   openpgp-s2k3-sha1-aes-cbc
72
73 which describesan algorithm using using AES in CBC mode for
74 encryption, SHA-1 for integrity protection and the String to Key
75 algorithm 3 from OpenPGP (rfc2440).
76
77 Example:
78
79 (protected openpgp-s2k3-sha1-aes-cbc
80   ((sha1 16byte_salt no_of_iterations) 16byte_iv)
81   encrypted_octet_string
82 )
83
84 The encrypted_octet string should yield this S-Exp (in canonical
85 representation) after decryption:
86
87 (
88  (
89   (d #046129F..[some bytes not shown]..81#)
90   (p #00e861b..[some bytes not shown]..f1#)
91   (q #00f7a7c..[some bytes not shown]..61#)
92   (u #304559a..[some bytes not shown]..9b#) 
93  ) 
94  (hash sha1 #...[hashvalue]...#)
95 )
96
97 For padding reasons, random bytes are appended to this list - they can
98 easily be stripped by looking for the end of the list.
99
100 The hash is calculated on the concatenation of the public key and
101 secret key parameter lists: i.e it is required to hash the
102 concatenation of these 6 canonical encoded lists for RSA, including
103 the parenthesis and the algorithm keyword.
104
105 (rsa
106  (n #00e0ce9..[some bytes not shown]..51#)
107  (e #010001#)
108  (d #046129F..[some bytes not shown]..81#)
109  (p #00e861b..[some bytes not shown]..f1#)
110  (q #00f7a7c..[some bytes not shown]..61#)
111  (u #304559a..[some bytes not shown]..9b#)
112 )
113
114 After decryption the hash must be recalculated and compared against
115 the stored one - If they don't match the integrity of the key is not
116 given.
117
118
119
120
121
122
123 Notes:
124
125 [1] I usually use the terms private and secret key exchangeable but prefer the
126 term secret key because it can be visually be better distinguished
127 from the term public key.
128
129 [2] The keygrip is a unique identifier for a key pair, it is
130 independent of any protocol, so that the same key can be ised with
131 different protocols.  PKCS-15 calls this a subjectKeyHash; it can be
132 calculate using Libgcrypt's gcry_pk_get_keygrip().
133
134 [3] Even when canonical representation is required we will show the
135 S-expression here in a more readable representation.