rpm 4.9.1
rpmpgp.h
Go to the documentation of this file.
00001 #ifndef H_RPMPGP
00002 #define H_RPMPGP
00003 
00013 #include <string.h>
00014 #include <stdio.h>
00015 #include <stdlib.h>
00016 #include <rpm/rpmtypes.h>
00017 #include <rpm/rpmstring.h>
00018 
00019 #ifdef __cplusplus
00020 extern "C" {
00021 #endif
00022 
00025 typedef struct DIGEST_CTX_s * DIGEST_CTX;
00026 typedef struct rpmDigestBundle_s * rpmDigestBundle;
00027 
00030 typedef struct pgpDig_s * pgpDig;
00031 
00034 typedef struct pgpDigParams_s * pgpDigParams;
00035 
00036 typedef uint8_t pgpKeyID_t[8];
00037 typedef uint8_t pgpTime_t[4];
00038 
00046 typedef enum pgpTag_e {
00047     PGPTAG_RESERVED             =  0, 
00048     PGPTAG_PUBLIC_SESSION_KEY   =  1, 
00049     PGPTAG_SIGNATURE            =  2, 
00050     PGPTAG_SYMMETRIC_SESSION_KEY=  3, 
00051     PGPTAG_ONEPASS_SIGNATURE    =  4, 
00052     PGPTAG_SECRET_KEY           =  5, 
00053     PGPTAG_PUBLIC_KEY           =  6, 
00054     PGPTAG_SECRET_SUBKEY        =  7, 
00055     PGPTAG_COMPRESSED_DATA      =  8, 
00056     PGPTAG_SYMMETRIC_DATA       =  9, 
00057     PGPTAG_MARKER               = 10, 
00058     PGPTAG_LITERAL_DATA         = 11, 
00059     PGPTAG_TRUST                = 12, 
00060     PGPTAG_USER_ID              = 13, 
00061     PGPTAG_PUBLIC_SUBKEY        = 14, 
00062     PGPTAG_COMMENT_OLD          = 16, 
00063     PGPTAG_PHOTOID              = 17, 
00064     PGPTAG_ENCRYPTED_MDC        = 18, 
00065     PGPTAG_MDC                  = 19, 
00066     PGPTAG_PRIVATE_60           = 60, 
00067     PGPTAG_COMMENT              = 61, 
00068     PGPTAG_PRIVATE_62           = 62, 
00069     PGPTAG_CONTROL              = 63  
00070 } pgpTag;
00071 
00106 typedef struct pgpPktPubkey_s {
00107     uint8_t version;    
00108     pgpKeyID_t keyid;   
00109     uint8_t algo;               
00110 } pgpPktPubkey;
00111 
00112 
00119 typedef enum pgpSigType_e {
00120     PGPSIGTYPE_BINARY            = 0x00, 
00121     PGPSIGTYPE_TEXT              = 0x01, 
00122     PGPSIGTYPE_STANDALONE        = 0x02, 
00123     PGPSIGTYPE_GENERIC_CERT      = 0x10,
00125     PGPSIGTYPE_PERSONA_CERT      = 0x11,
00127     PGPSIGTYPE_CASUAL_CERT       = 0x12,
00129     PGPSIGTYPE_POSITIVE_CERT     = 0x13,
00131     PGPSIGTYPE_SUBKEY_BINDING    = 0x18, 
00132     PGPSIGTYPE_SIGNED_KEY        = 0x1F, 
00133     PGPSIGTYPE_KEY_REVOKE        = 0x20, 
00134     PGPSIGTYPE_SUBKEY_REVOKE     = 0x28, 
00135     PGPSIGTYPE_CERT_REVOKE       = 0x30, 
00136     PGPSIGTYPE_TIMESTAMP         = 0x40  
00137 } pgpSigType;
00138 
00162 typedef enum pgpPubkeyAlgo_e {
00163     PGPPUBKEYALGO_RSA           =  1,   
00164     PGPPUBKEYALGO_RSA_ENCRYPT   =  2,   
00165     PGPPUBKEYALGO_RSA_SIGN      =  3,   
00166     PGPPUBKEYALGO_ELGAMAL_ENCRYPT = 16, 
00167     PGPPUBKEYALGO_DSA           = 17,   
00168     PGPPUBKEYALGO_EC            = 18,   
00169     PGPPUBKEYALGO_ECDSA         = 19,   
00170     PGPPUBKEYALGO_ELGAMAL       = 20,   
00171     PGPPUBKEYALGO_DH            = 21    
00172 } pgpPubkeyAlgo;
00173 
00198 typedef enum pgpSymkeyAlgo_e {
00199     PGPSYMKEYALGO_PLAINTEXT     =  0,   
00200     PGPSYMKEYALGO_IDEA          =  1,   
00201     PGPSYMKEYALGO_TRIPLE_DES    =  2,   
00202     PGPSYMKEYALGO_CAST5         =  3,   
00203     PGPSYMKEYALGO_BLOWFISH      =  4,   
00204     PGPSYMKEYALGO_SAFER         =  5,   
00205     PGPSYMKEYALGO_DES_SK        =  6,   
00206     PGPSYMKEYALGO_AES_128       =  7,   
00207     PGPSYMKEYALGO_AES_192       =  8,   
00208     PGPSYMKEYALGO_AES_256       =  9,   
00209     PGPSYMKEYALGO_TWOFISH       = 10,   
00210     PGPSYMKEYALGO_NOENCRYPT     = 110   
00211 } pgpSymkeyAlgo;
00212 
00228 typedef enum pgpCompressAlgo_e {
00229     PGPCOMPRESSALGO_NONE        =  0,   
00230     PGPCOMPRESSALGO_ZIP         =  1,   
00231     PGPCOMPRESSALGO_ZLIB        =  2,   
00232     PGPCOMPRESSALGO_BZIP2       =  3    
00233 } pgpCompressAlgo;
00234 
00256 typedef enum pgpHashAlgo_e {
00257     PGPHASHALGO_MD5             =  1,   
00258     PGPHASHALGO_SHA1            =  2,   
00259     PGPHASHALGO_RIPEMD160       =  3,   
00260     PGPHASHALGO_MD2             =  5,   
00261     PGPHASHALGO_TIGER192        =  6,   
00262     PGPHASHALGO_HAVAL_5_160     =  7,   
00263     PGPHASHALGO_SHA256          =  8,   
00264     PGPHASHALGO_SHA384          =  9,   
00265     PGPHASHALGO_SHA512          = 10,   
00266     PGPHASHALGO_SHA224          = 11,   
00267 } pgpHashAlgo;
00268 
00290 typedef struct pgpPktSigV3_s {
00291     uint8_t version;    
00292     uint8_t hashlen;    
00293     uint8_t sigtype;    
00294     pgpTime_t time;     
00295     pgpKeyID_t signid;  
00296     uint8_t pubkey_algo;        
00297     uint8_t hash_algo;  
00298     uint8_t signhash16[2];      
00299 } * pgpPktSigV3;
00300 
00322 typedef struct pgpPktSigV4_s {
00323     uint8_t version;    
00324     uint8_t sigtype;    
00325     uint8_t pubkey_algo;        
00326     uint8_t hash_algo;  
00327     uint8_t hashlen[2]; 
00328 } * pgpPktSigV4;
00329 
00396 typedef enum pgpSubType_e {
00397     PGPSUBTYPE_NONE             =   0, 
00398     PGPSUBTYPE_SIG_CREATE_TIME  =   2, 
00399     PGPSUBTYPE_SIG_EXPIRE_TIME  =   3, 
00400     PGPSUBTYPE_EXPORTABLE_CERT  =   4, 
00401     PGPSUBTYPE_TRUST_SIG        =   5, 
00402     PGPSUBTYPE_REGEX            =   6, 
00403     PGPSUBTYPE_REVOCABLE        =   7, 
00404     PGPSUBTYPE_KEY_EXPIRE_TIME  =   9, 
00405     PGPSUBTYPE_ARR              =  10, 
00406     PGPSUBTYPE_PREFER_SYMKEY    =  11, 
00407     PGPSUBTYPE_REVOKE_KEY       =  12, 
00408     PGPSUBTYPE_ISSUER_KEYID     =  16, 
00409     PGPSUBTYPE_NOTATION         =  20, 
00410     PGPSUBTYPE_PREFER_HASH      =  21, 
00411     PGPSUBTYPE_PREFER_COMPRESS  =  22, 
00412     PGPSUBTYPE_KEYSERVER_PREFERS=  23, 
00413     PGPSUBTYPE_PREFER_KEYSERVER =  24, 
00414     PGPSUBTYPE_PRIMARY_USERID   =  25, 
00415     PGPSUBTYPE_POLICY_URL       =  26, 
00416     PGPSUBTYPE_KEY_FLAGS        =  27, 
00417     PGPSUBTYPE_SIGNER_USERID    =  28, 
00418     PGPSUBTYPE_REVOKE_REASON    =  29, 
00419     PGPSUBTYPE_FEATURES         =  30, 
00420     PGPSUBTYPE_EMBEDDED_SIG     =  32, 
00422     PGPSUBTYPE_INTERNAL_100     = 100, 
00423     PGPSUBTYPE_INTERNAL_101     = 101, 
00424     PGPSUBTYPE_INTERNAL_102     = 102, 
00425     PGPSUBTYPE_INTERNAL_103     = 103, 
00426     PGPSUBTYPE_INTERNAL_104     = 104, 
00427     PGPSUBTYPE_INTERNAL_105     = 105, 
00428     PGPSUBTYPE_INTERNAL_106     = 106, 
00429     PGPSUBTYPE_INTERNAL_107     = 107, 
00430     PGPSUBTYPE_INTERNAL_108     = 108, 
00431     PGPSUBTYPE_INTERNAL_109     = 109, 
00432     PGPSUBTYPE_INTERNAL_110     = 110, 
00434     PGPSUBTYPE_CRITICAL         = 128  
00435 } pgpSubType;
00436 
00457 typedef union pgpPktSig_u {
00458     struct pgpPktSigV3_s v3;
00459     struct pgpPktSigV4_s v4;
00460 } * pgpPktSig;
00461 
00490 typedef struct pgpPktSymkey_s {
00491     uint8_t version;    
00492     uint8_t symkey_algo;
00493     uint8_t s2k[1];
00494 } pgpPktSymkey;
00495 
00525 typedef struct pgpPktOnepass_s {
00526     uint8_t version;    
00527     uint8_t sigtype;    
00528     uint8_t hash_algo;  
00529     uint8_t pubkey_algo;        
00530     pgpKeyID_t signid;  
00531     uint8_t nested;
00532 } * pgpPktOnepass;
00533 
00606 typedef struct pgpPktKeyV3_s {
00607     uint8_t version;    
00608     pgpTime_t time;     
00609     uint8_t valid[2];   
00610     uint8_t pubkey_algo;        
00611 } * pgpPktKeyV3;
00612 
00644 typedef struct pgpPktKeyV4_s {
00645     uint8_t version;    
00646     pgpTime_t time;     
00647     uint8_t pubkey_algo;        
00648 } * pgpPktKeyV4;
00649 
00714 typedef union pgpPktKey_u {
00715     struct pgpPktKeyV3_s v3;
00716     struct pgpPktKeyV4_s v4;
00717 } pgpPktKey;
00718 
00719 /* \ingroup rpmpgp
00720  * 5.6. Compressed Data Packet (Tag 8)
00721  *
00722  * The Compressed Data packet contains compressed data. Typically, this
00723  * packet is found as the contents of an encrypted packet, or following
00724  * a Signature or One-Pass Signature packet, and contains literal data
00725  * packets.
00726  *
00727  * The body of this packet consists of:
00728  *   - One octet that gives the algorithm used to compress the packet.
00729  *   - The remainder of the packet is compressed data.
00730  *
00731  * A Compressed Data Packet's body contains an block that compresses
00732  * some set of packets. See section "Packet Composition" for details on
00733  * how messages are formed.
00734  *
00735  * ZIP-compressed packets are compressed with raw RFC 1951 DEFLATE
00736  * blocks. Note that PGP V2.6 uses 13 bits of compression. If an
00737  * implementation uses more bits of compression, PGP V2.6 cannot
00738  * decompress it.
00739  *
00740  * ZLIB-compressed packets are compressed with RFC 1950 ZLIB-style
00741  * blocks.
00742  */
00743 typedef struct pgpPktCdata_s {
00744     uint8_t compressalgo;
00745     uint8_t data[1];
00746 } pgpPktCdata;
00747 
00748 /* \ingroup rpmpgp
00749  * 5.7. Symmetrically Encrypted Data Packet (Tag 9)
00750  *
00751  * The Symmetrically Encrypted Data packet contains data encrypted with
00752  * a symmetric-key algorithm. When it has been decrypted, it will
00753  * typically contain other packets (often literal data packets or
00754  * compressed data packets).
00755  *
00756  * The body of this packet consists of:
00757  *   - Encrypted data, the output of the selected symmetric-key cipher
00758  *     operating in PGP's variant of Cipher Feedback (CFB) mode.
00759  *
00760  * The symmetric cipher used may be specified in an Public-Key or
00761  * Symmetric-Key Encrypted Session Key packet that precedes the
00762  * Symmetrically Encrypted Data Packet.  In that case, the cipher
00763  * algorithm octet is prefixed to the session key before it is
00764  * encrypted.  If no packets of these types precede the encrypted data,
00765  * the IDEA algorithm is used with the session key calculated as the MD5
00766  * hash of the passphrase.
00767  *
00768  * The data is encrypted in CFB mode, with a CFB shift size equal to the
00769  * cipher's block size.  The Initial Vector (IV) is specified as all
00770  * zeros.  Instead of using an IV, OpenPGP prefixes a 10-octet string to
00771  * the data before it is encrypted.  The first eight octets are random,
00772  * and the 9th and 10th octets are copies of the 7th and 8th octets,
00773  * respectively. After encrypting the first 10 octets, the CFB state is
00774  * resynchronized if the cipher block size is 8 octets or less.  The
00775  * last 8 octets of ciphertext are passed through the cipher and the
00776  * block boundary is reset.
00777  *
00778  * The repetition of 16 bits in the 80 bits of random data prefixed to
00779  * the message allows the receiver to immediately check whether the
00780  * session key is incorrect.
00781  */
00782 typedef struct pgpPktEdata_s {
00783     uint8_t data[1];
00784 } pgpPktEdata;
00785 
00786 /* \ingroup rpmpgp
00787  * 5.8. Marker Packet (Obsolete Literal Packet) (Tag 10)
00788  *
00789  * An experimental version of PGP used this packet as the Literal
00790  * packet, but no released version of PGP generated Literal packets with
00791  * this tag. With PGP 5.x, this packet has been re-assigned and is
00792  * reserved for use as the Marker packet.
00793  *
00794  * The body of this packet consists of:
00795  *   - The three octets 0x50, 0x47, 0x50 (which spell "PGP" in UTF-8).
00796  *
00797  * Such a packet MUST be ignored when received.  It may be placed at the
00798  * beginning of a message that uses features not available in PGP 2.6.x
00799  * in order to cause that version to report that newer software is
00800  * necessary to process the message.
00801  */
00802 /* \ingroup rpmpgp
00803  * 5.9. Literal Data Packet (Tag 11)
00804  *
00805  * A Literal Data packet contains the body of a message; data that is
00806  * not to be further interpreted.
00807  *
00808  * The body of this packet consists of:
00809  *   - A one-octet field that describes how the data is formatted.
00810  *
00811  * If it is a 'b' (0x62), then the literal packet contains binary data.
00812  * If it is a 't' (0x74), then it contains text data, and thus may need
00813  * line ends converted to local form, or other text-mode changes.  RFC
00814  * 1991 also defined a value of 'l' as a 'local' mode for machine-local
00815  * conversions.  This use is now deprecated.
00816  *   - File name as a string (one-octet length, followed by file name),
00817  *     if the encrypted data should be saved as a file.
00818  *
00819  * If the special name "_CONSOLE" is used, the message is considered to
00820  * be "for your eyes only".  This advises that the message data is
00821  * unusually sensitive, and the receiving program should process it more
00822  * carefully, perhaps avoiding storing the received data to disk, for
00823  * example.
00824  *   - A four-octet number that indicates the modification date of the
00825  *     file, or the creation time of the packet, or a zero that
00826  *     indicates the present time.
00827  *   - The remainder of the packet is literal data.
00828  *
00829  * Text data is stored with <CR><LF> text endings (i.e. network-normal
00830  * line endings).  These should be converted to native line endings by
00831  * the receiving software.
00832  */
00833 typedef struct pgpPktLdata_s {
00834     uint8_t format;
00835     uint8_t filenamelen;
00836     uint8_t filename[1];
00837 } pgpPktLdata;
00838 
00839 /* \ingroup rpmpgp
00840  * 5.10. Trust Packet (Tag 12)
00841  *
00842  * The Trust packet is used only within keyrings and is not normally
00843  * exported.  Trust packets contain data that record the user's
00844  * specifications of which key holders are trustworthy introducers,
00845  * along with other information that implementing software uses for
00846  * trust information.
00847  *
00848  * Trust packets SHOULD NOT be emitted to output streams that are
00849  * transferred to other users, and they SHOULD be ignored on any input
00850  * other than local keyring files.
00851  */
00852 typedef struct pgpPktTrust_s {
00853     uint8_t flag;
00854 } pgpPktTrust;
00855 
00856 /* \ingroup rpmpgp
00857  * 5.11. User ID Packet (Tag 13)
00858  *
00859  * A User ID packet consists of data that is intended to represent the
00860  * name and email address of the key holder.  By convention, it includes
00861  * an RFC 822 mail name, but there are no restrictions on its content.
00862  * The packet length in the header specifies the length of the user id.
00863  * If it is text, it is encoded in UTF-8.
00864  *
00865  */
00866 typedef struct pgpPktUid_s {
00867     uint8_t userid[1];
00868 } pgpPktUid;
00869 
00872 union pgpPktPre_u {
00873     pgpPktPubkey pubkey;        
00874     pgpPktSig sig;              
00875     pgpPktSymkey symkey;        
00876     pgpPktOnepass onepass;      
00877     pgpPktKey key;              
00878     pgpPktCdata cdata;          
00879     pgpPktEdata edata;          
00881     pgpPktLdata ldata;          
00882     pgpPktTrust tdata;          
00883     pgpPktUid uid;              
00884 };
00885 
00888 typedef enum pgpArmor_e {
00889     PGPARMOR_ERR_CRC_CHECK              = -7,
00890     PGPARMOR_ERR_BODY_DECODE            = -6,
00891     PGPARMOR_ERR_CRC_DECODE             = -5,
00892     PGPARMOR_ERR_NO_END_PGP             = -4,
00893     PGPARMOR_ERR_UNKNOWN_PREAMBLE_TAG   = -3,
00894     PGPARMOR_ERR_UNKNOWN_ARMOR_TYPE     = -2,
00895     PGPARMOR_ERR_NO_BEGIN_PGP           = -1,
00896 #define PGPARMOR_ERROR  PGPARMOR_ERR_NO_BEGIN_PGP
00897     PGPARMOR_NONE               =  0,
00898     PGPARMOR_MESSAGE            =  1, 
00899     PGPARMOR_PUBKEY             =  2, 
00900     PGPARMOR_SIGNATURE          =  3, 
00901     PGPARMOR_SIGNED_MESSAGE     =  4, 
00902     PGPARMOR_FILE               =  5, 
00903     PGPARMOR_PRIVKEY            =  6, 
00904     PGPARMOR_SECKEY             =  7  
00905 } pgpArmor;
00906 
00909 typedef enum pgpArmorKey_e {
00910     PGPARMORKEY_VERSION         = 1, 
00911     PGPARMORKEY_COMMENT         = 2, 
00912     PGPARMORKEY_MESSAGEID       = 3, 
00913     PGPARMORKEY_HASH            = 4, 
00914     PGPARMORKEY_CHARSET         = 5  
00915 } pgpArmorKey;
00916 
00917 typedef enum pgpValType_e {
00918     PGPVAL_TAG                  = 1,
00919     PGPVAL_ARMORBLOCK           = 2,
00920     PGPVAL_ARMORKEY             = 3,
00921     PGPVAL_SIGTYPE              = 4,
00922     PGPVAL_SUBTYPE              = 5,
00923     PGPVAL_PUBKEYALGO           = 6,
00924     PGPVAL_SYMKEYALGO           = 7,
00925     PGPVAL_COMPRESSALGO         = 8,
00926     PGPVAL_HASHALGO             = 9,
00927     PGPVAL_SERVERPREFS          = 10,
00928 } pgpValType;
00929 
00933 enum rpmDigestFlags_e {
00934     RPMDIGEST_NONE      = 0
00935 };
00936 
00937 typedef rpmFlags rpmDigestFlags;
00938 
00945 const char * pgpValString(pgpValType type, uint8_t val);
00946 
00953 static inline
00954 unsigned int pgpGrab(const uint8_t *s, size_t nbytes)
00955 {
00956     size_t i = 0;
00957     size_t nb = (nbytes <= sizeof(i) ? nbytes : sizeof(i));
00958     while (nb--)
00959         i = (i << 8) | *s++;
00960     return i;
00961 }
00962 
00969 static inline
00970 size_t pgpLen(const uint8_t *s, size_t * lenp)
00971 {
00972     if (*s < 192) {
00973         (*lenp) = *s++;
00974         return 1;
00975     } else if (*s < 255) {
00976         (*lenp) = ((((unsigned)s[0]) - 192) << 8) + s[1] + 192;
00977         return 2;
00978     } else {
00979         (*lenp) = pgpGrab(s+1, (size_t) 4);
00980         return 5;
00981     }
00982 }
00983 
00990 char * pgpHexStr(const uint8_t *p, size_t plen);
00991 
01000 int pgpPubkeyFingerprint(const uint8_t * pkt, size_t pktlen,
01001                 pgpKeyID_t keyid);
01002 
01010 int pgpExtractPubkeyFingerprint(const char * b64pkt, pgpKeyID_t keyid);
01011 
01020 int pgpPrtPkts(const uint8_t *pkts, size_t pktlen, pgpDig dig, int printing);
01021 
01029 pgpArmor pgpReadPkts(const char * fn, uint8_t ** pkt, size_t * pktlen);
01030 
01038 pgpArmor pgpParsePkts(const char *armor, uint8_t ** pkt, size_t * pktlen);
01039 
01047 char * pgpArmorWrap(int atype, const unsigned char * s, size_t ns);
01048 
01053 pgpDig pgpNewDig(void);
01054 
01059 void pgpCleanDig(pgpDig dig);
01060 
01066 pgpDig pgpFreeDig(pgpDig dig);
01067 
01074 rpmRC pgpVerifySig(pgpDig dig, DIGEST_CTX hashctx);
01075 
01081 char *pgpIdentItem(pgpDigParams digp);
01082 
01090 int rpmInitCrypto(void);
01091 
01095 int rpmFreeCrypto(void);
01096 
01102 DIGEST_CTX rpmDigestDup(DIGEST_CTX octx);
01103 
01109 size_t rpmDigestLength(int hashalgo);
01110 
01118 DIGEST_CTX rpmDigestInit(int hashalgo, rpmDigestFlags flags);
01119 
01127 int rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len);
01128 
01140 int rpmDigestFinal(DIGEST_CTX ctx,
01141         void ** datap,
01142         size_t * lenp, int asAscii);
01143 
01148 rpmDigestBundle rpmDigestBundleNew(void);
01149 
01155 rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle);
01156 
01164 int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo,
01165                         rpmDigestFlags flags);
01166 
01174 int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len);
01175 
01186 int rpmDigestBundleFinal(rpmDigestBundle bundle,
01187          int algo, void ** datap, size_t * lenp, int asAscii);
01188 
01195 DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int algo);
01196 
01197 #ifdef __cplusplus
01198 }
01199 #endif
01200 
01201 #endif  /* H_RPMPGP */