rpm  4.16.1.2
rpmpgp.h
Go to the documentation of this file.
1 #ifndef H_RPMPGP
2 #define H_RPMPGP
3 
17 #include <string.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <rpm/rpmtypes.h>
21 #include <rpm/rpmstring.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
29 typedef struct DIGEST_CTX_s * DIGEST_CTX;
30 typedef struct rpmDigestBundle_s * rpmDigestBundle;
31 
34 typedef struct pgpDig_s * pgpDig;
35 
38 typedef struct pgpDigParams_s * pgpDigParams;
39 
40 typedef uint8_t pgpKeyID_t[8];
41 typedef uint8_t pgpTime_t[4];
42 
50 typedef enum pgpTag_e {
63  PGPTAG_TRUST = 12,
69  PGPTAG_MDC = 19,
74 } pgpTag;
75 
110 typedef struct pgpPktPubkey_s {
111  uint8_t version;
113  uint8_t algo;
114 } pgpPktPubkey;
115 
116 
123 typedef enum pgpSigType_e {
141 } pgpSigType;
142 
167 typedef enum pgpPubkeyAlgo_e {
178 } pgpPubkeyAlgo;
179 
204 typedef enum pgpSymkeyAlgo_e {
217 } pgpSymkeyAlgo;
218 
234 typedef enum pgpCompressAlgo_e {
240 
264 typedef enum pgpHashAlgo_e {
277 } pgpHashAlgo;
278 
285 typedef enum pgpCurveId_e {
293 } pgpCurveId;
294 
316 typedef struct pgpPktSigV3_s {
317  uint8_t version;
318  uint8_t hashlen;
319  uint8_t sigtype;
322  uint8_t pubkey_algo;
323  uint8_t hash_algo;
324  uint8_t signhash16[2];
325 } * pgpPktSigV3;
326 
348 typedef struct pgpPktSigV4_s {
349  uint8_t version;
350  uint8_t sigtype;
351  uint8_t pubkey_algo;
352  uint8_t hash_algo;
353  uint8_t hashlen[2];
354 } * pgpPktSigV4;
355 
422 typedef enum pgpSubType_e {
461 } pgpSubType;
462 
483 typedef union pgpPktSig_u {
486 } * pgpPktSig;
487 
516 typedef struct pgpPktSymkey_s {
517  uint8_t version;
518  uint8_t symkey_algo;
519  uint8_t s2k[1];
520 } pgpPktSymkey;
521 
551 typedef struct pgpPktOnepass_s {
552  uint8_t version;
553  uint8_t sigtype;
554  uint8_t hash_algo;
555  uint8_t pubkey_algo;
557  uint8_t nested;
558 } * pgpPktOnepass;
559 
632 typedef struct pgpPktKeyV3_s {
633  uint8_t version;
635  uint8_t valid[2];
636  uint8_t pubkey_algo;
637 } * pgpPktKeyV3;
638 
675 typedef struct pgpPktKeyV4_s {
676  uint8_t version;
678  uint8_t pubkey_algo;
679 } * pgpPktKeyV4;
680 
745 typedef union pgpPktKey_u {
748 } pgpPktKey;
749 
774 typedef struct pgpPktCdata_s {
775  uint8_t compressalgo;
776  uint8_t data[1];
777 } pgpPktCdata;
778 
813 typedef struct pgpPktEdata_s {
814  uint8_t data[1];
815 } pgpPktEdata;
816 
864 typedef struct pgpPktLdata_s {
865  uint8_t format;
866  uint8_t filenamelen;
867  uint8_t filename[1];
868 } pgpPktLdata;
869 
883 typedef struct pgpPktTrust_s {
884  uint8_t flag;
885 } pgpPktTrust;
886 
897 typedef struct pgpPktUid_s {
898  uint8_t userid[1];
899 } pgpPktUid;
900 
903 union pgpPktPre_u {
915 };
916 
919 typedef enum pgpArmor_e {
927 #define PGPARMOR_ERROR PGPARMOR_ERR_NO_BEGIN_PGP
936 } pgpArmor;
937 
940 typedef enum pgpArmorKey_e {
946 } pgpArmorKey;
947 
948 typedef enum pgpValType_e {
959 } pgpValType;
960 
966 };
967 
969 
976 const char * pgpValString(pgpValType type, uint8_t val);
977 
984 static inline
985 unsigned int pgpGrab(const uint8_t *s, size_t nbytes)
986 {
987  size_t i = 0;
988  size_t nb = (nbytes <= sizeof(i) ? nbytes : sizeof(i));
989  while (nb--)
990  i = (i << 8) | *s++;
991  return i;
992 }
993 
1000 char * pgpHexStr(const uint8_t *p, size_t plen);
1001 
1010 int pgpPubkeyFingerprint(const uint8_t * pkt, size_t pktlen,
1011  uint8_t **fp, size_t *fplen);
1012 
1020 int pgpPubkeyKeyID(const uint8_t * pkt, size_t pktlen, pgpKeyID_t keyid);
1021 
1030 int pgpPrtParams(const uint8_t *pkts, size_t pktlen, unsigned int pkttype,
1031  pgpDigParams * ret);
1032 
1042 int pgpPrtParamsSubkeys(const uint8_t *pkts, size_t pktlen,
1043  pgpDigParams mainkey, pgpDigParams **subkeys,
1044  int *subkeysCount);
1053 int pgpPrtPkts(const uint8_t *pkts, size_t pktlen, pgpDig dig, int printing);
1054 
1062 pgpArmor pgpReadPkts(const char * fn, uint8_t ** pkt, size_t * pktlen);
1063 
1071 pgpArmor pgpParsePkts(const char *armor, uint8_t ** pkt, size_t * pktlen);
1072 
1085 int pgpPubKeyCertLen(const uint8_t *pkts, size_t pktslen, size_t *certlen);
1086 
1094 char * pgpArmorWrap(int atype, const unsigned char * s, size_t ns);
1095 
1100 pgpDig pgpNewDig(void);
1101 
1106 void pgpCleanDig(pgpDig dig);
1107 
1113 pgpDig pgpFreeDig(pgpDig dig);
1114 
1121 pgpDigParams pgpDigGetParams(pgpDig dig, unsigned int pkttype);
1122 
1130 
1137 unsigned int pgpDigParamsAlgo(pgpDigParams digp, unsigned int algotype);
1138 
1145 
1154 
1163 rpmRC pgpVerifySig(pgpDig dig, DIGEST_CTX hashctx);
1164 
1170 char *pgpIdentItem(pgpDigParams digp);
1171 
1179 int rpmInitCrypto(void);
1180 
1184 int rpmFreeCrypto(void);
1185 
1192 
1198 size_t rpmDigestLength(int hashalgo);
1199 
1207 DIGEST_CTX rpmDigestInit(int hashalgo, rpmDigestFlags flags);
1208 
1216 int rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len);
1217 
1229 int rpmDigestFinal(DIGEST_CTX ctx,
1230  void ** datap,
1231  size_t * lenp, int asAscii);
1232 
1238 
1245 
1254 int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo,
1255  rpmDigestFlags flags);
1256 
1265 int rpmDigestBundleAddID(rpmDigestBundle bundle, int algo, int id,
1266  rpmDigestFlags flags);
1267 
1275 int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len);
1276 
1287 int rpmDigestBundleFinal(rpmDigestBundle bundle, int id,
1288  void ** datap, size_t * lenp, int asAscii);
1289 
1297 
1298 #ifdef __cplusplus
1299 }
1300 #endif
1301 
1302 #endif /* H_RPMPGP */
uint8_t userid[1]
Definition: rpmpgp.h:898
struct pgpPktSigV3_s v3
Definition: rpmpgp.h:484
5.5.1.
Definition: rpmpgp.h:632
uint8_t hash_algo
Definition: rpmpgp.h:352
struct pgpPktLdata_s pgpPktLdata
5.8.
5.7.
Definition: rpmpgp.h:813
pgpArmor pgpParsePkts(const char *armor, uint8_t **pkt, size_t *pktlen)
Parse armored OpenPGP packets from memory.
enum pgpPubkeyAlgo_e pgpPubkeyAlgo
9.1.
pgpDig pgpNewDig(void)
Create a container for parsed OpenPGP packet(s).
uint8_t hash_algo
Definition: rpmpgp.h:554
struct pgpPktSigV4_s * pgpPktSigV4
5.2.3.
struct pgpPktTrust_s pgpPktTrust
5.10.
struct pgpPktPubkey_s pgpPktPubkey
5.1.
pgpPktCdata cdata
Definition: rpmpgp.h:909
uint8_t pubkey_algo
Definition: rpmpgp.h:678
5.6.
Definition: rpmpgp.h:774
struct pgpPktKeyV3_s * pgpPktKeyV3
5.5.1.
pgpValType_e
Definition: rpmpgp.h:948
enum pgpSymkeyAlgo_e pgpSymkeyAlgo
9.2.
5.11.
Definition: rpmpgp.h:897
pgpPktOnepass onepass
Definition: rpmpgp.h:907
struct pgpPktCdata_s pgpPktCdata
5.6.
pgpTime_t time
Definition: rpmpgp.h:677
int pgpDigParamsCmp(pgpDigParams p1, pgpDigParams p2)
Compare OpenPGP packet parameters param p1 1st parameter container param p2 2nd parameter container r...
pgpTag_e
4.3.
Definition: rpmpgp.h:50
pgpArmor pgpReadPkts(const char *fn, uint8_t **pkt, size_t *pktlen)
Parse armored OpenPGP packets from a file.
uint8_t version
Definition: rpmpgp.h:317
uint8_t version
Definition: rpmpgp.h:633
rpmDigestBundle rpmDigestBundleFree(rpmDigestBundle bundle)
Free a digest bundle and all contained digest contexts.
pgpCurveId_e
ECC Curves.
Definition: rpmpgp.h:285
uint8_t signhash16[2]
Definition: rpmpgp.h:324
pgpPubkeyAlgo_e
9.1.
Definition: rpmpgp.h:167
uint8_t version
Definition: rpmpgp.h:552
struct pgpPktKeyV4_s * pgpPktKeyV4
The version 4 format is similar to the version 3 format except for the absence of a validity period...
int rpmDigestFinal(DIGEST_CTX ctx, void **datap, size_t *lenp, int asAscii)
Return digest and destroy context.
struct DIGEST_CTX_s * DIGEST_CTX
Definition: rpmpgp.h:29
5.2.3.
Definition: rpmpgp.h:348
enum pgpCurveId_e pgpCurveId
ECC Curves.
enum pgpCompressAlgo_e pgpCompressAlgo
9.3.
DIGEST_CTX rpmDigestBundleDupCtx(rpmDigestBundle bundle, int id)
Duplicate a digest context from a bundle.
DIGEST_CTX rpmDigestInit(int hashalgo, rpmDigestFlags flags)
Initialize digest.
uint8_t version
Definition: rpmpgp.h:111
pgpPktSig sig
Definition: rpmpgp.h:905
enum pgpArmorKey_e pgpArmorKey
uint8_t version
Definition: rpmpgp.h:349
uint8_t valid[2]
Definition: rpmpgp.h:635
pgpArmorKey_e
Definition: rpmpgp.h:940
uint8_t pubkey_algo
Definition: rpmpgp.h:555
pgpDig pgpFreeDig(pgpDig dig)
Destroy a container for parsed OpenPGP packet(s).
uint8_t flag
Definition: rpmpgp.h:884
struct pgpDig_s * pgpDig
Definition: rpmpgp.h:34
rpmRC pgpVerifySignature(pgpDigParams key, pgpDigParams sig, DIGEST_CTX hashctx)
Verify a PGP signature.
5.2.2.
Definition: rpmpgp.h:316
int pgpPubkeyKeyID(const uint8_t *pkt, size_t pktlen, pgpKeyID_t keyid)
Calculate OpenPGP public key Key ID.
5.5.3.
Definition: rpmpgp.h:745
uint8_t pgpKeyID_t[8]
Definition: rpmpgp.h:40
uint8_t s2k[1]
Definition: rpmpgp.h:519
int rpmDigestBundleFinal(rpmDigestBundle bundle, int id, void **datap, size_t *lenp, int asAscii)
Return digest from a bundle and destroy context, see rpmDigestFinal().
static unsigned int pgpGrab(const uint8_t *s, size_t nbytes)
Return (native-endian) integer from big-endian representation.
Definition: rpmpgp.h:985
struct rpmDigestBundle_s * rpmDigestBundle
Definition: rpmpgp.h:30
uint8_t pubkey_algo
Definition: rpmpgp.h:351
uint8_t data[1]
Definition: rpmpgp.h:776
rpmFlags rpmDigestFlags
Definition: rpmpgp.h:968
uint32_t rpmFlags
Definition: rpmtypes.h:42
pgpArmor_e
Definition: rpmpgp.h:919
pgpPktPubkey pubkey
Definition: rpmpgp.h:904
enum pgpHashAlgo_e pgpHashAlgo
9.4.
enum pgpValType_e pgpValType
struct pgpPktEdata_s pgpPktEdata
5.7.
uint8_t version
Definition: rpmpgp.h:517
uint8_t symkey_algo
Definition: rpmpgp.h:518
uint8_t data[1]
Definition: rpmpgp.h:814
int rpmDigestUpdate(DIGEST_CTX ctx, const void *data, size_t len)
Update context with next plain text buffer.
DIGEST_CTX rpmDigestDup(DIGEST_CTX octx)
Duplicate a digest context.
uint8_t format
Definition: rpmpgp.h:865
uint8_t sigtype
Definition: rpmpgp.h:350
uint8_t hash_algo
Definition: rpmpgp.h:323
char * pgpHexStr(const uint8_t *p, size_t plen)
Return hex formatted representation of bytes.
pgpPktKey key
Definition: rpmpgp.h:908
pgpDigParams pgpDigParamsFree(pgpDigParams digp)
Destroy parsed OpenPGP packet parameter(s).
rpmDigestFlags_e
Bit(s) to control digest operation.
Definition: rpmpgp.h:964
pgpDigParams pgpDigGetParams(pgpDig dig, unsigned int pkttype)
Retrieve parameters for parsed OpenPGP packet(s).
union pgpPktKey_u pgpPktKey
5.5.3.
rpmRC pgpVerifySig(pgpDig dig, DIGEST_CTX hashctx)
Verify a PGP signature.
int rpmDigestBundleUpdate(rpmDigestBundle bundle, const void *data, size_t len)
Update contexts within bundle with next plain text buffer.
rpmDigestBundle rpmDigestBundleNew(void)
Create a new digest bundle.
int pgpPubkeyFingerprint(const uint8_t *pkt, size_t pktlen, uint8_t **fp, size_t *fplen)
Calculate OpenPGP public key fingerprint.
enum pgpSubType_e pgpSubType
5.2.3.1.
uint8_t algo
Definition: rpmpgp.h:113
pgpTime_t time
Definition: rpmpgp.h:634
pgpSubType_e
5.2.3.1.
Definition: rpmpgp.h:422
pgpPktLdata ldata
Definition: rpmpgp.h:912
char * pgpArmorWrap(int atype, const unsigned char *s, size_t ns)
Wrap a OpenPGP packets in ascii armor for transport.
uint8_t nested
Definition: rpmpgp.h:557
struct pgpPktUid_s pgpPktUid
5.11.
uint8_t compressalgo
Definition: rpmpgp.h:775
pgpHashAlgo_e
9.4.
Definition: rpmpgp.h:264
uint8_t filename[1]
Definition: rpmpgp.h:867
pgpTime_t time
Definition: rpmpgp.h:320
uint8_t hashlen[2]
Definition: rpmpgp.h:353
struct pgpPktSigV3_s * pgpPktSigV3
5.2.2.
pgpKeyID_t signid
Definition: rpmpgp.h:321
pgpPktUid uid
Definition: rpmpgp.h:914
enum pgpTag_e pgpTag
4.3.
uint8_t pgpTime_t[4]
Definition: rpmpgp.h:41
unsigned int pgpDigParamsAlgo(pgpDigParams digp, unsigned int algotype)
Retrieve OpenPGP algorithm parameters param digp parameter container param algotype PGPVAL_HASHALGO /...
uint8_t version
Definition: rpmpgp.h:676
uint8_t pubkey_algo
Definition: rpmpgp.h:636
int rpmDigestBundleAddID(rpmDigestBundle bundle, int algo, int id, rpmDigestFlags flags)
Add a new type of digest to a bundle.
int rpmInitCrypto(void)
Perform cryptography initialization.
char * pgpIdentItem(pgpDigParams digp)
Return a string identification of a PGP signature/pubkey.
pgpPktEdata edata
Definition: rpmpgp.h:910
pgpSigType_e
5.2.1.
Definition: rpmpgp.h:123
struct pgpPktKeyV4_s v4
Definition: rpmpgp.h:747
uint8_t hashlen
Definition: rpmpgp.h:318
pgpPktTrust tdata
Definition: rpmpgp.h:913
uint8_t pubkey_algo
Definition: rpmpgp.h:322
5.2.
Definition: rpmpgp.h:483
struct pgpPktSigV4_s v4
Definition: rpmpgp.h:485
pgpKeyID_t keyid
Definition: rpmpgp.h:112
struct pgpDigParams_s * pgpDigParams
Definition: rpmpgp.h:38
int rpmFreeCrypto(void)
Shutdown cryptography.
int pgpPubKeyCertLen(const uint8_t *pkts, size_t pktslen, size_t *certlen)
Return a length of the first public key certificate in a buffer given by pkts that contains one or mo...
struct pgpPktSymkey_s pgpPktSymkey
5.3.
pgpSymkeyAlgo_e
9.2.
Definition: rpmpgp.h:204
int pgpPrtParamsSubkeys(const uint8_t *pkts, size_t pktlen, pgpDigParams mainkey, pgpDigParams **subkeys, int *subkeysCount)
Parse subkey parameters from OpenPGP packet(s).
struct pgpPktKeyV3_s v3
Definition: rpmpgp.h:746
const char * pgpValString(pgpValType type, uint8_t val)
Return string representation of am OpenPGP value.
enum pgpSigType_e pgpSigType
5.2.1.
5.8.
Definition: rpmpgp.h:864
int pgpPrtParams(const uint8_t *pkts, size_t pktlen, unsigned int pkttype, pgpDigParams *ret)
Parse a OpenPGP packet(s).
union pgpPktSig_u * pgpPktSig
5.2.
uint8_t sigtype
Definition: rpmpgp.h:319
int rpmDigestBundleAdd(rpmDigestBundle bundle, int algo, rpmDigestFlags flags)
Add a new type of digest to a bundle.
void pgpCleanDig(pgpDig dig)
Release (malloc&#39;d) data from container.
pgpCompressAlgo_e
9.3.
Definition: rpmpgp.h:234
int pgpPrtPkts(const uint8_t *pkts, size_t pktlen, pgpDig dig, int printing)
Print/parse a OpenPGP packet(s).
The version 4 format is similar to the version 3 format except for the absence of a validity period...
Definition: rpmpgp.h:675
5.10.
Definition: rpmpgp.h:883
uint8_t sigtype
Definition: rpmpgp.h:553
pgpKeyID_t signid
Definition: rpmpgp.h:556
enum pgpArmor_e pgpArmor
uint8_t filenamelen
Definition: rpmpgp.h:866
enum rpmRC_e rpmRC
Package read return codes.
size_t rpmDigestLength(int hashalgo)
Obtain digest length in bytes.
pgpPktSymkey symkey
Definition: rpmpgp.h:906
struct pgpPktOnepass_s * pgpPktOnepass
5.4.