1 This document describes the private key format for OpenSSH. 2 3 1. Overall format 4 5 The key consists of a header, a list of public keys, and 6 an encrypted list of matching private keys. 7 8 #define AUTH_MAGIC "openssh-key-v1" 9 10 byte[] AUTH_MAGIC 11 string ciphername 12 string kdfname 13 string kdfoptions 14 uint32 number of keys N 15 string publickey1 16 string publickey2 17 ... 18 string publickeyN 19 string encrypted, padded list of private keys 20 21 2. KDF options for kdfname "bcrypt" 22 23 The options: 24 25 string salt 26 uint32 rounds 27 28 are concatenated and represented as a string. 29 30 3. Unencrypted list of N private keys 31 32 The list of privatekey/comment pairs is padded with the 33 bytes 1, 2, 3, ... until the total length is a multiple 34 of the cipher block size. 35 36 uint32 checkint 37 uint32 checkint 38 byte[] privatekey1 39 string comment1 40 byte[] privatekey2 41 string comment2 42 ... 43 byte[] privatekeyN 44 string commentN 45 byte 1 46 byte 2 47 byte 3 48 ... 49 byte padlen % 255 50 51 where each private key is encoded using the same rules as used for 52 SSH agent. 53 54 Before the key is encrypted, a random integer is assigned 55 to both checkint fields so successful decryption can be 56 quickly checked by verifying that both checkint fields 57 hold the same value. 58 59 4. Encryption 60 61 The KDF is used to derive a key, IV (and other values required by 62 the cipher) from the passphrase. These values are then used to 63 encrypt the unencrypted list of private keys. 64 65 5. No encryption 66 67 For unencrypted keys the cipher "none" and the KDF "none" 68 are used with empty passphrases. The options if the KDF "none" 69 are the empty string. 70 71 $OpenBSD: PROTOCOL.key,v 1.4 2024/03/30 05:56:22 djm Exp $ 72