9 #define _RPMPGP_INTERNAL
12 #if defined(__LCLINT__) && !defined(__i386__)
16 #define _RPMSSL_INTERNAL
41 unsigned char nibble(
char c)
44 if (c >=
'0' && c <=
'9')
45 return (
unsigned char) (c -
'0');
46 if (c >=
'A' && c <=
'F')
47 return (
unsigned char)((int)(c -
'A') + 10);
48 if (c >=
'a' && c <=
'f')
49 return (
unsigned char)((int)(c -
'a') + 10);
50 return (
unsigned char)
'\0';
55 void hexdump(
const char * msg,
unsigned char * b,
size_t blen)
58 static const char hex[] =
"0123456789abcdef";
60 fprintf(stderr,
"*** %s:", msg);
63 fprintf(stderr,
"%c%c",
64 hex[ (
unsigned)((*b >> 4) & 0x0f) ],
65 hex[ (
unsigned)((*b ) & 0x0f) ]);
69 fprintf(stderr,
"\n");
79 unsigned int nbits = BN_num_bits(ssl->c);
80 unsigned int nb = (nbits + 7) >> 3;
93 hexstr = tt =
xmalloc(2 * nb + 1);
94 memset(tt, (
int)
'f', (2 * nb));
95 tt[0] =
'0'; tt[1] =
'0';
96 tt[2] =
'0'; tt[3] =
'1';
97 tt += (2 * nb) - strlen(prefix) - strlen(dig->md5) - 2;
98 *tt++ =
'0'; *tt++ =
'0';
100 tt =
stpcpy(tt, dig->md5);
104 xx = BN_hex2bn(&ssl->rsahm, hexstr);
108 if (
_pgp_debug < 0) fprintf(stderr,
"*** rsahm: %s\n", hexstr);
109 hexstr =
_free(hexstr);
118 return memcmp(signhash16, sigp->signhash16,
sizeof(sigp->signhash16));
121 static unsigned char * rpmsslBN2bin(
const char * msg,
const BIGNUM * s,
size_t maxn)
123 unsigned char * t =
xcalloc(1, maxn);
125 size_t nt = BN_bn2bin(s, t);
129 size_t pad = (maxn - nt);
131 if (
_pgp_debug < 0) fprintf(stderr,
"\tmemmove(%p, %p, %u)\n", t+pad, t, (
unsigned)nt);
133 memmove(t+pad, t, nt);
135 if (
_pgp_debug < 0) fprintf(stderr,
"\tmemset(%p, 0, %u)\n", t, (
unsigned)pad);
146 int rpmsslVerifyRSA(
pgpDig dig)
151 size_t maxn = BN_num_bytes(ssl->rsa->n);
152 unsigned char * hm = rpmsslBN2bin(
"hm", ssl->rsahm, maxn);
153 unsigned char * c = rpmsslBN2bin(
" c", ssl->c, maxn);
154 size_t nb = RSA_public_decrypt((
int)maxn, c, c, ssl->rsa, RSA_PKCS1_PADDING);
179 for (i = 2; i < maxn; i++) {
184 if (
_pgp_debug < 0) hexdump(
"HM", hm + i, (maxn - i));
190 if (
_pgp_debug < 0) hexdump(
"HM", hm + (maxn - nb), nb);
194 rc = ((maxn - i) == nb && (xx = memcmp(hm+i, c, nb)) == 0);
213 return memcmp(dig->sha1, sigp->signhash16,
sizeof(sigp->signhash16));
217 int rpmsslVerifyDSA(
pgpDig dig)
225 rc = (DSA_do_verify(dig->sha1, (
int)dig->sha1len, ssl->dsasig, ssl->dsa) == 1);
248 int rpmsslVerifyECDSA(
pgpDig dig)
257 int rpmsslMpiItem(
const char * pre,
pgpDig dig,
int itemno,
272 ssl->c = BN_bin2bn(p+2, nb, ssl->c);
275 if (ssl->dsasig == NULL) ssl->dsasig = DSA_SIG_new();
276 ssl->dsasig->r = BN_bin2bn(p+2, nb, ssl->dsasig->r);
279 if (ssl->dsasig == NULL) ssl->dsasig = DSA_SIG_new();
280 ssl->dsasig->s = BN_bin2bn(p+2, nb, ssl->dsasig->s);
283 if (ssl->rsa == NULL) ssl->rsa = RSA_new();
284 ssl->rsa->n = BN_bin2bn(p+2, nb, ssl->rsa->n);
287 if (ssl->rsa == NULL) ssl->rsa = RSA_new();
288 ssl->rsa->e = BN_bin2bn(p+2, nb, ssl->rsa->e);
291 if (ssl->dsa == NULL) ssl->dsa = DSA_new();
292 ssl->dsa->p = BN_bin2bn(p+2, nb, ssl->dsa->p);
295 if (ssl->dsa == NULL) ssl->dsa = DSA_new();
296 ssl->dsa->q = BN_bin2bn(p+2, nb, ssl->dsa->q);
299 if (ssl->dsa == NULL) ssl->dsa = DSA_new();
300 ssl->dsa->g = BN_bin2bn(p+2, nb, ssl->dsa->g);
303 if (ssl->dsa == NULL) ssl->dsa = DSA_new();
304 ssl->dsa->pub_key = BN_bin2bn(p+2, nb, ssl->dsa->pub_key);
313 void rpmsslClean(
void * impl)
324 DSA_SIG_free(ssl->dsasig);
341 void * rpmsslFree(
void * impl)
351 void * rpmsslInit(
void)
356 ERR_load_crypto_strings();
362 rpmsslSetRSA, rpmsslVerifyRSA,
363 rpmsslSetDSA, rpmsslVerifyDSA,
364 rpmsslSetECDSA, rpmsslVerifyECDSA,
365 rpmsslMpiItem, rpmsslClean,
366 rpmsslFree, rpmsslInit