rpmbc.c | rpmbc.c | |||
---|---|---|---|---|
skipping to change at line 112 | skipping to change at line 112 | |||
_spewMPN("hm", bc->hm); | _spewMPN("hm", bc->hm); | |||
} | } | |||
#endif /* UNUSED */ | #endif /* UNUSED */ | |||
static | static | |||
int rpmbcSetRSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) | int rpmbcSetRSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) | |||
/*@modifies dig @*/ | /*@modifies dig @*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
size_t nbits = 0; | size_t nbits = 0; | |||
size_t nb = 0; | size_t nb = 0; | |||
const char * prefix = rpmDigestASN1(ctx); | const char * prefix = rpmDigestASN1(ctx); | |||
const char * hexstr; | const char * hexstr; | |||
char * tt; | char * tt; | |||
int rc = 1; /* assume failure */ | int rc = 1; /* assume failure */ | |||
int xx; | int xx; | |||
pgpDigParams pubp = pgpGetPubkey(dig); | pgpDigParams pubp = pgpGetPubkey(dig); | |||
dig->pubkey_algoN = _pgpPubkeyAlgo2Name(pubp->pubkey_algo); | dig->pubkey_algoN = _pgpPubkeyAlgo2Name(pubp->pubkey_algo); | |||
dig->hash_algoN = _pgpHashAlgo2Name(sigp->hash_algo); | dig->hash_algoN = _pgpHashAlgo2Name(sigp->hash_algo); | |||
skipping to change at line 147 | skipping to change at line 147 | |||
nb = (nbits + 7) >> 3; /* XXX overkill */ | nb = (nbits + 7) >> 3; /* XXX overkill */ | |||
if (nb < 64/8 || nb > 65536/8) /* XXX generous "sanity" check */ | if (nb < 64/8 || nb > 65536/8) /* XXX generous "sanity" check */ | |||
goto exit; | goto exit; | |||
/* XXX FIXME: do PKCS1 padding in binary not hex */ | /* XXX FIXME: do PKCS1 padding in binary not hex */ | |||
/* XXX FIXME: should this lazy free be done elsewhere? */ | /* XXX FIXME: should this lazy free be done elsewhere? */ | |||
bc->digest = _free(bc->digest); | bc->digest = _free(bc->digest); | |||
bc->digestlen = 0; | bc->digestlen = 0; | |||
xx = rpmDigestFinal(ctx, (void **)&bc->digest, &bc->digestlen, 1); | xx = rpmDigestFinal(ctx, (void **)&bc->digest, &bc->digestlen, 1); | |||
ctx = NULL; /* XXX avoid double free */ | ctx = NULL; /* XXX avoid double free */ | |||
hexstr = tt = xmalloc(2 * nb + 1); | hexstr = tt = (char *) xmalloc(2 * nb + 1); | |||
memset(tt, (int) 'f', (2 * nb)); | memset(tt, (int) 'f', (2 * nb)); | |||
tt[0] = '0'; tt[1] = '0'; | tt[0] = '0'; tt[1] = '0'; | |||
tt[2] = '0'; tt[3] = '1'; | tt[2] = '0'; tt[3] = '1'; | |||
tt += (2 * nb) - strlen(prefix) - strlen(bc->digest) - 2; | tt += (2 * nb) - strlen(prefix) - strlen((char *)bc->digest) - 2; | |||
*tt++ = '0'; *tt++ = '0'; | *tt++ = '0'; *tt++ = '0'; | |||
tt = stpcpy(tt, prefix); | tt = stpcpy(tt, prefix); | |||
tt = stpcpy(tt, bc->digest); | tt = stpcpy(tt, (char *)bc->digest); | |||
/*@-moduncon -noeffectuncon @*/ | /*@-moduncon -noeffectuncon @*/ | |||
mpnfree(&bc->hm); | mpnfree(&bc->hm); | |||
mpnzero(&bc->hm); (void) mpnsethex(&bc->hm, hexstr); | mpnzero(&bc->hm); (void) mpnsethex(&bc->hm, hexstr); | |||
/*@=moduncon =noeffectuncon @*/ | /*@=moduncon =noeffectuncon @*/ | |||
hexstr = _free(hexstr); | hexstr = _free(hexstr); | |||
/* Compare leading 16 bits of digest for quick check. */ | /* Compare leading 16 bits of digest for quick check. */ | |||
{ const char *str = bc->digest; | { const char *str = (const char *) bc->digest; | |||
rpmuint8_t s[2]; | rpmuint8_t s[2]; | |||
const rpmuint8_t *t = sigp->signhash16; | const rpmuint8_t *t = sigp->signhash16; | |||
s[0] = (rpmuint8_t) (nibble(str[0]) << 4) | nibble(str[1]); | s[0] = (rpmuint8_t) (nibble(str[0]) << 4) | nibble(str[1]); | |||
s[1] = (rpmuint8_t) (nibble(str[2]) << 4) | nibble(str[3]); | s[1] = (rpmuint8_t) (nibble(str[2]) << 4) | nibble(str[3]); | |||
rc = memcmp(s, t, sizeof(sigp->signhash16)); | rc = memcmp(s, t, sizeof(sigp->signhash16)); | |||
} | } | |||
exit: | exit: | |||
if (ctx) { /* XXX Free the context on error returns. */ | if (ctx) { /* XXX Free the context on error returns. */ | |||
xx = rpmDigestFinal(ctx, NULL, NULL, 0); | xx = rpmDigestFinal(ctx, NULL, NULL, 0); | |||
ctx = NULL; | ctx = NULL; | |||
} | } | |||
SPEW(0, !rc, dig); | SPEW(0, !rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcVerifyRSA(pgpDig dig) | int rpmbcVerifyRSA(pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc; | int rc; | |||
rc = rsavrfy(&bc->rsa_keypair.n, &bc->rsa_keypair.e, &bc->c, &bc->hm); | rc = rsavrfy(&bc->rsa_keypair.n, &bc->rsa_keypair.e, &bc->c, &bc->hm); | |||
SPEW(0, rc, dig); | SPEW(0, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcSignRSA(/*@unused@*/pgpDig dig) | int rpmbcSignRSA(/*@unused@*/pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
mpnzero(&bc->c); | mpnzero(&bc->c); | |||
#ifdef SLOWER | #ifdef SLOWER | |||
xx = rsapri(&bc->rsa_keypair.n, &bc->rsa_keypair.d, &bc->hm, &bc->c); | xx = rsapri(&bc->rsa_keypair.n, &bc->rsa_keypair.d, &bc->hm, &bc->c); | |||
#else | #else | |||
/* XXX RSA w CRT is ~3x-4x faster for signing. */ | /* XXX RSA w CRT is ~3x-4x faster for signing. */ | |||
xx = rsapricrt(&bc->rsa_keypair.n, &bc->rsa_keypair.p, &bc->rsa_keypair .q, | xx = rsapricrt(&bc->rsa_keypair.n, &bc->rsa_keypair.p, &bc->rsa_keypair .q, | |||
skipping to change at line 224 | skipping to change at line 224 | |||
rc = (failures == 0); | rc = (failures == 0); | |||
SPEW(!rc, rc, dig); | SPEW(!rc, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcGenerateRSA(/*@unused@*/pgpDig dig) | int rpmbcGenerateRSA(/*@unused@*/pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
if (bc->nbits == 0) bc->nbits = 1024; /* XXX FIXME */ | if (bc->nbits == 0) bc->nbits = 1024; /* XXX FIXME */ | |||
xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()); | xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()); | |||
rsakpFree(&bc->rsa_keypair); | rsakpFree(&bc->rsa_keypair); | |||
xx = rsakpMake(&bc->rsa_keypair, &bc->rngc, bc->nbits); | xx = rsakpMake(&bc->rsa_keypair, &bc->rngc, bc->nbits); | |||
skipping to change at line 251 | skipping to change at line 251 | |||
rc = (failures == 0); | rc = (failures == 0); | |||
SPEW(!rc, rc, dig); | SPEW(!rc, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcSetDSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) | int rpmbcSetDSA(/*@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) | |||
/*@modifies dig @*/ | /*@modifies dig @*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc; | int rc; | |||
pgpDigParams pubp = pgpGetPubkey(dig); | pgpDigParams pubp = pgpGetPubkey(dig); | |||
dig->pubkey_algoN = _pgpPubkeyAlgo2Name(pubp->pubkey_algo); | dig->pubkey_algoN = _pgpPubkeyAlgo2Name(pubp->pubkey_algo); | |||
dig->hash_algoN = _pgpHashAlgo2Name(sigp->hash_algo); | dig->hash_algoN = _pgpHashAlgo2Name(sigp->hash_algo); | |||
assert(sigp->hash_algo == rpmDigestAlgo(ctx)); | assert(sigp->hash_algo == rpmDigestAlgo(ctx)); | |||
bc->digest = _free(bc->digest); | bc->digest = _free(bc->digest); | |||
bc->digestlen = 0; | bc->digestlen = 0; | |||
rc = rpmDigestFinal(ctx, (void **)&bc->digest, &bc->digestlen, 0); | rc = rpmDigestFinal(ctx, (void **)&bc->digest, &bc->digestlen, 0); | |||
/* XXX Truncate to 160bits. */ | /* XXX Truncate to 160bits. */ | |||
rc = mpnsetbin(&bc->hm, bc->digest, | rc = mpnsetbin(&bc->hm, (byte *) bc->digest, | |||
(bc->digestlen > 160/8 ? 160/8 : bc->digestlen)); | (bc->digestlen > 160/8 ? 160/8 : bc->digestlen)); | |||
rc = memcmp(bc->digest, sigp->signhash16, sizeof(sigp->signhash16)); | rc = memcmp(bc->digest, sigp->signhash16, sizeof(sigp->signhash16)); | |||
SPEW(0, !rc, dig); | SPEW(0, !rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcVerifyDSA(pgpDig dig) | int rpmbcVerifyDSA(pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
xx = dsavrfy(&bc->dsa_keypair.param.p, &bc->dsa_keypair.param.q, | xx = dsavrfy(&bc->dsa_keypair.param.p, &bc->dsa_keypair.param.q, | |||
&bc->dsa_keypair.param.g, &bc->hm, &bc->dsa_keypair.y, | &bc->dsa_keypair.param.g, &bc->hm, &bc->dsa_keypair.y, | |||
&bc->r, &bc->s); | &bc->r, &bc->s); | |||
if (!xx) failures++; | if (!xx) failures++; | |||
rc = (failures == 0); | rc = (failures == 0); | |||
SPEW(0, rc, dig); | SPEW(0, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcSignDSA(pgpDig dig) | int rpmbcSignDSA(pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
mpnzero(&bc->r); | mpnzero(&bc->r); | |||
mpnzero(&bc->s); | mpnzero(&bc->s); | |||
xx = dsasign(&bc->dsa_keypair.param.p, &bc->dsa_keypair.param.q, | xx = dsasign(&bc->dsa_keypair.param.p, &bc->dsa_keypair.param.q, | |||
&bc->dsa_keypair.param.g, &bc->rngc, &bc->hm, | &bc->dsa_keypair.param.g, &bc->rngc, &bc->hm, | |||
&bc->dsa_keypair.x, &bc->r, &bc->s); | &bc->dsa_keypair.x, &bc->r, &bc->s); | |||
if (xx) failures++; | if (xx) failures++; | |||
skipping to change at line 317 | skipping to change at line 317 | |||
rc = (failures == 0); | rc = (failures == 0); | |||
SPEW(!rc, rc, dig); | SPEW(!rc, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcGenerateDSA(pgpDig dig) | int rpmbcGenerateDSA(pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
if (bc->nbits == 0) bc->nbits = 1024; /* XXX FIXME */ | if (bc->nbits == 0) bc->nbits = 1024; /* XXX FIXME */ | |||
xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()); | xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()); | |||
xx = dlkp_pInit(&bc->dsa_keypair); | xx = dlkp_pInit(&bc->dsa_keypair); | |||
if (xx) failures++; | if (xx) failures++; | |||
skipping to change at line 365 | skipping to change at line 365 | |||
SPEW(rc, !rc, dig); | SPEW(rc, !rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
#ifdef NOTYET | #ifdef NOTYET | |||
static | static | |||
int rpmbcVerifyELG(pgpDig dig) | int rpmbcVerifyELG(pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
xx = elgv1vrfy(&bc->elg_keypair.param.p, &bc->elg_keypair.param.n, | xx = elgv1vrfy(&bc->elg_keypair.param.p, &bc->elg_keypair.param.n, | |||
&bc->elg_keypair.param.g, &bc->hm, &bc->elg_keypair.y, | &bc->elg_keypair.param.g, &bc->hm, &bc->elg_keypair.y, | |||
&bc->r, &bc->s); | &bc->r, &bc->s); | |||
if (xx) failures++; | if (xx) failures++; | |||
rc = (failures == 0); | rc = (failures == 0); | |||
SPEW(!rc, rc, dig); | SPEW(!rc, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcSignELG(/*@unused@*/pgpDig dig) | int rpmbcSignELG(/*@unused@*/pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
mpnzero(&bc->r); | mpnzero(&bc->r); | |||
mpnzero(&bc->s); | mpnzero(&bc->s); | |||
xx = elgv1sign(&bc->elg_keypair.param.p, &bc->elg_keypair.param.n, | xx = elgv1sign(&bc->elg_keypair.param.p, &bc->elg_keypair.param.n, | |||
&bc->elg_keypair.param.g, &bc->rngc, &bc->hm, | &bc->elg_keypair.param.g, &bc->rngc, &bc->hm, | |||
&bc->elg_keypair.x, &bc->r, &bc->s); | &bc->elg_keypair.x, &bc->r, &bc->s); | |||
if (xx) failures++; | if (xx) failures++; | |||
skipping to change at line 410 | skipping to change at line 410 | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcGenerateELG(/*@unused@*/pgpDig dig) | int rpmbcGenerateELG(/*@unused@*/pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
static const char P_2048[] = "fd12e8b7e096a28a00fb548035953cf0eba64ceb5dff0 f5672d376d59c196da729f6b5586f18e6f3f1a86c73c5b15662f59439613b309e52aa257488 619e5f76a7c4c3f7a426bdeac66bf88343482941413cef06256b39c62744dcb97e7b78e36ec 6b885b143f6f3ad0a1cd8a5713e338916613892a264d4a47e72b583fbdaf5bce2bbb0097f7e 65cbc86d684882e5bb8196d522dcacd6ad00dfbcd8d21613bdb59c485a65a58325d792272c0 9ad1173e12c98d865adb4c4d676ada79830c58c37c42dff8536e28f148a23f296513816d3df ed0397a3d4d6e1fa24f07e1b01643a68b4274646a3b876e810206eddacea2b9ef7636a1da58 80ef654288b857ea3"; | static const char P_2048[] = "fd12e8b7e096a28a00fb548035953cf0eba64ceb5dff0 f5672d376d59c196da729f6b5586f18e6f3f1a86c73c5b15662f59439613b309e52aa257488 619e5f76a7c4c3f7a426bdeac66bf88343482941413cef06256b39c62744dcb97e7b78e36ec 6b885b143f6f3ad0a1cd8a5713e338916613892a264d4a47e72b583fbdaf5bce2bbb0097f7e 65cbc86d684882e5bb8196d522dcacd6ad00dfbcd8d21613bdb59c485a65a58325d792272c0 9ad1173e12c98d865adb4c4d676ada79830c58c37c42dff8536e28f148a23f296513816d3df ed0397a3d4d6e1fa24f07e1b01643a68b4274646a3b876e810206eddacea2b9ef7636a1da58 80ef654288b857ea3"; | |||
static const char P_1024[] = "e64a3deeddb723e2e4db54c2b09567d196367a86b3b30 2be07e43ffd7f2e016f866de5135e375bdd2fba6ea9b4299010fafa36dc6b02ba3853cceea0 7ee94bfe30e0cc82a69c73163be26e0c4012dfa0b2839c97d6cd71eee59a303d6177c6a6740 ca63bd04c1ba084d6c369dc2fbfaeebe951d58a4824de52b580442d8cae77"; | static const char P_1024[] = "e64a3deeddb723e2e4db54c2b09567d196367a86b3b30 2be07e43ffd7f2e016f866de5135e375bdd2fba6ea9b4299010fafa36dc6b02ba3853cceea0 7ee94bfe30e0cc82a69c73163be26e0c4012dfa0b2839c97d6cd71eee59a303d6177c6a6740 ca63bd04c1ba084d6c369dc2fbfaeebe951d58a4824de52b580442d8cae77"; | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()); | xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()); | |||
xx = 0; | xx = 0; | |||
xx = dlkp_pInit(&bc->elg_keypair); | xx = dlkp_pInit(&bc->elg_keypair); | |||
if (xx) failures++; | if (xx) failures++; | |||
skipping to change at line 529 | skipping to change at line 529 | |||
assert(bc->hm); /* XXX FIXME: make sure bc->hm is set */ | assert(bc->hm); /* XXX FIXME: make sure bc->hm is set */ | |||
SPEW(!rc, rc, dig); | SPEW(!rc, rc, dig); | |||
return rc; | return rc; | |||
} | } | |||
static | static | |||
int rpmbcGenerateECDSA(/*@unused@*/pgpDig dig) | int rpmbcGenerateECDSA(/*@unused@*/pgpDig dig) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int rc = 0; /* Assume failure. */ | int rc = 0; /* Assume failure. */ | |||
int failures = 0; | int failures = 0; | |||
int xx; | int xx; | |||
if (bc->rngc == NULL) | if (bc->rngc == NULL) | |||
xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()) ; | xx = randomGeneratorContextInit(&bc->rngc, randomGeneratorDefault()) ; | |||
rc = (failures == 0); | rc = (failures == 0); | |||
SPEW(!rc, rc, dig); | SPEW(!rc, rc, dig); | |||
skipping to change at line 685 | skipping to change at line 685 | |||
return rc; | return rc; | |||
} | } | |||
/** | /** | |||
*/ | */ | |||
static /*@only@*/ | static /*@only@*/ | |||
char * pgpMpiHex(const rpmuint8_t *p) | char * pgpMpiHex(const rpmuint8_t *p) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
size_t nb = pgpMpiLen(p); | size_t nb = pgpMpiLen(p); | |||
char * t = xmalloc(2*nb + 1); | char * t = (char *) xmalloc(2*nb + 1); | |||
(void) pgpHexCvt(t, p+2, nb-2); | (void) pgpHexCvt(t, p+2, nb-2); | |||
return t; | return t; | |||
} | } | |||
/** | /** | |||
* @return 0 on success | * @return 0 on success | |||
*/ | */ | |||
static | static | |||
int pgpMpiSet(const char * pre, unsigned int lbits, | int pgpMpiSet(const char * pre, unsigned int lbits, | |||
/*@out@*/ void * dest, const rpmuint8_t * p, | /*@out@*/ void * dest, const rpmuint8_t * p, | |||
/*@null@*/ const rpmuint8_t * pend) | /*@null@*/ const rpmuint8_t * pend) | |||
/*@globals fileSystem @*/ | /*@globals fileSystem @*/ | |||
/*@modifies fileSystem @*/ | /*@modifies fileSystem @*/ | |||
{ | { | |||
mpnumber * mpn = dest; | mpnumber * mpn = (mpnumber *) dest; | |||
unsigned int mbits = pgpMpiBits(p); | unsigned int mbits = pgpMpiBits(p); | |||
unsigned int nbits; | unsigned int nbits; | |||
unsigned int nbytes; | unsigned int nbytes; | |||
char * t; | char * t; | |||
unsigned int ix; | unsigned int ix; | |||
if (pend != NULL && (p + ((mbits+7) >> 3)) > pend) | if (pend != NULL && (p + ((mbits+7) >> 3)) > pend) | |||
return 1; | return 1; | |||
if (mbits > lbits) | if (mbits > lbits) | |||
return 1; | return 1; | |||
nbits = (lbits > mbits ? lbits : mbits); | nbits = (lbits > mbits ? lbits : mbits); | |||
nbytes = ((nbits + 7) >> 3); | nbytes = ((nbits + 7) >> 3); | |||
t = xmalloc(2*nbytes+1); | t = (char *) xmalloc(2*nbytes+1); | |||
ix = 2 * ((nbits - mbits) >> 3); | ix = 2 * ((nbits - mbits) >> 3); | |||
if (_pgp_debug) | if (_pgp_debug) | |||
fprintf(stderr, "*** mbits %u nbits %u nbytes %u t %p[%d] ix %u\n", mbits, nbits, nbytes, t, (2*nbytes+1), ix); | fprintf(stderr, "*** mbits %u nbits %u nbytes %u t %p[%d] ix %u\n", mbits, nbits, nbytes, t, (2*nbytes+1), ix); | |||
if (ix > 0) memset(t, (int)'0', ix); | if (ix > 0) memset(t, (int)'0', ix); | |||
{ const char * s = pgpMpiHex(p); | { const char * s = pgpMpiHex(p); | |||
strcpy(t+ix, s); | strcpy(t+ix, s); | |||
s = _free(s); | s = _free(s); | |||
} | } | |||
if (_pgp_debug) | if (_pgp_debug) | |||
skipping to change at line 738 | skipping to change at line 738 | |||
t = _free(t); | t = _free(t); | |||
return 0; | return 0; | |||
} | } | |||
static | static | |||
int rpmbcMpiItem(const char * pre, pgpDig dig, int itemno, | int rpmbcMpiItem(const char * pre, pgpDig dig, int itemno, | |||
const rpmuint8_t * p, /*@null@*/ const rpmuint8_t * pend) | const rpmuint8_t * p, /*@null@*/ const rpmuint8_t * pend) | |||
/*@globals fileSystem @*/ | /*@globals fileSystem @*/ | |||
/*@modifies fileSystem @*/ | /*@modifies fileSystem @*/ | |||
{ | { | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
const char * s = NULL; | const char * s = NULL; | |||
int rc = 0; | int rc = 0; | |||
switch (itemno) { | switch (itemno) { | |||
default: | default: | |||
assert(0); | assert(0); | |||
case 50: /* ECDSA r */ | case 50: /* ECDSA r */ | |||
case 51: /* ECDSA s */ | case 51: /* ECDSA s */ | |||
case 60: /* ECDSA curve OID */ | case 60: /* ECDSA curve OID */ | |||
case 61: /* ECDSA Q */ | case 61: /* ECDSA Q */ | |||
skipping to change at line 805 | skipping to change at line 805 | |||
} | } | |||
s = _free(s); | s = _free(s); | |||
return rc; | return rc; | |||
} | } | |||
/*@-mustmod@*/ | /*@-mustmod@*/ | |||
static | static | |||
void rpmbcClean(void * impl) | void rpmbcClean(void * impl) | |||
/*@modifies impl @*/ | /*@modifies impl @*/ | |||
{ | { | |||
rpmbc bc = impl; | rpmbc bc = (rpmbc) impl; | |||
if (bc != NULL) { | if (bc != NULL) { | |||
bc->nbits = 0; | bc->nbits = 0; | |||
bc->err = 0; | bc->err = 0; | |||
bc->badok = 0; | bc->badok = 0; | |||
bc->digest = _free(bc->digest); | bc->digest = _free(bc->digest); | |||
bc->digestlen = 0; | bc->digestlen = 0; | |||
randomGeneratorContextFree(&bc->rngc); | randomGeneratorContextFree(&bc->rngc); | |||
rsakpFree(&bc->rsa_keypair); | rsakpFree(&bc->rsa_keypair); | |||
skipping to change at line 846 | skipping to change at line 846 | |||
{ | { | |||
rpmbcClean(impl); | rpmbcClean(impl); | |||
impl = _free(impl); | impl = _free(impl); | |||
return NULL; | return NULL; | |||
} | } | |||
static | static | |||
void * rpmbcInit(void) | void * rpmbcInit(void) | |||
/*@*/ | /*@*/ | |||
{ | { | |||
rpmbc bc = xcalloc(1, sizeof(*bc)); | rpmbc bc = (rpmbc) xcalloc(1, sizeof(*bc)); | |||
return (void *) bc; | return (void *) bc; | |||
} | } | |||
struct pgpImplVecs_s rpmbcImplVecs = { | struct pgpImplVecs_s rpmbcImplVecs = { | |||
rpmbcSetRSA, | rpmbcSetRSA, | |||
rpmbcSetDSA, | rpmbcSetDSA, | |||
rpmbcSetELG, | rpmbcSetELG, | |||
rpmbcSetECDSA, | rpmbcSetECDSA, | |||
rpmbcErrChk, | rpmbcErrChk, | |||
skipping to change at line 873 | skipping to change at line 873 | |||
int rpmbcExportPubkey(pgpDig dig) | int rpmbcExportPubkey(pgpDig dig) | |||
{ | { | |||
uint8_t pkt[8192]; | uint8_t pkt[8192]; | |||
uint8_t * be = pkt; | uint8_t * be = pkt; | |||
size_t pktlen; | size_t pktlen; | |||
time_t now = time(NULL); | time_t now = time(NULL); | |||
uint32_t bt = now; | uint32_t bt = now; | |||
uint16_t bn; | uint16_t bn; | |||
pgpDigParams pubp = pgpGetPubkey(dig); | pgpDigParams pubp = pgpGetPubkey(dig); | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int xx; | int xx; | |||
*be++ = 0x80 | (PGPTAG_PUBLIC_KEY << 2) | 0x01; | *be++ = 0x80 | (PGPTAG_PUBLIC_KEY << 2) | 0x01; | |||
be += 2; | be += 2; | |||
*be++ = 0x04; | *be++ = 0x04; | |||
*be++ = (bt >> 24); | *be++ = (bt >> 24); | |||
*be++ = (bt >> 16); | *be++ = (bt >> 16); | |||
*be++ = (bt >> 8); | *be++ = (bt >> 8); | |||
*be++ = (bt ); | *be++ = (bt ); | |||
skipping to change at line 934 | skipping to change at line 934 | |||
{ | { | |||
uint8_t pkt[8192]; | uint8_t pkt[8192]; | |||
uint8_t * be = pkt; | uint8_t * be = pkt; | |||
uint8_t * h; | uint8_t * h; | |||
size_t pktlen; | size_t pktlen; | |||
time_t now = time(NULL); | time_t now = time(NULL); | |||
uint32_t bt; | uint32_t bt; | |||
uint16_t bn; | uint16_t bn; | |||
pgpDigParams pubp = pgpGetPubkey(dig); | pgpDigParams pubp = pgpGetPubkey(dig); | |||
pgpDigParams sigp = pgpGetSignature(dig); | pgpDigParams sigp = pgpGetSignature(dig); | |||
rpmbc bc = dig->impl; | rpmbc bc = (rpmbc) dig->impl; | |||
int xx; | int xx; | |||
sigp->tag = PGPTAG_SIGNATURE; | sigp->tag = PGPTAG_SIGNATURE; | |||
*be++ = 0x80 | (sigp->tag << 2) | 0x01; | *be++ = 0x80 | (sigp->tag << 2) | 0x01; | |||
be += 2; /* pktlen */ | be += 2; /* pktlen */ | |||
sigp->hash = be; | sigp->hash = be; | |||
*be++ = sigp->version = 0x04; /* version */ | *be++ = sigp->version = 0x04; /* version */ | |||
*be++ = sigp->sigtype = PGPSIGTYPE_BINARY; /* sigtype */ | *be++ = sigp->sigtype = PGPSIGTYPE_BINARY; /* sigtype */ | |||
*be++ = sigp->pubkey_algo = pubp->pubkey_algo; /* pubkey_algo */ | *be++ = sigp->pubkey_algo = pubp->pubkey_algo; /* pubkey_algo */ | |||
skipping to change at line 1000 | skipping to change at line 1000 | |||
trailer[2] = (sigp->hashlen >> 24); | trailer[2] = (sigp->hashlen >> 24); | |||
trailer[3] = (sigp->hashlen >> 16); | trailer[3] = (sigp->hashlen >> 16); | |||
trailer[4] = (sigp->hashlen >> 8); | trailer[4] = (sigp->hashlen >> 8); | |||
trailer[5] = (sigp->hashlen ); | trailer[5] = (sigp->hashlen ); | |||
xx = rpmDigestUpdate(ctx, trailer, sizeof(trailer)); | xx = rpmDigestUpdate(ctx, trailer, sizeof(trailer)); | |||
} | } | |||
sigp->signhash16[0] = 0x00; | sigp->signhash16[0] = 0x00; | |||
sigp->signhash16[1] = 0x00; | sigp->signhash16[1] = 0x00; | |||
xx = pgpImplSetDSA(ctx, dig, sigp); /* XXX signhash16 check alwa ys fails */ | xx = pgpImplSetDSA(ctx, dig, sigp); /* XXX signhash16 check alwa ys fails */ | |||
h = bc->digest; | h = (uint8_t *) bc->digest; | |||
sigp->signhash16[0] = h[0]; | sigp->signhash16[0] = h[0]; | |||
sigp->signhash16[1] = h[1]; | sigp->signhash16[1] = h[1]; | |||
xx = pgpImplSign(dig); | xx = pgpImplSign(dig); | |||
assert(xx == 1); | assert(xx == 1); | |||
be += 2; /* skip unhashed length. */ | be += 2; /* skip unhashed length. */ | |||
h = be; | h = be; | |||
*be++ = 1 + 8; /* issuer key ID */ | *be++ = 1 + 8; /* issuer key ID */ | |||
End of changes. 26 change blocks. | ||||
26 lines changed or deleted | 26 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |