2002-04-24 Marcus Brinkmann <marcus@g10code.de>
[gnupg.git] / agent / keyformat.txt
blobbfb4ee4d4b92b3406c17682082c2f9c2c3c5e613
1 keyformat.txt (wk 2001-12-18)
2 -----------------------------
5 Some notes on the format of the secret keys used with gpg-agent.
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
12    private-keys-v1.d
14 and should have permissions 700.
16 The secret keys are stored in files with a name matching the
17 hexadecimal representation of the keygrip[2].
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:
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)
36 Actually this form should not be used for regular purposes and only
37 accepted by gpg-agent with the configuration option:
38 --allow-non-canonical-key-format.  The regular way to represent the
39 keys is in canonical representation[3]:
41 (private-key
42    (rsa
43     (n #00e0ce9..[some bytes not shown]..51#)
44     (e #010001#)
45     (d #046129F..[some bytes not shown]..81#)
46     (p #00e861b..[some bytes not shown]..f1#)
47     (q #00f7a7c..[some bytes not shown]..61#)
48     (u #304559a..[some bytes not shown]..9b#)
49    )
50    (uri http://foo.bar x-foo:whatever_you_want)
51 )  
54 Protected Private Key Format
55 ==============================
56 A protected key is like this:
58 (protected-private-key
59    (rsa
60     (n #00e0ce9..[some bytes not shown]..51#)
61     (e #010001#)
62     (protected mode (parms) encrypted_octet_string)
63    )
64    (uri http://foo.bar x-foo:whatever_you_want)
65 )  
68 In this scheme the encrypted_octet_string is encrypted according to
69 the algorithm described after the keyword protected; most protection
70 algorithms need some parameters, which are given in a list before the
71 encrypted_octet_string.  The result of the decryption process is a
72 list of the secret key parameters.
74 The only available protection mode for now is
76   openpgp-s2k3-sha1-aes-cbc
78 which describesan algorithm using using AES in CBC mode for
79 encryption, SHA-1 for integrity protection and the String to Key
80 algorithm 3 from OpenPGP (rfc2440).
82 Example:
84 (protected openpgp-s2k3-sha1-aes-cbc
85   ((sha1 16byte_salt no_of_iterations) 16byte_iv)
86   encrypted_octet_string
89 The encrypted_octet string should yield this S-Exp (in canonical
90 representation) after decryption:
93  (
94   (d #046129F..[some bytes not shown]..81#)
95   (p #00e861b..[some bytes not shown]..f1#)
96   (q #00f7a7c..[some bytes not shown]..61#)
97   (u #304559a..[some bytes not shown]..9b#) 
98  ) 
99  (hash sha1 #...[hashvalue]...#)
102 For padding reasons, random bytes are appended to this list - they can
103 easily be stripped by looking for the end of the list.
105 The hash is calculated on the concatenation of the public key and
106 secret key parameter lists: i.e it is required to hash the
107 concatenation of these 6 canonical encoded lists for RSA, including
108 the parenthesis and the algorithm keyword.
110 (rsa
111  (n #00e0ce9..[some bytes not shown]..51#)
112  (e #010001#)
113  (d #046129F..[some bytes not shown]..81#)
114  (p #00e861b..[some bytes not shown]..f1#)
115  (q #00f7a7c..[some bytes not shown]..61#)
116  (u #304559a..[some bytes not shown]..9b#)
119 After decryption the hash must be recalculated and compared against
120 the stored one - If they don't match the integrity of the key is not
121 given.
124 Shadowed Private Key Format
125 ============================
126 To keep track of keys stored on IC cards we use a third format for
127 private kyes which are called shadow keys as they are only a reference
128 to keys stored on a token:
130 (shadowed-private-key
131    (rsa
132     (n #00e0ce9..[some bytes not shown]..51#)
133     (e #010001#)
134     (shadowed protocol (info))
135    )
136    (uri http://foo.bar x-foo:whatever_you_want)
137 )  
139 The currently used protocol is "ti-v1" (token info version 1).  The
140 second list with the information has this layout:
142 (card_serial_number id_string_of_key)
144 More items may be added to the list.
151 Notes:
152 ======
153 [1] I usually use the terms private and secret key exchangeable but prefer the
154 term secret key because it can be visually be better distinguished
155 from the term public key.
157 [2] The keygrip is a unique identifier for a key pair, it is
158 independent of any protocol, so that the same key can be ised with
159 different protocols.  PKCS-15 calls this a subjectKeyHash; it can be
160 calculate using Libgcrypt's gcry_pk_get_keygrip().
162 [3] Even when canonical representation is required we will show the
163 S-expression here in a more readable representation.