Import OpenPGP keys into the agent.
[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  (created-at timestamp)
34  (uri http://foo.bar x-foo:whatever_you_want)
35  (comment whatever)
36 )
37
38 "comment", "created-at" and "uri" are optional.  "comment" is
39 currently used to keep track of ssh key comments. "created-at" is used
40 to keep track of the creation time stamp used with OpenPGP keys; it is
41 optional but required for some operations to calculate the fingerprint
42 of the key.  This timestamp should be a string with the number of
43 seconds since Epoch or an ISO time string (yyyymmddThhmmss).
44
45 Actually this form should not be used for regular purposes and only
46 accepted by gpg-agent with the configuration option:
47 --allow-non-canonical-key-format.  The regular way to represent the
48 keys is in canonical representation[3]:
49
50 (private-key
51    (rsa
52     (n #00e0ce9..[some bytes not shown]..51#)
53     (e #010001#)
54     (d #046129F..[some bytes not shown]..81#)
55     (p #00e861b..[some bytes not shown]..f1#)
56     (q #00f7a7c..[some bytes not shown]..61#)
57     (u #304559a..[some bytes not shown]..9b#)
58    )
59    (uri http://foo.bar x-foo:whatever_you_want)
60 )  
61
62
63 Protected Private Key Format
64 ==============================
65 A protected key is like this:
66
67 (protected-private-key
68    (rsa
69     (n #00e0ce9..[some bytes not shown]..51#)
70     (e #010001#)
71     (protected mode (parms) encrypted_octet_string)
72     (protected-at <isotimestamp>)
73    )
74    (uri http://foo.bar x-foo:whatever_you_want)
75    (comment whatever)
76 )  
77
78
79 In this scheme the encrypted_octet_string is encrypted according to
80 the algorithm described after the keyword protected; most protection
81 algorithms need some parameters, which are given in a list before the
82 encrypted_octet_string.  The result of the decryption process is a
83 list of the secret key parameters.  The protected-at expression is
84 optional; the isotimestamp is 15 bytes long (e.g. "19610711T172000").
85
86 The only available protection mode for now is
87
88   openpgp-s2k3-sha1-aes-cbc
89
90 which describes an algorithm using using AES in CBC mode for
91 encryption, SHA-1 for integrity protection and the String to Key
92 algorithm 3 from OpenPGP (rfc2440).
93
94 Example:
95
96 (protected openpgp-s2k3-sha1-aes-cbc
97   ((sha1 16byte_salt no_of_iterations) 16byte_iv)
98   encrypted_octet_string
99 )
100
101 The encrypted_octet string should yield this S-Exp (in canonical
102 representation) after decryption:
103
104 (
105  (
106   (d #046129F..[some bytes not shown]..81#)
107   (p #00e861b..[some bytes not shown]..f1#)
108   (q #00f7a7c..[some bytes not shown]..61#)
109   (u #304559a..[some bytes not shown]..9b#) 
110  ) 
111  (hash sha1 #...[hashvalue]...#)
112 )
113
114 For padding reasons, random bytes are appended to this list - they can
115 easily be stripped by looking for the end of the list. 
116
117 The hash is calculated on the concatenation of the public key and
118 secret key parameter lists: i.e it is required to hash the
119 concatenation of these 6 canonical encoded lists for RSA, including
120 the parenthesis, the algorithm keyword and (if used) the protected-at
121 list.
122
123 (rsa
124  (n #00e0ce9..[some bytes not shown]..51#)
125  (e #010001#)
126  (d #046129F..[some bytes not shown]..81#)
127  (p #00e861b..[some bytes not shown]..f1#)
128  (q #00f7a7c..[some bytes not shown]..61#)
129  (u #304559a..[some bytes not shown]..9b#)
130  (protected-at "18950523T000000")
131 )
132
133 After decryption the hash must be recalculated and compared against
134 the stored one - If they don't match the integrity of the key is not
135 given.
136
137
138 Shadowed Private Key Format
139 ============================
140 To keep track of keys stored on IC cards we use a third format for
141 private kyes which are called shadow keys as they are only a reference
142 to keys stored on a token:
143
144 (shadowed-private-key
145    (rsa
146     (n #00e0ce9..[some bytes not shown]..51#)
147     (e #010001#)
148     (shadowed protocol (info))
149    )
150    (uri http://foo.bar x-foo:whatever_you_want)
151    (comment whatever)
152 )  
153
154 The currently used protocol is "ti-v1" (token info version 1).  The
155 second list with the information has this layout:
156
157 (card_serial_number id_string_of_key)
158
159 More items may be added to the list.
160
161
162 OpenPGP Private Key Transfer Format
163 ===================================
164
165 This format is used to transfer keys between gpg and gpg-agent.
166
167 (openpgp-private-key
168   (version V)
169   (protection PROTTYPE PROTALGO IV S2KMODE S2KHASH S2KSALT S2KCOUNT)
170   (algo PUBKEYALGO)
171   (skey CSUM c P1 c P2 c P3 ... e PN))
172
173
174 * V is the packet version number (3 or 4).
175 * PUBKEYALGO is a Libgcrypt algo name 
176 * CSUM is the 16 bit checksum as defined by OpenPGP.
177 * P1 .. PN are the parameters; the public parameters are never encrypted
178   the secrect key parameters are encrypted if the "protection" list is
179   given.  To make this more explicit each parameter is preceded by a
180   flag "_" for cleartext or "e" for encrypted text.
181 * If PROTTYPE is "sha1" the new style SHA1 checksum is used if it is "sum"
182   the old 16 bit checksum is used and if it is "none" no protection at
183   all is used.
184 * PROTALGO is a Libgcrypt style cipher algorithm name
185 * IV is the initialization verctor.
186 * S2KMODE is the value from RFC-4880.
187 * S2KHASH is a a libgcrypt style hash algorithm identifier.
188 * S2KSALT is the 8 byte salt
189 * S2KCOUNT is the count value from RFC-4880.
190
191
192
193 Notes:
194 ======
195 [1] I usually use the terms private and secret key exchangeable but prefer the
196 term secret key because it can be visually be better distinguished
197 from the term public key.
198
199 [2] The keygrip is a unique identifier for a key pair, it is
200 independent of any protocol, so that the same key can be used with
201 different protocols.  PKCS-15 calls this a subjectKeyHash; it can be
202 calculated using Libgcrypt's gcry_pk_get_keygrip ().
203
204 [3] Even when canonical representation are required we will show the
205 S-expression here in a more readable representation.