rpmio/rpmpgp.c File Reference

Routines to handle RFC-2440 detached signatures. More...

#include "system.h"
#include "rpmio_internal.h"
#include "debug.h"

Go to the source code of this file.

Defines

#define DSA_SUBPRIME_LEN   20
#define TOKEQ(_s, _tok)   (!strncmp((_s), (_tok), sizeof(_tok)-1))

Functions

static void * _free (const void *p)
 Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static void pgpPrtNL (void)
static void pgpPrtInt (const char *pre, int i)
static void pgpPrtStr (const char *pre, const char *s)
static void pgpPrtHex (const char *pre, const byte *p, unsigned int plen)
void pgpPrtVal (const char *pre, pgpValTbl vs, byte val)
 Print an OpenPGP value.
static const char * pgpMpiHex (const byte *p)
static int pgpMpiSet (const char *pre, int lbits, void *dest, const byte *p, const byte *pend)
static SECItem * pgpMpiItem (PRArenaPool *arena, SECItem *item, const byte *p)
static SECKEYPublicKey * pgpNewPublicKey (KeyType type)
static SECKEYPublicKey * pgpNewRSAKey (void)
static SECKEYPublicKey * pgpNewDSAKey (void)
int pgpPrtSubType (const byte *h, unsigned int hlen, pgpSigType sigtype)
 Print/parse an OpenPGP subtype packet.
static int pgpPrtSigParams (pgpTag tag, byte pubkey_algo, byte sigtype, const byte *p, const byte *h, unsigned int hlen)
int pgpPrtSig (pgpTag tag, const byte *h, unsigned int hlen)
 Print/parse an OpenPGP signature packet.
static const bytepgpPrtPubkeyParams (byte pubkey_algo, const byte *p, const byte *h, unsigned int hlen)
static const bytepgpPrtSeckeyParams (byte pubkey_algo, const byte *p, const byte *h, unsigned int hlen)
int pgpPrtKey (pgpTag tag, const byte *h, unsigned int hlen)
 Print/parse an OpenPGP key packet.
int pgpPrtUserID (pgpTag tag, const byte *h, unsigned int hlen)
 Print/parse an OpenPGP userid packet.
int pgpPrtComment (pgpTag tag, const byte *h, unsigned int hlen)
 Print/parse an OpenPGP comment packet.
int pgpPubkeyFingerprint (const byte *pkt, unsigned int pktlen, byte *keyid)
 Calculate OpenPGP public key fingerprint.
int pgpPrtPkt (const byte *pkt, unsigned int pleft)
 Print/parse next OpenPGP packet.
pgpDig pgpNewDig (void)
 Create a container for parsed OpenPGP packates.
void pgpCleanDig (pgpDig dig)
 Release (malloc'd) data from container.
pgpDig pgpFreeDig (pgpDig dig)
 Destroy a container for parsed OpenPGP packates.
int pgpPrtPkts (const byte *pkts, unsigned int pktlen, pgpDig dig, int printing)
 Print/parse a OpenPGP packet(s).
pgpArmor pgpReadPkts (const char *fn, const byte **pkt, size_t *pktlen)
 Parse armored OpenPGP packets from a file.
char * pgpArmorWrap (int atype, const unsigned char *s, size_t ns)
 Wrap a OpenPGP packets in ascii armor for transport.
int rpmInitCrypto (void)
 Perform cryptography initialization.

Variables

static int _debug = 0
static int _print = 0
static int _crypto_initialized = 0
static pgpDig _dig = NULL
static pgpDigParams _digp = NULL
struct pgpValTbl_s pgpSigTypeTbl []
struct pgpValTbl_s pgpPubkeyTbl []
struct pgpValTbl_s pgpSymkeyTbl []
 Symmetric key (string, value) pairs.
struct pgpValTbl_s pgpCompressionTbl []
 Compression (string, value) pairs.
struct pgpValTbl_s pgpHashTbl []
 Hash (string, value) pairs.
struct pgpValTbl_s pgpKeyServerPrefsTbl []
struct pgpValTbl_s pgpSubTypeTbl []
 Subtype (string, value) pairs.
struct pgpValTbl_s pgpTagTbl []
struct pgpValTbl_s pgpArmorTbl []
 Armor (string, value) pairs.
struct pgpValTbl_s pgpArmorKeyTbl []
 Armor key (string, value) pairs.
static const char * pgpSigRSA []
static const char * pgpSigDSA []
static const char * pgpPublicRSA []
static const char * pgpSecretRSA []
static const char * pgpPublicDSA []
static const char * pgpSecretDSA []
static const char * pgpPublicELGAMAL []
static const char * pgpSecretELGAMAL []


Detailed Description

Routines to handle RFC-2440 detached signatures.

Definition in file rpmpgp.c.


Define Documentation

#define DSA_SUBPRIME_LEN   20

Definition at line 475 of file rpmpgp.c.

Referenced by pgpPrtSigParams().

#define TOKEQ ( _s,
_tok   )     (!strncmp((_s), (_tok), sizeof(_tok)-1))

Referenced by pgpReadPkts().


Function Documentation

static void* _free ( const void *  p  )  [inline, static]

Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.

Parameters:
p memory to free
Returns:
NULL always

Definition at line 194 of file rpmpgp.c.

char* pgpArmorWrap ( int  atype,
const unsigned char *  s,
size_t  ns 
)

Wrap a OpenPGP packets in ascii armor for transport.

Parameters:
atype type of armor
s binary pkt data
ns binary pkt data length
Returns:
formatted string

Definition at line 1376 of file rpmpgp.c.

References _free(), pgpValStr(), stpcpy(), pgpValTbl_s::val, VERSION, and xmalloc().

Referenced by armorFormat(), and processMetadataFile().

void pgpCleanDig ( pgpDig  dig  ) 

Release (malloc'd) data from container.

Parameters:
dig container

Definition at line 1113 of file rpmpgp.c.

References _free(), pgpDig_s::dsa, pgpDig_s::dsasig, pgpDigParams_s::hash, pgpDig_s::md5, pgpDigParams_s::params, pgpDig_s::pubkey, pgpDig_s::rsa, pgpDig_s::rsasig, pgpDig_s::sha1, pgpDig_s::signature, and pgpDigParams_s::userid.

Referenced by pgpFreeDig(), and rpmVerifySignatures().

pgpDig pgpFreeDig ( pgpDig  dig  ) 

Destroy a container for parsed OpenPGP packates.

Parameters:
dig container
Returns:
NULL always

Definition at line 1161 of file rpmpgp.c.

References _free(), pgpDig_s::hdrmd5ctx, pgpDig_s::hdrsha1ctx, pgpDig_s::md5ctx, pgpCleanDig(), rpmDigestFinal(), and pgpDig_s::sha1ctx.

Referenced by getSignid(), makeGPGSignature(), makePGPSignature(), pgpsigFormat(), rpmcliImportPubkey(), and rpmtsCleanDig().

static const char* pgpMpiHex ( const byte p  )  [static]

Definition at line 252 of file rpmpgp.c.

References pgpHexCvt(), and pgpMpiLen().

static SECItem* pgpMpiItem ( PRArenaPool *  arena,
SECItem *  item,
const byte p 
) [static]

Returns:
NULL on error

Definition at line 299 of file rpmpgp.c.

References pgpMpiLen().

Referenced by pgpPrtPubkeyParams(), and pgpPrtSigParams().

static int pgpMpiSet ( const char *  pre,
int  lbits,
void *  dest,
const byte p,
const byte pend 
) [static]

Returns:
0 on success

Definition at line 265 of file rpmpgp.c.

References _debug, pgpHexStr(), and pgpMpiBits().

Referenced by pgpPrtSigParams().

pgpDig pgpNewDig ( void   ) 

Create a container for parsed OpenPGP packates.

Returns:
container

Definition at line 1105 of file rpmpgp.c.

References xcalloc().

Referenced by getSignid(), makeGPGSignature(), makePGPSignature(), pgpsigFormat(), rpmcliImportPubkey(), rpmdbAdd(), rpmdbRemove(), and rpmtsDig().

static SECKEYPublicKey* pgpNewDSAKey ( void   )  [static]

Definition at line 355 of file rpmpgp.c.

References pgpNewPublicKey().

Referenced by pgpPrtPubkeyParams().

static SECKEYPublicKey* pgpNewPublicKey ( KeyType  type  )  [static]

Definition at line 327 of file rpmpgp.c.

Referenced by pgpNewDSAKey(), and pgpNewRSAKey().

static SECKEYPublicKey* pgpNewRSAKey ( void   )  [static]

Definition at line 350 of file rpmpgp.c.

References pgpNewPublicKey().

Referenced by pgpPrtPubkeyParams().

int pgpPrtComment ( pgpTag  tag,
const byte h,
unsigned int  hlen 
)

Print/parse an OpenPGP comment packet.

Parameters:
tag packet tag
h packet contents
hlen packet length (no. of bytes)
Returns:
0 on success

Definition at line 926 of file rpmpgp.c.

References _print, pgpPrtHex(), pgpPrtNL(), and pgpPrtVal().

Referenced by pgpPrtPkt().

static void pgpPrtHex ( const char *  pre,
const byte p,
unsigned int  plen 
) [static]

Definition at line 229 of file rpmpgp.c.

References _print, and pgpHexStr().

Referenced by pgpPrtComment(), pgpPrtPkt(), pgpPrtSeckeyParams(), pgpPrtSig(), and pgpPrtSubType().

static void pgpPrtInt ( const char *  pre,
int  i 
) [static]

Definition at line 209 of file rpmpgp.c.

References _print.

Referenced by pgpPrtSeckeyParams().

int pgpPrtKey ( pgpTag  tag,
const byte h,
unsigned int  hlen 
)

static void pgpPrtNL ( void   )  [static]

int pgpPrtPkt ( const byte pkt,
unsigned int  pleft 
)

int pgpPrtPkts ( const byte pkts,
unsigned int  pktlen,
pgpDig  dig,
int  printing 
)

Print/parse a OpenPGP packet(s).

Parameters:
pkts OpenPGP packet(s)
pktlen OpenPGP packet(s) length (no. of bytes)
Return values:
dig parsed output of signature/pubkey packet parameters
Parameters:
printing should packets be printed?
Returns:
-1 on error, 0 on success

Definition at line 1200 of file rpmpgp.c.

References _print, pgpPrtPkt(), PGPTAG_SIGNATURE, pgpDig_s::pubkey, pgpDig_s::signature, pgpDigParams_s::tag, and pgpValTbl_s::val.

Referenced by getSignid(), headerCheck(), makeGPGSignature(), makePGPSignature(), pgpsigFormat(), rpmcliImportPubkey(), rpmdbAdd(), rpmdbRemove(), rpmReadPackageFile(), rpmts_PgpPrtPkts(), rpmtsFindPubkey(), and rpmVerifySignatures().

static const byte* pgpPrtPubkeyParams ( byte  pubkey_algo,
const byte p,
const byte h,
unsigned int  hlen 
) [static]

static const byte* pgpPrtSeckeyParams ( byte  pubkey_algo,
const byte p,
const byte h,
unsigned int  hlen 
) [static]

int pgpPrtSig ( pgpTag  tag,
const byte h,
unsigned int  hlen 
)

static int pgpPrtSigParams ( pgpTag  tag,
byte  pubkey_algo,
byte  sigtype,
const byte p,
const byte h,
unsigned int  hlen 
) [static]

static void pgpPrtStr ( const char *  pre,
const char *  s 
) [static]

Definition at line 219 of file rpmpgp.c.

References _print.

Referenced by pgpPrtPubkeyParams(), pgpPrtSeckeyParams(), and pgpPrtSigParams().

int pgpPrtSubType ( const byte h,
unsigned int  hlen,
pgpSigType  sigtype 
)

int pgpPrtUserID ( pgpTag  tag,
const byte h,
unsigned int  hlen 
)

Print/parse an OpenPGP userid packet.

Parameters:
tag packet tag
h packet contents
hlen packet length (no. of bytes)
Returns:
0 on success

Definition at line 909 of file rpmpgp.c.

References _print, pgpPrtNL(), pgpPrtVal(), pgpDigParams_s::userid, and xmalloc().

Referenced by pgpPrtPkt().

void pgpPrtVal ( const char *  pre,
pgpValTbl  vs,
byte  val 
)

Print an OpenPGP value.

Parameters:
pre output prefix
vs table of (string,value) pairs
val byte value to print

Definition at line 239 of file rpmpgp.c.

References _print, and pgpValStr().

Referenced by pgpPrtComment(), pgpPrtKey(), pgpPrtPkt(), pgpPrtSeckeyParams(), pgpPrtSig(), pgpPrtSubType(), and pgpPrtUserID().

int pgpPubkeyFingerprint ( const byte pkt,
unsigned int  pktlen,
byte keyid 
)

Calculate OpenPGP public key fingerprint.

Todo:
V3 non-RSA public keys not implemented.
Parameters:
pkt OpenPGP packet (i.e. PGPTAG_PUBLIC_KEY)
pktlen OpenPGP packet length (no. of bytes)
Return values:
keyid publick key fingerprint
Returns:
0 on sucess, else -1

Definition at line 952 of file rpmpgp.c.

References pgpGrab(), PGPHASHALGO_SHA1, pgpLen(), pgpMpiLen(), PGPPUBKEYALGO_DSA, PGPPUBKEYALGO_RSA, pgpPktKeyV4_s::pubkey_algo, pgpPktKeyV3_s::pubkey_algo, RPMDIGEST_NONE, rpmDigestFinal(), rpmDigestInit(), rpmDigestUpdate(), and pgpValTbl_s::val.

Referenced by pgpPrtPkt().

pgpArmor pgpReadPkts ( const char *  fn,
const byte **  pkt,
size_t *  pktlen 
)

Parse armored OpenPGP packets from a file.

Parameters:
fn file name
Return values:
pkt dearmored OpenPGP packet(s)
pktlen dearmored OpenPGP packet(s) length in bytes
Returns:
type of armor found

Definition at line 1229 of file rpmpgp.c.

References _free(), PGPARMOR_ERR_BODY_DECODE, PGPARMOR_ERR_CRC_CHECK, PGPARMOR_ERR_CRC_DECODE, PGPARMOR_ERR_NO_BEGIN_PGP, PGPARMOR_ERR_NO_END_PGP, PGPARMOR_ERR_UNKNOWN_ARMOR_TYPE, PGPARMOR_NONE, PGPARMOR_PUBKEY, pgpCRC(), pgpGrab(), pgpIsPkt(), pgpValTok(), rpmioSlurp(), and TOKEQ.

Referenced by processMetadataFile(), rpmcliImportPubkeys(), and rpmtsFindPubkey().


Variable Documentation

int _crypto_initialized = 0 [static]

Definition at line 20 of file rpmpgp.c.

Referenced by rpmInitCrypto().

int _debug = 0 [static]

Definition at line 15 of file rpmpgp.c.

pgpDig _dig = NULL [static]

Definition at line 23 of file rpmpgp.c.

pgpDigParams _digp = NULL [static]

Definition at line 26 of file rpmpgp.c.

int _print = 0 [static]

Initial value:

 {
    { PGPARMORKEY_VERSION,      "Version: " },
    { PGPARMORKEY_COMMENT,      "Comment: " },
    { PGPARMORKEY_MESSAGEID,    "MessageID: " },
    { PGPARMORKEY_HASH,         "Hash: " },
    { PGPARMORKEY_CHARSET,      "Charset: " },
    { -1,                       "Unknown armor key" }
}
Armor key (string, value) pairs.

Definition at line 179 of file rpmpgp.c.

Initial value:

 {
    { PGPARMOR_MESSAGE,         "MESSAGE" },
    { PGPARMOR_PUBKEY,          "PUBLIC KEY BLOCK" },
    { PGPARMOR_SIGNATURE,       "SIGNATURE" },
    { PGPARMOR_SIGNED_MESSAGE,  "SIGNED MESSAGE" },
    { PGPARMOR_FILE,            "ARMORED FILE" },
    { PGPARMOR_PRIVKEY,         "PRIVATE KEY BLOCK" },
    { PGPARMOR_SECKEY,          "SECRET KEY BLOCK" },
    { -1,                       "Unknown armor block" }
}
Armor (string, value) pairs.

Definition at line 168 of file rpmpgp.c.

Initial value:

 {
    { PGPCOMPRESSALGO_NONE,     "Uncompressed" },
    { PGPCOMPRESSALGO_ZIP,      "ZIP" },
    { PGPCOMPRESSALGO_ZLIB,     "ZLIB" },
    { PGPCOMPRESSALGO_BZIP2,    "BZIP2" },
    { -1,                       "Unknown compression algorithm" },
}
Compression (string, value) pairs.

Definition at line 74 of file rpmpgp.c.

Initial value:

 {
    { PGPHASHALGO_MD5,          "MD5" },
    { PGPHASHALGO_SHA1,         "SHA1" },
    { PGPHASHALGO_RIPEMD160,    "RIPEMD160" },
    { PGPHASHALGO_MD2,          "MD2" },
    { PGPHASHALGO_TIGER192,     "TIGER192" },
    { PGPHASHALGO_HAVAL_5_160,  "HAVAL-5-160" },
    { PGPHASHALGO_SHA256,       "SHA256" },
    { PGPHASHALGO_SHA384,       "SHA384" },
    { PGPHASHALGO_SHA512,       "SHA512" },
    { -1,                       "Unknown hash algorithm" },
}
Hash (string, value) pairs.

Definition at line 82 of file rpmpgp.c.

Initial value:

 {
    { 0x80,                     "No-modify" },
    { -1,                       "Unknown key server preference" },
}

Definition at line 97 of file rpmpgp.c.

Initial value:

 {
    { PGPPUBKEYALGO_RSA,        "RSA" },
    { PGPPUBKEYALGO_RSA_ENCRYPT,"RSA(Encrypt-Only)" },
    { PGPPUBKEYALGO_RSA_SIGN,   "RSA(Sign-Only)" },
    { PGPPUBKEYALGO_ELGAMAL_ENCRYPT,"Elgamal(Encrypt-Only)" },
    { PGPPUBKEYALGO_DSA,        "DSA" },
    { PGPPUBKEYALGO_EC,         "Elliptic Curve" },
    { PGPPUBKEYALGO_ECDSA,      "ECDSA" },
    { PGPPUBKEYALGO_ELGAMAL,    "Elgamal" },
    { PGPPUBKEYALGO_DH,         "Diffie-Hellman (X9.42)" },
    { -1,                       "Unknown public key algorithm" },
}

Definition at line 45 of file rpmpgp.c.

const char* pgpPublicDSA[] [static]

Initial value:

 {
    "    p =",
    "    q =",
    "    g =",
    "    y =",
    NULL,
}

Definition at line 676 of file rpmpgp.c.

Referenced by pgpPrtPubkeyParams().

const char* pgpPublicELGAMAL[] [static]

Initial value:

 {
    "    p =",
    "    g =",
    "    y =",
    NULL,
}

Definition at line 691 of file rpmpgp.c.

Referenced by pgpPrtPubkeyParams().

const char* pgpPublicRSA[] [static]

Initial value:

 {
    "    n =",
    "    e =",
    NULL,
}

Definition at line 660 of file rpmpgp.c.

Referenced by pgpPrtPubkeyParams().

const char* pgpSecretDSA[] [static]

Initial value:

 {
    "    x =",
    NULL,
}

Definition at line 685 of file rpmpgp.c.

Referenced by pgpPrtSeckeyParams().

const char* pgpSecretELGAMAL[] [static]

Initial value:

 {
    "    x =",
    NULL,
}

Definition at line 699 of file rpmpgp.c.

Referenced by pgpPrtSeckeyParams().

const char* pgpSecretRSA[] [static]

Initial value:

 {
    "    d =",
    "    p =",
    "    q =",
    "    u =",
    NULL,
}

Definition at line 667 of file rpmpgp.c.

Referenced by pgpPrtSeckeyParams().

const char* pgpSigDSA[] [static]

Initial value:

 {
    "    r =",
    "    s =",
    NULL,
}

Definition at line 467 of file rpmpgp.c.

Referenced by pgpPrtSigParams().

const char* pgpSigRSA[] [static]

Initial value:

 {
    " m**d =",
    NULL,
}

Definition at line 461 of file rpmpgp.c.

Referenced by pgpPrtSigParams().

Initial value:

 {
    { PGPSIGTYPE_BINARY,        "Binary document signature" },
    { PGPSIGTYPE_TEXT,          "Text document signature" },
    { PGPSIGTYPE_STANDALONE,    "Standalone signature" },
    { PGPSIGTYPE_GENERIC_CERT,  "Generic certification of a User ID and Public Key" },
    { PGPSIGTYPE_PERSONA_CERT,  "Persona certification of a User ID and Public Key" },
    { PGPSIGTYPE_CASUAL_CERT,   "Casual certification of a User ID and Public Key" },
    { PGPSIGTYPE_POSITIVE_CERT, "Positive certification of a User ID and Public Key" },
    { PGPSIGTYPE_SUBKEY_BINDING,"Subkey Binding Signature" },
    { PGPSIGTYPE_SIGNED_KEY,    "Signature directly on a key" },
    { PGPSIGTYPE_KEY_REVOKE,    "Key revocation signature" },
    { PGPSIGTYPE_SUBKEY_REVOKE, "Subkey revocation signature" },
    { PGPSIGTYPE_CERT_REVOKE,   "Certification revocation signature" },
    { PGPSIGTYPE_TIMESTAMP,     "Timestamp signature" },
    { -1,                       "Unknown signature type" },
}

Definition at line 28 of file rpmpgp.c.

Subtype (string, value) pairs.

Definition at line 103 of file rpmpgp.c.

Initial value:

 {
    { PGPSYMKEYALGO_PLAINTEXT,  "Plaintext" },
    { PGPSYMKEYALGO_IDEA,       "IDEA" },
    { PGPSYMKEYALGO_TRIPLE_DES, "3DES" },
    { PGPSYMKEYALGO_CAST5,      "CAST5" },
    { PGPSYMKEYALGO_BLOWFISH,   "BLOWFISH" },
    { PGPSYMKEYALGO_SAFER,      "SAFER" },
    { PGPSYMKEYALGO_DES_SK,     "DES/SK" },
    { PGPSYMKEYALGO_AES_128,    "AES(128-bit key)" },
    { PGPSYMKEYALGO_AES_192,    "AES(192-bit key)" },
    { PGPSYMKEYALGO_AES_256,    "AES(256-bit key)" },
    { PGPSYMKEYALGO_TWOFISH,    "TWOFISH(256-bit key)" },
    { PGPSYMKEYALGO_NOENCRYPT,  "no encryption" },
    { -1,                       "Unknown symmetric key algorithm" },
}
Symmetric key (string, value) pairs.

Definition at line 58 of file rpmpgp.c.

Initial value:

 {
    { PGPTAG_PUBLIC_SESSION_KEY,"Public-Key Encrypted Session Key" },
    { PGPTAG_SIGNATURE,         "Signature" },
    { PGPTAG_SYMMETRIC_SESSION_KEY,"Symmetric-Key Encrypted Session Key" },
    { PGPTAG_ONEPASS_SIGNATURE, "One-Pass Signature" },
    { PGPTAG_SECRET_KEY,        "Secret Key" },
    { PGPTAG_PUBLIC_KEY,        "Public Key" },
    { PGPTAG_SECRET_SUBKEY,     "Secret Subkey" },
    { PGPTAG_COMPRESSED_DATA,   "Compressed Data" },
    { PGPTAG_SYMMETRIC_DATA,    "Symmetrically Encrypted Data" },
    { PGPTAG_MARKER,            "Marker" },
    { PGPTAG_LITERAL_DATA,      "Literal Data" },
    { PGPTAG_TRUST,             "Trust" },
    { PGPTAG_USER_ID,           "User ID" },
    { PGPTAG_PUBLIC_SUBKEY,     "Public Subkey" },
    { PGPTAG_COMMENT_OLD,       "Comment (from OpenPGP draft)" },
    { PGPTAG_PHOTOID,           "PGP's photo ID" },
    { PGPTAG_ENCRYPTED_MDC,     "Integrity protected encrypted data" },
    { PGPTAG_MDC,               "Manipulaion detection code packet" },
    { PGPTAG_PRIVATE_60,        "Private #60" },
    { PGPTAG_COMMENT,           "Comment" },
    { PGPTAG_PRIVATE_62,        "Private #62" },
    { PGPTAG_CONTROL,           "Control (GPG)" },
    { -1,                       "Unknown packet tag" },
}

Definition at line 142 of file rpmpgp.c.


Generated on Fri Dec 12 13:02:12 2008 for rpm by  doxygen 1.5.6