Annotation of pgp/src/pgformat.doc, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.