|
|
1.1 ! root 1: Appendix A. (Beta test release 22 May 91) ! 2: ! 3: ! 4: Internal Data Structures Used by PGP ! 5: ==================================== ! 6: ! 7: This appendix describes the data structures used internally by Pretty ! 8: Good Privacy (PGP), the RSA public key cryptography application. The ! 9: intended audience mainly includes software engineers trying to port ! 10: PGP to other hardware environments or trying to implement other PGP- ! 11: compatible cryptography products. ! 12: ! 13: Some of these data structures may change before PGP is released. ! 14: Also, CRC-16 frame checks may be added to some packets. ! 15: ! 16: ! 17: Byte Order ! 18: ---------- ! 19: ! 20: All integer data used by PGP is externally stored least significant ! 21: byte (LSB) first, regardless of the byte order used internally by the ! 22: host CPU architecture. This is for cross-compatibility of messages ! 23: and keys between hosts. This covers multiprecision RSA integers, bit ! 24: count prefix fields, byte count prefix fields, key IDs, and ! 25: timestamps. ! 26: ! 27: ! 28: Multiprecision Integers ! 29: ----------------------- ! 30: ! 31: RSA arithmetic involves a lot of multiprecision integers, often ! 32: having hundreds of bits of precision. PGP externally stores a ! 33: multiprecision integer (MPI) with a 16-bit prefix that gives the ! 34: number of significant bits in the integer that follows. The integer ! 35: that follows this bitcount field is stored LSB first, with the MSB ! 36: padded with zero bits if the bitcount is not a multiple of 8. The ! 37: bitcount always specifies the exact number of significant bits. For ! 38: example, the integer value 5 would be stored as these three bytes: ! 39: ! 40: 03 00 05 ! 41: ! 42: An MPI with a value of zero is simply stored with the 16-bit bitcount ! 43: prefix field containing a 0, with no value bytes following it. ! 44: ! 45: ! 46: ! 47: Key ID ! 48: ------ ! 49: ! 50: Some packets use a "key ID" field. The key ID is the least ! 51: significant 64 bits of the RSA public modulus that was involved in ! 52: creating the packet. For all practical purposes it unique to each ! 53: RSA public key. ! 54: ! 55: ! 56: User ID ! 57: ------- ! 58: ! 59: Some packets contain a "user ID", which is an ASCII string that ! 60: contains the user's name. Unlike a C string, the user ID has a ! 61: length byte at the beginning that has a byte count of the rest of the ! 62: string. This length byte does not include itself in the count. ! 63: ! 64: ! 65: Timestamp ! 66: --------- ! 67: ! 68: Some packets contain a timestamp, which is a 32-bit unsigned integer ! 69: of the number of seconds elapsed since 1970 Jan 1 00:00:00 GMT. This ! 70: is the standard format used by Unix timestamps. It spans 136 years. ! 71: ! 72: ! 73: ! 74: Cipher Type Byte (CTB) ! 75: ---------------------- ! 76: ! 77: Many of these data structures begin with a Cipher Type Byte (CTB), ! 78: which specifies the type of data structure that follows it. The CTB ! 79: bit fields have the following meaning (bit 0 is the LSB, bit 7 is the ! 80: MSB): ! 81: ! 82: Bit 7: Always 1, which designates this as a CTB ! 83: Bit 6: Reserved. ! 84: Bits 5-2: CTB type field, specifies type of packet that follows ! 85: 0001 - RSA public-key-encrypted packet ! 86: 0010 - RSA secret-key-encrypted (signed) packet ! 87: 0011 - Message digest packet ! 88: 0100 - Conventional key packet ! 89: 0101 - Secret key certificate ! 90: 0110 - Public key certificate ! 91: 1000 - Compressed data packet ! 92: 1001 - Conventional-Key-Encrypted data ! 93: 1100 - Raw literal plaintext data ! 94: Other CTB packet types are unimplemented. ! 95: Bits 1-0: Length-of-length field: ! 96: 00 - 1 byte packet length field follows CTB ! 97: 01 - 2 byte packet length field follows CTB ! 98: 10 - 4 byte packet length field follows CTB ! 99: 11 - no length field follows CTB, unknown packet length. ! 100: The 8-, 16-, or 32-bit packet length field after the CTB ! 101: gives the length in bytes of the rest of the packet, not ! 102: counting the CTB and the packet length field. ! 103: ! 104: ! 105: ! 106: RSA public-key-encrypted packet ! 107: ------------------------------- ! 108: ! 109: Offset Length Meaning ! 110: 0 1 CTB for RSA public-key-encrypted packet ! 111: 1 2 16-bit length of packet ! 112: 3 8 64-bit Key ID ! 113: 11 ? RSA-encrypted integer, encrypted conventional key ! 114: packet. (MPI with bitcount prefix) ! 115: ! 116: The conventionally-encrypted ciphertext packet begins right after the ! 117: RSA public-key-encrypted packet that contains the conventional key. ! 118: ! 119: ! 120: ! 121: RSA secret-key-encrypted (signed) packet ! 122: ---------------------------------------- ! 123: ! 124: Offset Length Meaning ! 125: 0 1 CTB for RSA secret-key-encrypted (signed) packet ! 126: 1 2 16-bit length of packet ! 127: 3 8 64-bit Key ID ! 128: 11 ? RSA-encrypted integer, encrypted message digest ! 129: packet. (MPI with bitcount prefix) ! 130: ! 131: If the plaintext that was signed is included in the same file as the ! 132: signature packet, it begins right after the RSA secret-key-signed ! 133: packet that contains the message digest. The plaintext has a ! 134: "literal" CTB prefix. ! 135: ! 136: ! 137: ! 138: Message digest packet ! 139: --------------------- ! 140: ! 141: Offset Length Meaning ! 142: 0 1 CTB for Message digest packet ! 143: 1 1 8-bit length of packet ! 144: 2 1 Message digest algorithm selector byte ! 145: 3 16 128-bit message digest ! 146: 19 4 32-bit timestamp ! 147: ! 148: ! 149: ! 150: Conventional key packet ! 151: ----------------------- ! 152: ! 153: Offset Length Meaning ! 154: 0 1 CTB for Conventional key packet ! 155: 1 1 8-bit length of packet ! 156: 2 1 Conventional encryption algorithm selector byte ! 157: 3 ? Key material for conventional algorithm ! 158: ! 159: ! 160: ! 161: Conventional Key Encrypted data packet ! 162: -------------------------------------- ! 163: ! 164: Offset Length Meaning ! 165: 0 1 CTB for Conventional-Key-Encrypted data packet ! 166: 1 ? conventionally-encrypted data, no length field ! 167: ! 168: The conventionally-encrypted ciphertext begins right after the ! 169: CTB. No length field follows CTB, unknown packet length. ! 170: The decrypted ciphertext may contain a compressed data packet or a ! 171: literal plaintext packet. ! 172: ! 173: The conventionally-encrypted data has a 4-byte "key-check" prefix. ! 174: This key-check prefix is inserted before encryption and discarded ! 175: after decryption. The key-check prefix is only visible only after ! 176: decrypting the ciphertext in the packet. The key-check prefix is ! 177: composed of two identical copies of a 16-bit random number. During ! 178: decryption, the first 4 bytes of decrypted plaintext are checked to ! 179: see if the first 2 bytes match the second 2 bytes. If this key-check ! 180: prefix meets this criterium, then the conventional key is assumed to ! 181: be correct. ! 182: ! 183: ! 184: ! 185: Compressed data packet ! 186: ---------------------- ! 187: ! 188: Offset Length Meaning ! 189: 0 1 CTB for Compressed data packet ! 190: 1 1 Compression algorithm selector byte ! 191: 2 ? compressed data, no length field ! 192: ! 193: The compressed data begins right after the algorithm selector byte. ! 194: No length field follows CTB, unknown packet length. ! 195: The compressed data may decompress into a raw literal plaintext data ! 196: packet with its own CTB. ! 197: ! 198: ! 199: ! 200: Literal data packet ! 201: ------------------- ! 202: ! 203: Offset Length Meaning ! 204: 0 1 CTB for raw literal data packet ! 205: 1 ? raw literal plaintext data, no length field ! 206: ! 207: The raw literal plaintext data begins right after the ! 208: CTB. No length field follows CTB, unknown packet length. ! 209: ! 210: ! 211: ! 212: RSA secret key certificate ! 213: -------------------------- ! 214: ! 215: Offset Length Meaning ! 216: 0 1 CTB for RSA secret key certificate ! 217: 1 2 16-bit length of packet ! 218: 3 4 Timestamp ! 219: 7 ? User ID ! 220: ? ? MPI of RSA public modulus n ! 221: ? ? MPI of RSA public encryption exponent e ! 222: ? ? MPI of RSA secret decryption exponent d ! 223: ? ? MPI of RSA secret factor p ! 224: ? ? MPI of RSA secret factor q ! 225: ? ? MPI of RSA secret multiplicative inverse u ! 226: (All MPI's have bitcount prefixes) ! 227: ! 228: All secret fields in the secret key certificate may be password- ! 229: encrypted. The public fields are not encrypted. ! 230: ! 231: ! 232: ! 233: Public key certificate ! 234: ---------------------- ! 235: ! 236: Offset Length Meaning ! 237: 0 1 CTB for RSA public key certificate ! 238: 1 2 16-bit length of packet ! 239: 3 4 Timestamp ! 240: 7 ? User ID ! 241: ? ? MPI of RSA public modulus n ! 242: ? ? MPI of RSA public encryption exponent e ! 243: (All MPI's have bitcount prefixes) ! 244: ! 245: ! 246: ! 247: "Secret key compromised" certificate ! 248: ------------------------------------ ! 249: ! 250: Note that a "secret key compromise" certificate is exactly the same ! 251: as a public key certificate, but with public exponent e=0. ! 252: ! 253: The current version of PGP does not generate any secret key ! 254: compromise certificates. ! 255: ! 256: ! 257:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.