29 const char * redhatPubKeyDSA =
"\
30 mQGiBDfqVDgRBADBKr3Bl6PO8BQ0H8sJoD6p9U7Yyl7pjtZqioviPwXP+DCWd4u8\n\
31 HQzcxAZ57m8ssA1LK1Fx93coJhDzM130+p5BG9mYSWShLabR3N1KXdXQYYcowTOM\n\
32 GxdwYRGr1Spw8QydLhjVfU1VSl4xt6bupPbWJbyjkg5Z3P7BlUOUJmrx3wCgobNV\n\
33 EDGaWYJcch5z5B1of/41G8kEAKii6q7Gu/vhXXnLS6m15oNnPVybyngiw/23dKjS\n\
34 ZVG7rKANEK2mxg1VB+vc/uUc4k49UxJJfCZg1gu1sPFV3GSa+Y/7jsiLktQvCiLP\n\
35 lncQt1dV+ENmHR5BdIDPWDzKBVbgWnSDnqQ6KrZ7T6AlZ74VMpjGxxkWU6vV2xsW\n\
36 XCLPA/9P/vtImA8CZN3jxGgtK5GGtDNJ/cMhhuv5tnfwFg4b/VGo2Jr8mhLUqoIb\n\
37 E6zeGAmZbUpdckDco8D5fiFmqTf5+++pCEpJLJkkzel/32N2w4qzPrcRMCiBURES\n\
38 PjCLd4Y5rPoU8E4kOHc/4BuHN903tiCsCPloCrWsQZ7UdxfQ5LQiUmVkIEhhdCwg\n\
39 SW5jIDxzZWN1cml0eUByZWRoYXQuY29tPohVBBMRAgAVBQI36lQ4AwsKAwMVAwID\n\
40 FgIBAheAAAoJECGRgM3bQqYOsBQAnRVtg7B25Hm11PHcpa8FpeddKiq2AJ9aO8sB\n\
41 XmLDmPOEFI75mpTrKYHF6rkCDQQ36lRyEAgAokgI2xJ+3bZsk8jRA8ORIX8DH05U\n\
42 lMH27qFYzLbT6npXwXYIOtVn0K2/iMDj+oEB1Aa2au4OnddYaLWp06v3d+XyS0t+\n\
43 5ab2ZfIQzdh7wCwxqRkzR+/H5TLYbMG+hvtTdylfqIX0WEfoOXMtWEGSVwyUsnM3\n\
44 Jy3LOi48rQQSCKtCAUdV20FoIGWhwnb/gHU1BnmES6UdQujFBE6EANqPhp0coYoI\n\
45 hHJ2oIO8ujQItvvNaU88j/s/izQv5e7MXOgVSjKe/WX3s2JtB/tW7utpy12wh1J+\n\
46 JsFdbLV/t8CozUTpJgx5mVA3RKlxjTA+On+1IEUWioB+iVfT7Ov/0kcAzwADBQf9\n\
47 E4SKCWRand8K0XloMYgmipxMhJNnWDMLkokvbMNTUoNpSfRoQJ9EheXDxwMpTPwK\n\
48 ti/PYrrL2J11P2ed0x7zm8v3gLrY0cue1iSba+8glY+p31ZPOr5ogaJw7ZARgoS8\n\
49 BwjyRymXQp+8Dete0TELKOL2/itDOPGHW07SsVWOR6cmX4VlRRcWB5KejaNvdrE5\n\
50 4XFtOd04NMgWI63uqZc4zkRa+kwEZtmbz3tHSdRCCE+Y7YVP6IUf/w6YPQFQriWY\n\
51 FiA6fD10eB+BlIUqIw80VgjsBKmCwvKkn4jg8kibXgj4/TzQSx77uYokw1EqQ2wk\n\
52 OZoaEtcubsNMquuLCMWijYhGBBgRAgAGBQI36lRyAAoJECGRgM3bQqYOhyYAnj7h\n\
53 VDY/FJAGqmtZpwVp9IlitW5tAJ4xQApr/jNFZCTksnI+4O1765F7tA==\n\
57 const char * redhatPubKeyRSA =
"\
58 mQCNAzEpXjUAAAEEAKG4/V9oUSiDc9wIge6Bmg6erDGCLzmFyioAho8kDIJSrcmi\n\
59 F9qTdPq+fj726pgW1iSb0Y7syZn9Y2lgQm5HkPODfNi8eWyTFSxbr8ygosLRClTP\n\
60 xqHVhtInGrfZNLoSpv1LdWOme0yOpOQJnghdOMzKXpgf5g84vaUg6PHLopv5AAUR\n\
61 tCpSZWQgSGF0IFNvZnR3YXJlLCBJbmMuIDxyZWRoYXRAcmVkaGF0LmNvbT6JAJUD\n\
62 BRAyA5tUoyDApfg4JKEBAUzSA/9QdcVsu955vVyZDk8uvOXWV0X3voT9B3aYMFvj\n\
63 UNHUD6F1VFruwQHVKbGJEq1o5MOA6OXKR3vJZStXEMF47TWXJfQaflgl8ywZTH5W\n\
64 +eMlKau6Nr0labUV3lmsAE4Vsgu8NCkzIrp2wNVbeW2ZAXtrKswV+refLquUhp7l\n\
65 wMpH9IkAdQMFEDGttkRNdXhbO1TgGQEBAGoC/j6C22PqXIyqZc6fG6J6Jl/T5kFG\n\
66 xH1pKIzua5WCDDugAgnuOJgywa4pegT4UqwEZiMTAlwT6dmG1CXgKB+5V7lnCjDc\n\
67 JZLni0iztoe08ig6fJrjNGXljf7KYXzgwBftQokAlQMFEDMQzo2MRVM9rfPulQEB\n\
68 pLoD/1/MWv3u0Paiu14XRvDrBaJ7BmG2/48bA5vKOzpvvoNRO95YS7ZEtqErXA7Y\n\
69 DRO8+C8f6PAILMk7kCk4lNMscS/ZRzu5+J8cv4ejsFvxgJBBU3Zgp8AWdWOpvZ0I\n\
70 wW//HoDUGhOxlEtymljIMFBkj4SysHWhCBUfA9Xy86kouTJQiQCVAwUQMxDOQ50a\n\
71 feTWLUSJAQFnYQQAkt9nhMTeioREB1DvJt+vsFyOj//o3ThqK5ySEP3dgj62iaQp\n\
72 JrBmAe5XZPw25C/TXAf+x27H8h2QbKgq49VtsElFexc6wO+uq85fAPDdyE+2XyNE\n\
73 njGZkY/TP2F/jTB0sAwJO+xFCHmSYkcBjzxK/2LMD+O7rwp2UCUhhl9QhhqJAJUD\n\
74 BRAx5na6pSDo8cuim/kBARmjA/4lDVnV2h9KiNabp9oE38wmGgu5m5XgUHW8L6du\n\
75 iQDnwO5IgXN2vDpKGxbgtwv6iYYmGd8IRQ66uJvOsxSv3OR7J7LkCHuI2b/s0AZn\n\
76 c79DZaJ2ChUCZlbNQBMeEdrFWif9NopY+d5+2tby1onu9XOFMMvomxL3NhctElYR\n\
77 HC8Xw4kAlQMFEDHmdTtURTdEKY1MpQEBEtEEAMZbp1ZFrjiHkj2aLFC1S8dGRbSH\n\
78 GUdnLP9qLPFgmWekp9E0o8ZztALGVdqPfPF3N/JJ+AL4IMrfojd7+eZKw36Mdvtg\n\
79 dPI+Oz4sxHDbDynZ2qspD9Om5yYuxuz/Xq+9nO2IlsAnEYw3ag3cxat0kvxpOPRe\n\
80 Yy+vFpgfDNizr3MgiQBVAwUQMXNMXCjtrosVMemRAQEDnwH7BsJrnnh91nI54LAK\n\
81 Gcq3pr8ld0PAtWJmNRGQvUlpEMXUSnu59j2P1ogPNjL3PqKdVxk5Jqgcr8TPQMf3\n\
82 V4fqXokAlQMFEDFy+8YiEmsRQ3LyzQEB+TwD/03QDslXLg5F3zj4zf0yI6ikT0be\n\
83 5OhZv2pnkb80qgdHzFRxBOYmSoueRKdQJASd8F9ue4b3bmf/Y7ikiY0DblvxcXB2\n\
84 sz1Pu8i2Zn9u8SKuxNIoVvM8/STRVkgPfvL5QjAWMHT9Wvg81XcI2yXJzrt/2f2g\n\
85 mNpWIvVOOT85rVPIiQCVAwUQMVPRlBlzviMjNHElAQG1nwP/fpVX6nKRWJCSFeB7\n\
86 leZ4lb+y1uMsMVv0n7agjJVw13SXaA267y7VWCBlnhsCemxEugqEIkI4lu/1mgtw\n\
87 WPWSE0BOIVjj0AA8zp2T0H3ZCCMbiFAFJ1P2Gq2rKr8QrOb/08oH1lEzyz0j/jKh\n\
88 qiXAxdlB1wojQB6yLbHvTIe3rZGJAHUDBRAxKetfzauiKSJ6LJEBAed/AvsEiGgj\n\
89 TQzhsZcUuRNrQpV0cDGH9Mpril7P7K7yFIzju8biB+Cu6nEknSOHlMLl8usObVlk\n\
90 d8Wf14soHC7SjItiGSKtI8JhauzBJPl6fDDeyHGsJKo9f9adKeBMCipCFOuJAJUD\n\
91 BRAxKeqWRHFTaIK/x+0BAY6eA/4m5X4gs1UwOUIRnljo9a0cVs6ITL554J9vSCYH\n\
92 Zzd87kFwdf5W1Vd82HIkRzcr6cp33E3IDkRzaQCMVw2me7HePP7+4Ry2q3EeZMbm\n\
93 NE++VzkxjikzpRb2+F5nGB2UdsElkgbXinswebiuOwOrocLbz6JFdDsJPcT5gVfi\n\
119 { -1,
"Unknown signature type" },
132 { -1,
"Unknown public key algorithm" },
148 { -1,
"Unknown symmetric key algorithm" },
156 { -1,
"Unknown compression algorithm" },
169 { -1,
"Unknown hash algorithm" },
175 { 0x80,
"No-modify" },
176 { -1,
"Unknown key server preference" },
216 { -1,
"Unknown signature subkey type" },
237 {
PGPTAG_MDC,
"Manipulaion detection code packet" },
242 { -1,
"Unknown packet tag" },
253 { -1,
"Unknown armor block" }
262 { -1,
"Unknown armor key" }
270 fprintf(stderr,
"\n");
279 fprintf(stderr,
"%s", pre);
280 fprintf(stderr,
" %d", i);
289 fprintf(stderr,
"%s", pre);
290 fprintf(stderr,
" %s", s);
299 fprintf(stderr,
"%s", pre);
300 fprintf(stderr,
" %s",
pgpHexStr(p, plen));
309 fprintf(stderr,
"%s", pre);
310 fprintf(stderr,
"%s(%u)",
pgpValStr(vs, val), (
unsigned)val);
319 static char prbuf[2048];
330 mpnumber * mpn,
const byte * p,
const byte * pend)
340 if ((p + ((mbits+7) >> 3)) > pend)
343 nbits = (lbits > mbits ? lbits : mbits);
344 nbytes = ((nbits + 7) >> 3);
346 ix = 2 * ((nbits - mbits) >> 3);
349 fprintf(stderr,
"*** mbits %u nbits %u nbytes %u t %p[%d] ix %u\n", mbits, nbits, nbytes, t, (2*nbytes+1), ix);
350 if (ix > 0) memset(t, (
int)
'0', ix);
353 fprintf(stderr,
"*** %s %s\n", pre, t);
354 (void) mpnsethex(mpn, t);
357 fprintf(stderr,
"\t %s ", pre), mpfprintln(stderr, mpn->size, mpn->data);
376 fprintf(stderr,
" *CRITICAL*");
379 for (i = 1; i < plen; i++)
383 for (i = 1; i < plen; i++)
387 for (i = 1; i < plen; i++)
391 for (i = 1; i < plen; i++)
392 pgpPrtVal(
" ", pgpKeyServerPrefsTbl, p[i]);
400 memcpy(_digp->
time, p+1,
sizeof(_digp->
time));
406 if ((plen - 1) == 4) {
407 time_t t =
pgpGrab(p+1, plen-1);
409 fprintf(stderr,
" %-24.24s(0x%08x)", ctime(&t), (
unsigned)t);
484 for (i = 0; p < pend; i++, p +=
pgpMpiLen(p)) {
494 fprintf(stderr,
"\t m**d = "), mpfprintln(stderr, _dig->
c.size, _dig->
c.data);
524 fprintf(stderr,
"%7d", i);
537 byte version = pp->
h[0];
557 fprintf(stderr,
" %-24.24s(0x%08x)", ctime(&t), (
unsigned)t);
576 p = ((
byte *)v) +
sizeof(*v);
592 if ((p + plen) > (pp->
h + pp->
hlen))
596 fprintf(stderr,
" hash[%u] -- %s\n", plen,
pgpHexStr(p, plen));
598 _digp->
hashlen =
sizeof(*v) + plen;
607 if ((p + plen) > (pp->
h + pp->
hlen))
611 fprintf(stderr,
" unhash[%u] -- %s\n", plen,
pgpHexStr(p, plen));
628 if (p > (pp->
h + pp->
hlen))
650 static const char * pgpSecretRSA[] = {
670 static const char * pgpSecretDSA[] = {
686 static const char * pgpSecretELGAMAL[] = {
708 fprintf(stderr,
"\t n = "), mpfprintln(stderr, _dig->
rsa_pk.n.size, _dig->
rsa_pk.n.modl);
713 fprintf(stderr,
"\t e = "), mpfprintln(stderr, _dig->
rsa_pk.e.size, _dig->
rsa_pk.e.data);
727 fprintf(stderr,
"\t p = "), mpfprintln(stderr, _dig->
p.size, _dig->
p.modl);
732 fprintf(stderr,
"\t q = "), mpfprintln(stderr, _dig->
q.size, _dig->
q.modl);
737 fprintf(stderr,
"\t g = "), mpfprintln(stderr, _dig->
g.size, _dig->
g.data);
742 fprintf(stderr,
"\t y = "), mpfprintln(stderr, _dig->
y.size, _dig->
y.data);
754 fprintf(stderr,
"%7d", i);
788 pgpPrtVal(
" iterated/salted ", pgpHashTbl, p[2]);
790 i = (16 + (p[11] & 0xf)) << ((p[11] >> 4) + 6);
811 if (pgpSecretRSA[i] == NULL)
break;
814 if (pgpSecretDSA[i] == NULL)
break;
817 if (pgpSecretELGAMAL[i] == NULL)
break;
821 fprintf(stderr,
"%7d", i);
829 p += (pp->
hlen - (p - pp->
h) - 2);
841 byte version = pp->
h[0];
854 fprintf(stderr,
" %-24.24s(0x%08x)", ctime(&t), (
unsigned)t);
857 fprintf(stderr,
" valid %u days", plen);
860 if (_digp && _digp->
tag == pp->
tag) {
866 p = ((
byte *)v) +
sizeof(*v);
876 fprintf(stderr,
" %-24.24s(0x%08x)", ctime(&t), (
unsigned)t);
879 if (_digp && _digp->
tag == pp->
tag) {
885 p = ((
byte *)v) +
sizeof(*v);
905 fprintf(stderr,
" \"%.*s\"", (
int)pp->
hlen, (
const char *)pp->
h);
919 const byte * h = pp->
h;
924 fprintf(stderr,
" ");
927 if (*h >=
' ' && *h <=
'z') {
929 while (j < i && h[j] !=
'\0')
931 while (j < i && h[j] ==
'\0')
934 fprintf(stderr,
"%.*s", (
int)strlen((
const char *)h), (
const char *)h);
948 unsigned int val = *pkt;
951 memset(pp, 0,
sizeof(*pp));
957 pp->
tag = (val & 0x3f);
960 pp->
tag = (val >> 2) & 0xf;
961 plen = (1 << (val & 0x3));
966 if (pleft > 0 && pp->
pktlen > pleft)
970 pp->
h = pkt + 1 + plen;
992 se = (
byte *)(v + 1);
997 memmove(keyid, (se-8), 8);
1006 se = (
byte *)(v + 1);
1010 for (i = 0; i < 2; i++)
1014 for (i = 0; i < 4; i++)
1024 memmove(keyid, (d + (dlen-8)), 8);
1038 if (b64decode(b64pkt, (
void **)&pkt, &pktlen))
1105 return (rc ? -1 : pp->
pktlen);
1126 for (i = 0; i < 4; i++) {
1141 (void) rsapkFree(&dig->
rsa_pk);
1144 mpnfree(&dig->
rsahm);
1206 byte *** pppkts,
int * pnpkts)
1216 for (p = pkts, pleft = pktlen; p < (pkts + pktlen); p += len, pleft -= len) {
1225 ppkts =
xcalloc(npkts,
sizeof(*ppkts));
1228 for (p = pkts, pleft = pktlen; p < (pkts + pktlen); p += len, pleft -= len) {
1233 ppkts[npkts++] = (
byte *) p;
1240 ppkts =
_free(ppkts);
1254 unsigned int val = *pkts;
1257 byte ** ppkts = NULL;
1263 if (dig != NULL && (val & 0x80)) {
1264 pgpTag tag = (val & 0x40) ? (val & 0x3f) : ((val >> 2) & 0xf);
1270 if (
pgpGrabPkts(pkts, pktlen, &ppkts, &npkts) || ppkts == NULL)
1274 for (i = 0, pleft = pktlen; i < npkts; i++, pleft -= len) {
1285 ppkts =
_free(ppkts);
1294 const byte * b = NULL;
1296 const char * enc = NULL;
1297 const char * crcenc = NULL;
1302 uint32_t crcpkt, crc;
1303 const char * armortype = NULL;
1310 if (rc || b == NULL || blen <= 0) {
1321 #define TOKEQ(_s, _tok) (!strncmp((_s), (_tok), sizeof(_tok)-1))
1323 for (t = (
char *)b; t && *t; t = te) {
1324 if ((te = strchr(t,
'\n')) == NULL)
1332 if (!
TOKEQ(t,
"-----BEGIN PGP "))
1334 t +=
sizeof(
"-----BEGIN PGP ")-1;
1345 t = strchr(t,
'\n');
1350 t -= (
sizeof(
"-----")-1);
1351 if (!
TOKEQ(t,
"-----"))
1361 if (!(*t ==
'\n' || *t ==
'\r')) {
1378 if (!
TOKEQ(t,
"-----END PGP ")) {
1383 t +=
sizeof(
"-----END PGP ")-1;
1384 if (t >= te)
continue;
1386 if (armortype == NULL)
1388 rc = strncmp(t, armortype, strlen(armortype));
1392 t += strlen(armortype);
1393 if (t >= te)
continue;
1395 if (!
TOKEQ(t,
"-----")) {
1399 t += (
sizeof(
"-----")-1);
1400 if (t >= te)
continue;
1402 if (!(*t ==
'\n' || *t ==
'\r'))
continue;
1406 if (b64decode(crcenc, (
void **)&crcdec, &crclen) != 0) {
1410 crcpkt =
pgpGrab(crcdec, crclen);
1411 crcdec =
_free(crcdec);
1414 if (b64decode(enc, (
void **)&dec, &declen) != 0) {
1418 crc =
pgpCRC(dec, declen);
1419 if (crcpkt != crc) {
1452 nt = ((ns + 2) / 3) * 4;
1455 if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
1456 lc = (nt + b64encode_chars_per_line - 1) / b64encode_chars_per_line;
1457 if (((nt + b64encode_chars_per_line - 1) % b64encode_chars_per_line) != 0)
1459 nt += lc * strlen(b64encode_eolstr);
1468 t =
stpcpy(t,
"-----BEGIN PGP ");
1473 t =
stpcpy(t,
" (beecrypt-4.1.2)\n\n");
1475 if ((enc = b64encode(s, ns)) != NULL) {
1478 if ((enc = b64crc(s, ns)) != NULL) {
1485 t =
stpcpy(t,
"-----END PGP ");
1487 t =
stpcpy(t,
"-----\n");