rpm 5.2.1
|
00001 #ifndef H_RPMPGP 00002 #define H_RPMPGP 00003 00013 #include <string.h> 00014 #include <popt.h> 00015 #include <rpmiotypes.h> 00016 #include <yarn.h> 00017 00018 #if defined(_RPMPGP_INTERNAL) 00019 #include <rpmsw.h> 00020 00024 struct pgpDigParams_s { 00025 /*@only@*/ /*@null@*/ 00026 const char * userid; 00027 /*@only@*/ /*@null@*/ 00028 const rpmuint8_t * hash; 00029 const char * params[4]; 00030 rpmuint8_t tag; 00031 00032 rpmuint8_t version; 00033 rpmuint8_t time[4]; 00034 rpmuint8_t pubkey_algo; 00036 rpmuint8_t hash_algo; 00037 rpmuint8_t sigtype; 00038 size_t hashlen; 00039 rpmuint8_t signhash16[2]; 00040 rpmuint8_t signid[8]; 00041 rpmuint8_t saved; 00042 #define PGPDIG_SAVED_TIME (1 << 0) 00043 #define PGPDIG_SAVED_ID (1 << 1) 00044 00045 }; 00046 00050 struct pgpDig_s { 00051 struct rpmioItem_s _item; 00052 struct pgpDigParams_s signature; 00053 struct pgpDigParams_s pubkey; 00054 00055 rpmuint32_t sigtag; 00056 rpmuint32_t sigtype; 00057 /*@relnull@*/ 00058 const void * sig; 00059 rpmuint32_t siglen; 00061 pgpVSFlags vsflags; 00062 struct rpmop_s dops; 00063 struct rpmop_s sops; 00065 int (*findPubkey) (void * _ts, /*@null@*/ void * _dig) 00066 /*@modifies *_ts, *_dig @*/; 00067 /*@null@*/ 00068 void * _ts; 00070 rpmuint8_t ** ppkts; 00071 int npkts; 00072 size_t nbytes; 00074 /*@only@*/ /*@null@*/ 00075 DIGEST_CTX sha1ctx; 00076 /*@only@*/ /*@null@*/ 00077 DIGEST_CTX hdrsha1ctx; 00078 /*@only@*/ /*@null@*/ 00079 void * sha1; 00080 size_t sha1len; 00082 /*@only@*/ /*@null@*/ 00083 DIGEST_CTX md5ctx; 00084 /*@only@*/ /*@null@*/ 00085 DIGEST_CTX hdrctx; 00086 /*@only@*/ /*@null@*/ 00087 void * md5; 00088 size_t md5len; 00089 /*@owned@*/ /*@relnull@*/ 00090 void * impl; 00091 #if defined(__LCLINT__) 00092 /*@refs@*/ 00093 int nrefs; 00094 #endif 00095 }; 00096 #endif 00097 00100 typedef const struct pgpValTbl_s { 00101 int val; 00102 /*@observer@*/ 00103 const char * str; 00104 } * pgpValTbl; 00105 00113 typedef enum pgpTag_e { 00114 PGPTAG_RESERVED = 0, 00115 PGPTAG_PUBLIC_SESSION_KEY = 1, 00116 PGPTAG_SIGNATURE = 2, 00117 PGPTAG_SYMMETRIC_SESSION_KEY= 3, 00118 PGPTAG_ONEPASS_SIGNATURE = 4, 00119 PGPTAG_SECRET_KEY = 5, 00120 PGPTAG_PUBLIC_KEY = 6, 00121 PGPTAG_SECRET_SUBKEY = 7, 00122 PGPTAG_COMPRESSED_DATA = 8, 00123 PGPTAG_SYMMETRIC_DATA = 9, 00124 PGPTAG_MARKER = 10, 00125 PGPTAG_LITERAL_DATA = 11, 00126 PGPTAG_TRUST = 12, 00127 PGPTAG_USER_ID = 13, 00128 PGPTAG_PUBLIC_SUBKEY = 14, 00129 PGPTAG_COMMENT_OLD = 16, 00130 PGPTAG_PHOTOID = 17, 00131 PGPTAG_ENCRYPTED_MDC = 18, 00132 PGPTAG_MDC = 19, 00133 PGPTAG_PRIVATE_60 = 60, 00134 PGPTAG_COMMENT = 61, 00135 PGPTAG_PRIVATE_62 = 62, 00136 PGPTAG_CONTROL = 63 00137 } pgpTag; 00138 00141 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00142 extern struct pgpValTbl_s pgpTagTbl[]; 00143 00178 typedef struct pgpPktPubkey_s { 00179 rpmuint8_t version; 00180 rpmuint8_t keyid[8]; 00181 rpmuint8_t algo; 00182 } pgpPktPubkey; 00183 00190 /*@-typeuse@*/ 00191 typedef enum pgpSigType_e { 00192 PGPSIGTYPE_BINARY = 0x00, 00193 PGPSIGTYPE_TEXT = 0x01, 00194 PGPSIGTYPE_STANDALONE = 0x02, 00195 PGPSIGTYPE_GENERIC_CERT = 0x10, 00197 PGPSIGTYPE_PERSONA_CERT = 0x11, 00199 PGPSIGTYPE_CASUAL_CERT = 0x12, 00201 PGPSIGTYPE_POSITIVE_CERT = 0x13, 00203 PGPSIGTYPE_SUBKEY_BINDING = 0x18, 00204 PGPSIGTYPE_SIGNED_KEY = 0x1F, 00205 PGPSIGTYPE_KEY_REVOKE = 0x20, 00206 PGPSIGTYPE_SUBKEY_REVOKE = 0x28, 00207 PGPSIGTYPE_CERT_REVOKE = 0x30, 00208 PGPSIGTYPE_TIMESTAMP = 0x40, 00209 PGPSIGTYPE_CONFIRM = 0x50 00210 } pgpSigType; 00211 /*@=typeuse@*/ 00212 00215 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00216 extern struct pgpValTbl_s pgpSigTypeTbl[]; 00217 00241 /*@-typeuse@*/ 00242 typedef enum pgpPubkeyAlgo_e { 00243 PGPPUBKEYALGO_RSA = 1, 00244 PGPPUBKEYALGO_RSA_ENCRYPT = 2, 00245 PGPPUBKEYALGO_RSA_SIGN = 3, 00246 PGPPUBKEYALGO_ELGAMAL_ENCRYPT = 16, 00247 PGPPUBKEYALGO_DSA = 17, 00248 PGPPUBKEYALGO_EC = 18, 00249 PGPPUBKEYALGO_ECDSA = 19, 00250 PGPPUBKEYALGO_ELGAMAL = 20, 00251 PGPPUBKEYALGO_DH = 21 00252 } pgpPubkeyAlgo; 00253 /*@=typeuse@*/ 00254 00257 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00258 extern struct pgpValTbl_s pgpPubkeyTbl[]; 00259 00285 /*@-typeuse@*/ 00286 typedef enum pgpSymkeyAlgo_e { 00287 PGPSYMKEYALGO_PLAINTEXT = 0, 00288 PGPSYMKEYALGO_IDEA = 1, 00289 PGPSYMKEYALGO_TRIPLE_DES = 2, 00290 PGPSYMKEYALGO_CAST5 = 3, 00291 PGPSYMKEYALGO_BLOWFISH = 4, 00292 PGPSYMKEYALGO_SAFER = 5, 00293 PGPSYMKEYALGO_DES_SK = 6, 00294 PGPSYMKEYALGO_AES_128 = 7, 00295 PGPSYMKEYALGO_AES_192 = 8, 00296 PGPSYMKEYALGO_AES_256 = 9, 00297 PGPSYMKEYALGO_TWOFISH = 10, 00298 PGPSYMKEYALGO_NOENCRYPT = 110 00299 } pgpSymkeyAlgo; 00300 /*@=typeuse@*/ 00301 00305 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00306 extern struct pgpValTbl_s pgpSymkeyTbl[]; 00307 00323 /*@-typeuse@*/ 00324 typedef enum pgpCompressAlgo_e { 00325 PGPCOMPRESSALGO_NONE = 0, 00326 PGPCOMPRESSALGO_ZIP = 1, 00327 PGPCOMPRESSALGO_ZLIB = 2, 00328 PGPCOMPRESSALGO_BZIP2 = 3 00329 } pgpCompressAlgo; 00330 /*@=typeuse@*/ 00331 00335 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00336 extern struct pgpValTbl_s pgpCompressionTbl[]; 00337 00341 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00342 extern struct pgpValTbl_s pgpHashTbl[]; 00343 00365 typedef struct pgpPktSigV3_s { 00366 rpmuint8_t version; 00367 rpmuint8_t hashlen; 00368 rpmuint8_t sigtype; 00369 rpmuint8_t time[4]; 00370 rpmuint8_t signid[8]; 00371 rpmuint8_t pubkey_algo; 00372 rpmuint8_t hash_algo; 00373 rpmuint8_t signhash16[2]; 00374 } * pgpPktSigV3; 00375 00397 typedef struct pgpPktSigV4_s { 00398 rpmuint8_t version; 00399 rpmuint8_t sigtype; 00400 rpmuint8_t pubkey_algo; 00401 rpmuint8_t hash_algo; 00402 rpmuint8_t hashlen[2]; 00403 } * pgpPktSigV4; 00404 00483 /*@-typeuse@*/ 00484 typedef enum pgpSubType_e { 00485 PGPSUBTYPE_NONE = 0, 00486 PGPSUBTYPE_SIG_CREATE_TIME = 2, 00487 PGPSUBTYPE_SIG_EXPIRE_TIME = 3, 00488 PGPSUBTYPE_EXPORTABLE_CERT = 4, 00489 PGPSUBTYPE_TRUST_SIG = 5, 00490 PGPSUBTYPE_REGEX = 6, 00491 PGPSUBTYPE_REVOCABLE = 7, 00492 PGPSUBTYPE_KEY_EXPIRE_TIME = 9, 00493 PGPSUBTYPE_ARR = 10, 00494 PGPSUBTYPE_PREFER_SYMKEY = 11, 00495 PGPSUBTYPE_REVOKE_KEY = 12, 00496 PGPSUBTYPE_ISSUER_KEYID = 16, 00497 PGPSUBTYPE_NOTATION = 20, 00498 PGPSUBTYPE_PREFER_HASH = 21, 00499 PGPSUBTYPE_PREFER_COMPRESS = 22, 00500 PGPSUBTYPE_KEYSERVER_PREFERS= 23, 00501 PGPSUBTYPE_PREFER_KEYSERVER = 24, 00502 PGPSUBTYPE_PRIMARY_USERID = 25, 00503 PGPSUBTYPE_POLICY_URL = 26, 00504 PGPSUBTYPE_KEY_FLAGS = 27, 00505 PGPSUBTYPE_SIGNER_USERID = 28, 00506 PGPSUBTYPE_REVOKE_REASON = 29, 00507 PGPSUBTYPE_FEATURES = 30, 00508 PGPSUBTYPE_SIG_TARGET = 31, 00509 PGPSUBTYPE_EMBEDDED_SIG = 32, 00511 PGPSUBTYPE_INTERNAL_100 = 100, 00512 PGPSUBTYPE_INTERNAL_101 = 101, 00513 PGPSUBTYPE_INTERNAL_102 = 102, 00514 PGPSUBTYPE_INTERNAL_103 = 103, 00515 PGPSUBTYPE_INTERNAL_104 = 104, 00516 PGPSUBTYPE_INTERNAL_105 = 105, 00517 PGPSUBTYPE_INTERNAL_106 = 106, 00518 PGPSUBTYPE_INTERNAL_107 = 107, 00519 PGPSUBTYPE_INTERNAL_108 = 108, 00520 PGPSUBTYPE_INTERNAL_109 = 109, 00521 PGPSUBTYPE_INTERNAL_110 = 110, 00523 PGPSUBTYPE_CRITICAL = 128 00524 } pgpSubType; 00525 /*@=typeuse@*/ 00526 00530 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 00531 extern struct pgpValTbl_s pgpSubTypeTbl[]; 00532 00553 typedef union pgpPktSig_u { 00554 struct pgpPktSigV3_s v3; 00555 struct pgpPktSigV4_s v4; 00556 } * pgpPktSig; 00557 00586 typedef struct pgpPktSymkey_s { 00587 rpmuint8_t version; 00588 rpmuint8_t symkey_algo; 00589 rpmuint8_t s2k[1]; 00590 } pgpPktSymkey; 00591 00621 typedef struct pgpPktOnepass_s { 00622 rpmuint8_t version; 00623 rpmuint8_t sigtype; 00624 rpmuint8_t hash_algo; 00625 rpmuint8_t pubkey_algo; 00626 rpmuint8_t signid[8]; 00627 rpmuint8_t nested; 00628 } * pgpPktOnepass; 00629 00702 typedef struct pgpPktKeyV3_s { 00703 rpmuint8_t version; 00704 rpmuint8_t time[4]; 00705 rpmuint8_t valid[2]; 00706 rpmuint8_t pubkey_algo; 00707 } * pgpPktKeyV3; 00708 00740 typedef struct pgpPktKeyV4_s { 00741 rpmuint8_t version; 00742 rpmuint8_t time[4]; 00743 rpmuint8_t pubkey_algo; 00744 } * pgpPktKeyV4; 00745 00810 typedef union pgpPktKey_u { 00811 struct pgpPktKeyV3_s v3; 00812 struct pgpPktKeyV4_s v4; 00813 } pgpPktKey; 00814 00839 typedef struct pgpPktCdata_s { 00840 rpmuint8_t compressalgo; 00841 rpmuint8_t data[1]; 00842 } pgpPktCdata; 00843 00878 typedef struct pgpPktEdata_s { 00879 rpmuint8_t data[1]; 00880 } pgpPktEdata; 00881 00898 /* 00899 * 5.9. Literal Data Packet (Tag 11) 00900 * 00901 * A Literal Data packet contains the body of a message; data that is 00902 * not to be further interpreted. 00903 * 00904 * The body of this packet consists of: 00905 * - A one-octet field that describes how the data is formatted. 00906 * 00907 * If it is a 'b' (0x62), then the literal packet contains binary data. 00908 * If it is a 't' (0x74), then it contains text data, and thus may need 00909 * line ends converted to local form, or other text-mode changes. RFC 00910 * 1991 also defined a value of 'l' as a 'local' mode for machine-local 00911 * conversions. This use is now deprecated. 00912 * - File name as a string (one-octet length, followed by file name), 00913 * if the encrypted data should be saved as a file. 00914 * 00915 * If the special name "_CONSOLE" is used, the message is considered to 00916 * be "for your eyes only". This advises that the message data is 00917 * unusually sensitive, and the receiving program should process it more 00918 * carefully, perhaps avoiding storing the received data to disk, for 00919 * example. 00920 * - A four-octet number that indicates the modification date of the 00921 * file, or the creation time of the packet, or a zero that 00922 * indicates the present time. 00923 * - The remainder of the packet is literal data. 00924 * 00925 * Text data is stored with <CR><LF> text endings (i.e. network-normal 00926 * line endings). These should be converted to native line endings by 00927 * the receiving software. 00928 */ 00929 typedef struct pgpPktLdata_s { 00930 rpmuint8_t format; 00931 rpmuint8_t filenamelen; 00932 rpmuint8_t filename[1]; 00933 } pgpPktLdata; 00934 00948 typedef struct pgpPktTrust_s { 00949 rpmuint8_t flag; 00950 } pgpPktTrust; 00951 00962 typedef struct pgpPktUid_s { 00963 rpmuint8_t userid[1]; 00964 } pgpPktUid; 00965 00968 union pgpPktPre_u { 00969 pgpPktPubkey pubkey; 00970 pgpPktSig sig; 00971 pgpPktSymkey symkey; 00972 pgpPktOnepass onepass; 00973 pgpPktKey key; 00974 pgpPktCdata cdata; 00975 pgpPktEdata edata; 00977 pgpPktLdata ldata; 00978 pgpPktTrust tdata; 00979 pgpPktUid uid; 00980 }; 00981 00984 /*@-typeuse@*/ 00985 typedef enum pgpArmor_e { 00986 PGPARMOR_ERR_CRC_CHECK = -7, 00987 PGPARMOR_ERR_BODY_DECODE = -6, 00988 PGPARMOR_ERR_CRC_DECODE = -5, 00989 PGPARMOR_ERR_NO_END_PGP = -4, 00990 PGPARMOR_ERR_UNKNOWN_PREAMBLE_TAG = -3, 00991 PGPARMOR_ERR_UNKNOWN_ARMOR_TYPE = -2, 00992 PGPARMOR_ERR_NO_BEGIN_PGP = -1, 00993 #define PGPARMOR_ERROR PGPARMOR_ERR_NO_BEGIN_PGP 00994 PGPARMOR_NONE = 0, 00995 PGPARMOR_MESSAGE = 1, 00996 PGPARMOR_PUBKEY = 2, 00997 PGPARMOR_SIGNATURE = 3, 00998 PGPARMOR_SIGNED_MESSAGE = 4, 00999 PGPARMOR_FILE = 5, 01000 PGPARMOR_PRIVKEY = 6, 01001 PGPARMOR_SECKEY = 7 01002 } pgpArmor; 01003 /*@=typeuse@*/ 01004 01008 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 01009 extern struct pgpValTbl_s pgpArmorTbl[]; 01010 01013 /*@-typeuse@*/ 01014 typedef enum pgpArmorKey_e { 01015 PGPARMORKEY_VERSION = 1, 01016 PGPARMORKEY_COMMENT = 2, 01017 PGPARMORKEY_MESSAGEID = 3, 01018 PGPARMORKEY_HASH = 4, 01019 PGPARMORKEY_CHARSET = 5 01020 } pgpArmorKey; 01021 /*@=typeuse@*/ 01022 01026 /*@observer@*/ /*@unchecked@*/ /*@unused@*/ 01027 extern struct pgpValTbl_s pgpArmorKeyTbl[]; 01028 01029 /*@-fcnuse@*/ 01030 #ifdef __cplusplus 01031 extern "C" { 01032 #endif 01033 01040 /*@unused@*/ static inline 01041 unsigned int pgpGrab(const rpmuint8_t * s, size_t nbytes) 01042 /*@*/ 01043 { 01044 unsigned int i = 0; 01045 size_t nb = (nbytes <= sizeof(i) ? nbytes : sizeof(i)); 01046 while (nb--) 01047 i = (i << 8) | *s++; 01048 return i; 01049 } 01050 01057 /*@unused@*/ static inline 01058 unsigned int pgpLen(const rpmuint8_t * s, /*@out@*/ unsigned int * lenp) 01059 /*@modifies *lenp @*/ 01060 { 01061 if (*s < (rpmuint8_t)192) { 01062 *lenp = (unsigned int) *s++; 01063 return 1; 01064 } else if (*s < (rpmuint8_t)255) { 01065 *lenp = (unsigned int) ((((unsigned)s[0]) - 192) << 8) + (unsigned)s[1] + 192; 01066 return 2; 01067 } else { 01068 *lenp = pgpGrab(s+1, 4); 01069 return 5; 01070 } 01071 } 01072 01078 /*@unused@*/ static inline 01079 unsigned int pgpMpiBits(const rpmuint8_t * p) 01080 /*@requires maxRead(p) >= 1 @*/ 01081 /*@*/ 01082 { 01083 return (unsigned int) ((p[0] << 8) | p[1]); 01084 } 01085 01091 /*@unused@*/ static inline 01092 unsigned int pgpMpiLen(const rpmuint8_t * p) 01093 /*@requires maxRead(p) >= 1 @*/ 01094 /*@*/ 01095 { 01096 return (2 + ((pgpMpiBits(p)+7)>>3)); 01097 } 01098 01106 /*@unused@*/ static inline 01107 char * pgpHexCvt(/*@returned@*/ char * t, const rpmuint8_t * s, size_t nbytes) 01108 /*@modifies *t @*/ 01109 { 01110 static char hex[] = "0123456789abcdef"; 01111 while (nbytes-- > 0) { 01112 unsigned int i; 01113 i = (unsigned int) *s++; 01114 *t++ = hex[ (i >> 4) & 0xf ]; 01115 *t++ = hex[ (i ) & 0xf ]; 01116 } 01117 *t = '\0'; 01118 return t; 01119 } 01120 01128 /*@unused@*/ static inline /*@observer@*/ 01129 char * pgpHexStr(const rpmuint8_t * p, size_t plen) 01130 /*@*/ 01131 { 01132 static char prbuf[8*BUFSIZ]; /* XXX ick */ 01133 char *t = prbuf; 01134 t = pgpHexCvt(t, p, plen); 01135 return prbuf; 01136 } 01137 01144 /*@unused@*/ static inline /*@observer@*/ 01145 const char * pgpMpiStr(const rpmuint8_t * p) 01146 /*@requires maxRead(p) >= 3 @*/ 01147 /*@*/ 01148 { 01149 static char prbuf[8*BUFSIZ]; /* XXX ick */ 01150 char *t = prbuf; 01151 sprintf(t, "[%4u]: ", pgpGrab(p, 2)); 01152 t += strlen(t); 01153 t = pgpHexCvt(t, p+2, pgpMpiLen(p)-2); 01154 return prbuf; 01155 } 01156 01163 /*@unused@*/ static inline /*@observer@*/ 01164 const char * pgpValStr(pgpValTbl vs, rpmuint8_t val) 01165 /*@*/ 01166 { 01167 do { 01168 if (vs->val == (int)val) 01169 break; 01170 } while ((++vs)->val != -1); 01171 return vs->str; 01172 } 01173 01181 /*@unused@*/ static inline 01182 int pgpValTok(pgpValTbl vs, const char * s, const char * se) 01183 /*@*/ 01184 { 01185 do { 01186 size_t vlen = strlen(vs->str); 01187 if (vlen <= (size_t)(se-s) && !strncmp(s, vs->str, vlen)) 01188 break; 01189 } while ((++vs)->val != -1); 01190 return vs->val; 01191 } 01192 01199 /*@-exportlocal@*/ 01200 void pgpPrtVal(const char * pre, pgpValTbl vs, rpmuint8_t val) 01201 /*@globals fileSystem @*/ 01202 /*@modifies fileSystem @*/; 01203 /*@=exportlocal@*/ 01204 01212 /*@-exportlocal@*/ 01213 int pgpPrtSubType(const rpmuint8_t * h, size_t hlen, pgpSigType sigtype) 01214 /*@globals fileSystem @*/ 01215 /*@modifies fileSystem @*/; 01216 /*@=exportlocal@*/ 01217 01223 /*@-exportlocal@*/ 01224 int pgpPrtSig(const pgpPkt pp) 01225 /*@globals fileSystem, internalState @*/ 01226 /*@modifies fileSystem, internalState @*/; 01227 /*@=exportlocal@*/ 01228 01234 int pgpPrtKey(const pgpPkt pp) 01235 /*@globals fileSystem, internalState @*/ 01236 /*@modifies fileSystem, internalState @*/; 01237 01243 /*@-exportlocal@*/ 01244 int pgpPrtUserID(const pgpPkt pp) 01245 /*@globals fileSystem, internalState @*/ 01246 /*@modifies fileSystem, internalState @*/; 01247 /*@=exportlocal@*/ 01248 01254 /*@-exportlocal@*/ 01255 int pgpPrtComment(const pgpPkt pp) 01256 /*@globals fileSystem @*/ 01257 /*@modifies fileSystem @*/; 01258 /*@=exportlocal@*/ 01259 01268 /*@-exportlocal@*/ 01269 int pgpPubkeyFingerprint(const rpmuint8_t * pkt, size_t pktlen, 01270 /*@out@*/ rpmuint8_t * keyid) 01271 /*@modifies *keyid @*/; 01272 /*@=exportlocal@*/ 01273 01281 int pgpExtractPubkeyFingerprint(const char * b64pkt, 01282 /*@out@*/ rpmuint8_t * keyid) 01283 /*@modifies *keyid @*/; 01284 01292 int pgpPktLen(const rpmuint8_t * pkt, size_t pleft, /*@out@*/ pgpPkt pp) 01293 /*@modifies pp @*/; 01294 01301 /*@-exportlocal@*/ 01302 int pgpPrtPkt(const rpmuint8_t * pkt, size_t pleft) 01303 /*@globals fileSystem, internalState @*/ 01304 /*@modifies fileSystem, internalState @*/; 01305 /*@=exportlocal@*/ 01306 01315 int pgpPrtPkts(const rpmuint8_t * pkts, size_t pktlen, pgpDig dig, int printing) 01316 /*@globals fileSystem, internalState @*/ 01317 /*@modifies dig, fileSystem, internalState @*/; 01318 01326 pgpArmor pgpReadPkts(const char * fn, 01327 /*@out@*/ rpmuint8_t ** pkt, /*@out@*/ size_t * pktlen) 01328 /*@globals h_errno, fileSystem, internalState @*/ 01329 /*@modifies *pkt, *pktlen, fileSystem, internalState @*/; 01330 01338 char * pgpArmorWrap(rpmuint8_t atype, const unsigned char * s, size_t ns) 01339 /*@*/; 01340 01347 pgpHashAlgo pgpHashAlgoStringToNumber(const char *name, size_t name_len) 01348 /*@*/; 01349 01353 /*@unchecked@*/ 01354 extern pgpVSFlags pgpDigVSFlags; 01355 01362 /*@unused@*/ /*@null@*/ 01363 pgpDig pgpDigUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ pgpDig dig, 01364 /*@null@*/ const char * msg) 01365 /*@modifies dig @*/; 01366 #define pgpDigUnlink(_dig, _msg) \ 01367 ((pgpDig)rpmioUnlinkPoolItem((rpmioItem)(_dig), _msg, __FILE__, __LINE__)) 01368 01375 /*@unused@*/ /*@newref@*/ /*@null@*/ 01376 pgpDig pgpDigLink (/*@null@*/ pgpDig dig, /*@null@*/ const char * msg) 01377 /*@modifies dig @*/; 01378 #define pgpDigLink(_dig, _msg) \ 01379 ((pgpDig)rpmioLinkPoolItem((rpmioItem)(_dig), _msg, __FILE__, __LINE__)) 01380 01386 /*@unused@*/ /*@null@*/ 01387 pgpDig pgpDigFree(/*@killref@*/ /*@only@*/ /*@null@*/ pgpDig dig) 01388 /*@modifies dig @*/; 01389 #define pgpDigFree(_dig, _msg) \ 01390 ((pgpDig)rpmioFreePoolItem((rpmioItem)(_dig), _msg, __FILE__, __LINE__)) 01391 01396 /*@relnull@*/ 01397 pgpDig pgpDigNew(/*@unused@*/ pgpVSFlags vsflags) 01398 /*@globals fileSystem @*/ 01399 /*@modifies fileSystem @*/; 01400 01405 void pgpDigClean(/*@null@*/ pgpDig dig) 01406 /*@modifies dig @*/; 01407 01413 /*@exposed@*/ 01414 pgpDigParams pgpGetPubkey(const pgpDig dig) 01415 /*@*/; 01416 01422 /*@exposed@*/ 01423 pgpDigParams pgpGetSignature(const pgpDig dig) 01424 /*@*/; 01425 01431 rpmuint32_t pgpGetSigtag(const pgpDig dig) 01432 /*@*/; 01433 01439 rpmuint32_t pgpGetSigtype(const pgpDig dig) 01440 /*@*/; 01441 01447 /*@observer@*/ /*@null@*/ 01448 extern const void * pgpGetSig(const pgpDig dig) 01449 /*@*/; 01450 01456 rpmuint32_t pgpGetSiglen(const pgpDig dig) 01457 /*@*/; 01458 01468 int pgpSetSig(pgpDig dig, 01469 rpmuint32_t sigtag, rpmuint32_t sigtype, 01470 /*@kept@*/ /*@null@*/ const void * sig, rpmuint32_t siglen) 01471 /*@modifies dig @*/; 01472 01479 /*@null@*/ 01480 void * pgpStatsAccumulator(pgpDig dig, int opx) 01481 /*@*/; 01482 01490 int pgpSetFindPubkey(pgpDig dig, 01491 /*@null@*/ int (*findPubkey) (void *ts, /*@null@*/ void *dig), 01492 /*@exposed@*/ /*@null@*/ void * _ts) 01493 /*@modifies dig @*/; 01494 01500 int pgpFindPubkey(pgpDig dig) 01501 /*@modifies dig @*/; 01502 01509 /*@unused@*/ static inline 01510 int pgpIsPkt(const rpmuint8_t * p, /*@null@*/ pgpTag * tagp) 01511 /*@modifies *tagp @*/ 01512 { 01513 unsigned int val = (unsigned int) *p++; 01514 pgpTag tag; 01515 int rc; 01516 01517 /* XXX can't deal with these. */ 01518 if (!(val & 0x80)) 01519 return 0; 01520 01521 if (val & 0x40) 01522 tag = (pgpTag)(val & 0x3f); 01523 else 01524 tag = (pgpTag)((val >> 2) & 0xf); 01525 01526 switch (tag) { 01527 case PGPTAG_MARKER: 01528 case PGPTAG_SYMMETRIC_SESSION_KEY: 01529 case PGPTAG_ONEPASS_SIGNATURE: 01530 case PGPTAG_PUBLIC_KEY: 01531 case PGPTAG_SECRET_KEY: 01532 case PGPTAG_PUBLIC_SESSION_KEY: 01533 case PGPTAG_SIGNATURE: 01534 case PGPTAG_COMMENT: 01535 case PGPTAG_COMMENT_OLD: 01536 case PGPTAG_LITERAL_DATA: 01537 case PGPTAG_COMPRESSED_DATA: 01538 case PGPTAG_SYMMETRIC_DATA: 01539 rc = 1; 01540 break; 01541 case PGPTAG_PUBLIC_SUBKEY: 01542 case PGPTAG_SECRET_SUBKEY: 01543 case PGPTAG_USER_ID: 01544 case PGPTAG_RESERVED: 01545 case PGPTAG_TRUST: 01546 case PGPTAG_PHOTOID: 01547 case PGPTAG_ENCRYPTED_MDC: 01548 case PGPTAG_MDC: 01549 case PGPTAG_PRIVATE_60: 01550 case PGPTAG_PRIVATE_62: 01551 case PGPTAG_CONTROL: 01552 default: 01553 rc = 0; 01554 break; 01555 } 01556 if (tagp != NULL) 01557 *tagp = tag; 01558 return rc; 01559 } 01560 01561 #define CRC24_INIT 0xb704ce 01562 #define CRC24_POLY 0x1864cfb 01563 01570 /*@unused@*/ static inline 01571 unsigned int pgpCRC(const rpmuint8_t * octets, size_t len) 01572 /*@*/ 01573 { 01574 unsigned int crc = CRC24_INIT; 01575 int i; 01576 01577 while (len--) { 01578 crc ^= (*octets++) << 16; 01579 for (i = 0; i < 8; i++) { 01580 crc <<= 1; 01581 if (crc & 0x1000000) 01582 crc ^= CRC24_POLY; 01583 } 01584 } 01585 return crc & 0xffffff; 01586 } 01587 01590 typedef int (*pgpImplSet_t) (/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) 01591 /*@modifies ctx, dig @*/; 01592 01595 typedef int (*pgpImplVerify_t) (pgpDig dig) 01596 /*@*/; 01597 01600 typedef int (*pgpImplMpiItem_t) (const char * pre, pgpDig dig, int itemno, 01601 const rpmuint8_t * p, /*@null@*/ const rpmuint8_t * pend) 01602 /*@globals fileSystem @*/ 01603 /*@modifies dig, fileSystem @*/; 01604 01607 typedef void (*pgpImplClean_t) (void * impl) 01608 /*@modifies impl @*/; 01609 01612 typedef void * (*pgpImplFree_t) (/*@only@*/ void * impl) 01613 /*@modifies impl @*/; 01614 01617 typedef void * (*pgpImplInit_t) (void) 01618 /*@*/; 01619 01620 01623 typedef struct pgpImplVecs_s { 01624 pgpImplSet_t _pgpSetRSA; 01625 pgpImplVerify_t _pgpVerifyRSA; 01626 pgpImplSet_t _pgpSetDSA; 01627 pgpImplVerify_t _pgpVerifyDSA; 01628 pgpImplSet_t _pgpSetECDSA; 01629 pgpImplVerify_t _pgpVerifyECDSA; 01630 pgpImplMpiItem_t _pgpMpiItem; 01631 pgpImplClean_t _pgpClean; 01632 pgpImplFree_t _pgpFree; 01633 pgpImplInit_t _pgpInit; 01634 } pgpImplVecs_t; 01635 01638 /*@unchecked@*/ 01639 extern pgpImplVecs_t * pgpImplVecs; 01640 01641 /*@-mustmod@*/ 01644 /*@unused@*/ static inline 01645 int pgpImplSetRSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) 01646 /*@modifies ctx, dig @*/ 01647 { 01648 return (*pgpImplVecs->_pgpSetRSA) (ctx, dig, sigp); 01649 } 01650 01653 /*@unused@*/ static inline 01654 int pgpImplVerifyRSA(pgpDig dig) 01655 /*@*/ 01656 { 01657 return (*pgpImplVecs->_pgpVerifyRSA) (dig); 01658 } 01659 01662 /*@unused@*/ static inline 01663 int pgpImplSetDSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) 01664 /*@modifies ctx, dig @*/ 01665 { 01666 return (*pgpImplVecs->_pgpSetDSA) (ctx, dig, sigp); 01667 } 01668 01671 /*@unused@*/ static inline 01672 int pgpImplVerifyDSA(pgpDig dig) 01673 /*@*/ 01674 { 01675 return (*pgpImplVecs->_pgpVerifyDSA) (dig); 01676 } 01677 01680 /*@unused@*/ static inline 01681 int pgpImplSetECDSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) 01682 /*@modifies ctx, dig @*/ 01683 { 01684 return (*pgpImplVecs->_pgpSetECDSA) (ctx, dig, sigp); 01685 } 01686 01689 /*@unused@*/ static inline 01690 int pgpImplVerifyECDSA(pgpDig dig) 01691 /*@*/ 01692 { 01693 return (*pgpImplVecs->_pgpVerifyECDSA) (dig); 01694 } 01695 01698 /*@unused@*/ static inline 01699 int pgpImplMpiItem(const char * pre, pgpDig dig, int itemno, 01700 const rpmuint8_t * p, /*@null@*/ const rpmuint8_t * pend) 01701 /*@modifies dig @*/ 01702 { 01703 return (*pgpImplVecs->_pgpMpiItem) (pre, dig, itemno, p, pend); 01704 } 01705 01708 /*@unused@*/ static inline 01709 void pgpImplClean(void * impl) 01710 /*@modifies impl @*/ 01711 { 01712 /*@-noeffectuncon@*/ 01713 (*pgpImplVecs->_pgpClean) (impl); 01714 /*@=noeffectuncon@*/ 01715 } 01716 01719 /*@unused@*/ static inline 01720 /*@null@*/ 01721 void * pgpImplFree(/*@only@*/ void * impl) 01722 /*@modifies impl @*/ 01723 { 01724 return (*pgpImplVecs->_pgpFree) (impl); 01725 } 01726 01729 /*@unused@*/ static inline 01730 void * pgpImplInit(void) 01731 /*@*/ 01732 { 01733 return (*pgpImplVecs->_pgpInit) (); 01734 } 01735 /*@=mustmod@*/ 01736 01737 #ifdef __cplusplus 01738 } 01739 #endif 01740 /*@=fcnuse@*/ 01741 01742 #endif /* H_RPMPGP */