aboutsummaryrefslogtreecommitdiffstats
path: root/agent/keyformat.txt
diff options
context:
space:
mode:
Diffstat (limited to 'agent/keyformat.txt')
-rw-r--r--agent/keyformat.txt73
1 files changed, 36 insertions, 37 deletions
diff --git a/agent/keyformat.txt b/agent/keyformat.txt
index 4f81f5b1d..ab2ad65fd 100644
--- a/agent/keyformat.txt
+++ b/agent/keyformat.txt
@@ -6,7 +6,7 @@ Some notes on the format of the secret keys used with gpg-agent.
The secret keys[1] are stored on a per file basis in a directory below
-the .gnupg home directory. This directory is named
+the ~/.gnupg home directory. This directory is named
private-keys-v1.d
@@ -26,19 +26,15 @@ example of an unprotected file:
(q #00f7a7c..[some bytes not shown]..61#)
(u #304559a..[some bytes not shown]..9b#)
)
+ (uri http://foo.bar x-foo:whatever_you_want)
)
Actually this form should not be used for regular purposes and only
accepted by gpg-agent with the configuration option:
---allow-non-canonical-key-format.
+--allow-non-canonical-key-format. The regular way to represent the
+keys is in canonical representation[3]:
-The regular way to represent the keys is in canonical representation
-with the additional requirement of an extra object container around
-it[3]:
-
-(oid.1.3.6.1.4.1.11591.2.2.2
- (keyinfo human_readable_information_to_decribe_this_key)
- (private-key
+(private-key
(rsa
(n #00e0ce9..[some bytes not shown]..51#)
(e #010001#)
@@ -47,76 +43,79 @@ it[3]:
(q #00f7a7c..[some bytes not shown]..61#)
(u #304559a..[some bytes not shown]..9b#)
)
- )
-)
+ (uri http://foo.bar x-foo:whatever_you_want)
+)
+
This describes an unprotected key; a protected key is like this:
-(oid.1.3.6.1.4.1.11591.2.2.3
- (keyinfo human_readable_information_to_decribe_this_key)
- (private-key
+(protected-private-key
(rsa
(n #00e0ce9..[some bytes not shown]..51#)
(e #010001#)
- (oid.1.3.6.1.4.1.11591.2.1.1.1 (parms) encrypted_octet_string)
+ (protected mode (parms) encrypted_octet_string)
)
- )
-)
+ (uri http://foo.bar x-foo:whatever_you_want)
+)
+
In this scheme the encrypted_octet_string is encrypted according to
-the scheme identifier by the OID, most protection algorithms need
-some parameters, which are given in a list before the
+the algorithm described after the keyword protected; most protection
+algorithms need some parameters, which are given in a list before the
encrypted_octet_string. The result of the decryption process is a
list of the secret key parameters.
-Defined protection methods are:
+The only available protection mode for now is
-1.3.6.1.4.1.gnu(11591).aegypten(2)
-.algorithms(1).keyprotection(1).s2k3-sha1-aes-cbc(1)
+ openpgp-s2k3-sha1-aes-cbc
-This uses AES in CBC mode for encryption, SHA-1 for integrity
-protection and the String to Key algorithm 3 from OpenPGP (rfc2440).
+which describesan algorithm using using AES in CBC mode for
+encryption, SHA-1 for integrity protection and the String to Key
+algorithm 3 from OpenPGP (rfc2440).
Example:
-(oid.1.3.6.1.4.1.11591.2.1.1.1
- ((salt iterations) iv)
+(protected openpgp-s2k3-sha1-aes-cbc
+ ((sha1 16byte_salt no_of_iterations) 16byte_iv)
encrypted_octet_string
)
The encrypted_octet string should yield this S-Exp (in canonical
representation) after decryption:
-(sha1_hash
- (d #046129F..[some bytes not shown]..81#)
- (p #00e861b..[some bytes not shown]..f1#)
- (q #00f7a7c..[some bytes not shown]..61#)
- (u #304559a..[some bytes not shown]..9b#)
+(
+ (
+ (d #046129F..[some bytes not shown]..81#)
+ (p #00e861b..[some bytes not shown]..f1#)
+ (q #00f7a7c..[some bytes not shown]..61#)
+ (u #304559a..[some bytes not shown]..9b#)
+ )
+ (hash sha1 #...[hashvalue]...#)
)
For padding reasons, random bytes are appended to this list - they can
easily be stripped by looking for the end of the list.
-The first element is the SHA-1 hash calculated on the concatenation of the
-public key and secret key parameter lists: i.e one has to hash the
-concatenatiohn of these 6 canonical encoded lists for RSA, including
-the parenthesis.
+The hash is calculated on the concatenation of the public key and
+secret key parameter lists: i.e it is required to hash the
+concatenation of these 6 canonical encoded lists for RSA, including
+the parenthesis and the algorithm keyword.
+(rsa
(n #00e0ce9..[some bytes not shown]..51#)
(e #010001#)
(d #046129F..[some bytes not shown]..81#)
(p #00e861b..[some bytes not shown]..f1#)
(q #00f7a7c..[some bytes not shown]..61#)
(u #304559a..[some bytes not shown]..9b#)
-
+)
After decryption the hash must be recalculated and compared against
the stored one - If they don't match the integrity of the key is not
given.
-TODO: write a more elaborated version.