(confucius_mktmpdir): Changed to use mkdtmp(3).
[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 Location of keys
8 ================
9 The secret keys[1] are stored on a per file basis in a directory below
10 the ~/.gnupg home directory.  This directory is named
11
12    private-keys-v1.d
13
14 and should have permissions 700.
15
16 The secret keys are stored in files with a name matching the
17 hexadecimal representation of the keygrip[2].
18
19 Unprotected Private Key Format
20 ==============================
21 The content of the file is an S-Expression like the ones used with
22 Libgcrypt.  Here is an example of an unprotected file:
23
24 (private-key
25  (rsa
26   (n #00e0ce9..[some bytes not shown]..51#)
27   (e #010001#)
28   (d #046129F..[some bytes not shown]..81#)
29   (p #00e861b..[some bytes not shown]..f1#)
30   (q #00f7a7c..[some bytes not shown]..61#)
31   (u #304559a..[some bytes not shown]..9b#)
32  )
33  (uri http://foo.bar x-foo:whatever_you_want)
34  (comment whatever)
35 )
36
37 "comment" and "uri" are optional.  "comment" is currently used to keep
38 track of ssh key comments.
39
40 Actually this form should not be used for regular purposes and only
41 accepted by gpg-agent with the configuration option:
42 --allow-non-canonical-key-format.  The regular way to represent the
43 keys is in canonical representation[3]:
44
45 (private-key
46    (rsa
47     (n #00e0ce9..[some bytes not shown]..51#)
48     (e #010001#)
49     (d #046129F..[some bytes not shown]..81#)
50     (p #00e861b..[some bytes not shown]..f1#)
51     (q #00f7a7c..[some bytes not shown]..61#)
52     (u #304559a..[some bytes not shown]..9b#)
53    )
54    (uri http://foo.bar x-foo:whatever_you_want)
55 )  
56
57
58 Protected Private Key Format
59 ==============================
60 A protected key is like this:
61
62 (protected-private-key
63    (rsa
64     (n #00e0ce9..[some bytes not shown]..51#)
65     (e #010001#)
66     (protected mode (parms) encrypted_octet_string)
67    )
68    (uri http://foo.bar x-foo:whatever_you_want)
69    (comment whatever)
70 )  
71
72
73 In this scheme the encrypted_octet_string is encrypted according to
74 the algorithm described after the keyword protected; most protection
75 algorithms need some parameters, which are given in a list before the
76 encrypted_octet_string.  The result of the decryption process is a
77 list of the secret key parameters.
78
79 The only available protection mode for now is
80
81   openpgp-s2k3-sha1-aes-cbc
82
83 which describes an algorithm using using AES in CBC mode for
84 encryption, SHA-1 for integrity protection and the String to Key
85 algorithm 3 from OpenPGP (rfc2440).
86
87 Example:
88
89 (protected openpgp-s2k3-sha1-aes-cbc
90   ((sha1 16byte_salt no_of_iterations) 16byte_iv)
91   encrypted_octet_string
92 )
93
94 The encrypted_octet string should yield this S-Exp (in canonical
95 representation) after decryption:
96
97 (
98  (
99   (d #046129F..[some bytes not shown]..81#)
100   (p #00e861b..[some bytes not shown]..f1#)
101   (q #00f7a7c..[some bytes not shown]..61#)
102   (u #304559a..[some bytes not shown]..9b#) 
103  ) 
104  (hash sha1 #...[hashvalue]...#)
105 )
106
107 For padding reasons, random bytes are appended to this list - they can
108 easily be stripped by looking for the end of the list.
109
110 The hash is calculated on the concatenation of the public key and
111 secret key parameter lists: i.e it is required to hash the
112 concatenation of these 6 canonical encoded lists for RSA, including
113 the parenthesis and the algorithm keyword.
114
115 (rsa
116  (n #00e0ce9..[some bytes not shown]..51#)
117  (e #010001#)
118  (d #046129F..[some bytes not shown]..81#)
119  (p #00e861b..[some bytes not shown]..f1#)
120  (q #00f7a7c..[some bytes not shown]..61#)
121  (u #304559a..[some bytes not shown]..9b#)
122 )
123
124 After decryption the hash must be recalculated and compared against
125 the stored one - If they don't match the integrity of the key is not
126 given.
127
128
129 Shadowed Private Key Format
130 ============================
131 To keep track of keys stored on IC cards we use a third format for
132 private kyes which are called shadow keys as they are only a reference
133 to keys stored on a token:
134
135 (shadowed-private-key
136    (rsa
137     (n #00e0ce9..[some bytes not shown]..51#)
138     (e #010001#)
139     (shadowed protocol (info))
140    )
141    (uri http://foo.bar x-foo:whatever_you_want)
142    (comment whatever)
143 )  
144
145 The currently used protocol is "ti-v1" (token info version 1).  The
146 second list with the information has this layout:
147
148 (card_serial_number id_string_of_key)
149
150 More items may be added to the list.
151
152
153
154
155
156
157 Notes:
158 ======
159 [1] I usually use the terms private and secret key exchangeable but prefer the
160 term secret key because it can be visually be better distinguished
161 from the term public key.
162
163 [2] The keygrip is a unique identifier for a key pair, it is
164 independent of any protocol, so that the same key can be used with
165 different protocols.  PKCS-15 calls this a subjectKeyHash; it can be
166 calculated using Libgcrypt's gcry_pk_get_keygrip ().
167
168 [3] Even when canonical representation are required we will show the
169 S-expression here in a more readable representation.