113 #define DPRINTF(_a) if (_ctx_debug < 0) fprintf _a 177 if (_ctxPool == NULL) {
184 memset(((
char *)ctx)+
sizeof(ctx->
_item), 0,
sizeof(*ctx)-
sizeof(ctx->
_item));
200 return (ctx != NULL ? ctx->
name :
"UNKNOWN");
205 return (ctx != NULL ? ctx->
asn1 : NULL);
240 return md6_update((md6_state *)param, (
unsigned char *) _data, (
rpmuint64_t)(8 * _len));
271 ctx->
Reset = (int (*)(
void *)) md5Reset;
272 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) md5Update;
273 ctx->
Digest = (int (*)(
void *, byte *)) md5Digest;
275 ctx->
asn1 =
"3020300c06082a864886f70d020505000410";
285 ctx->
Reset = (int (*)(
void *)) sha1Reset;
286 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha1Update;
287 ctx->
Digest = (int (*)(
void *, byte *)) sha1Digest;
289 ctx->
asn1 =
"3021300906052b0e03021a05000414";
292 ctx->
name =
"RIPEMD128";
299 ctx->
Reset = (int (*)(
void *)) ripemd128Reset;
300 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd128Update;
301 ctx->
Digest = (int (*)(
void *, byte *)) ripemd128Digest;
305 ctx->
name =
"RIPEMD160";
312 ctx->
Reset = (int (*)(
void *)) ripemd160Reset;
313 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd160Update;
314 ctx->
Digest = (int (*)(
void *, byte *)) ripemd160Digest;
316 ctx->
asn1 =
"3021300906052b2403020105000414";
319 ctx->
name =
"RIPEMD256";
326 ctx->
Reset = (int (*)(
void *)) ripemd256Reset;
327 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd256Update;
328 ctx->
Digest = (int (*)(
void *, byte *)) ripemd256Digest;
332 ctx->
name =
"RIPEMD320";
339 ctx->
Reset = (int (*)(
void *)) ripemd320Reset;
340 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd320Update;
341 ctx->
Digest = (int (*)(
void *, byte *)) ripemd320Digest;
345 ctx->
name =
"SALSA10";
352 ctx->
Reset = (int (*)(
void *)) salsa10Reset;
353 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) salsa10Update;
354 ctx->
Digest = (int (*)(
void *, byte *)) salsa10Digest;
358 ctx->
name =
"SALSA20";
365 ctx->
Reset = (int (*)(
void *)) salsa20Reset;
366 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) salsa20Update;
367 ctx->
Digest = (int (*)(
void *, byte *)) salsa20Digest;
371 ctx->
name =
"TIGER192";
378 ctx->
Reset = (int (*)(
void *)) tigerReset;
379 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) tigerUpdate;
380 ctx->
Digest = (int (*)(
void *, byte *)) tigerDigest;
382 ctx->
asn1 =
"3029300d06092b06010401da470c0205000418";
393 ctx->
Reset = (int (*)(
void *)) md2Reset;
394 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) md2Update;
395 ctx->
Digest = (int (*)(
void *, byte *)) md2Digest;
397 ctx->
asn1 =
"3020300c06082a864886f70d020205000410";
407 ctx->
Reset = (int (*)(
void *)) md4Reset;
408 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) md4Update;
409 ctx->
Digest = (int (*)(
void *, byte *)) md4Digest;
431 ctx->
name =
"ADLER32";
484 ctx->
name =
"SHA224";
491 ctx->
Reset = (int (*)(
void *)) sha224Reset;
492 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha224Update;
493 ctx->
Digest = (int (*)(
void *, byte *)) sha224Digest;
495 ctx->
asn1 =
"302d300d06096086480165030402040500041C";
498 ctx->
name =
"SHA256";
505 ctx->
Reset = (int (*)(
void *)) sha256Reset;
506 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha256Update;
507 ctx->
Digest = (int (*)(
void *, byte *)) sha256Digest;
509 ctx->
asn1 =
"3031300d060960864801650304020105000420";
512 ctx->
name =
"SHA384";
520 ctx->
Reset = (int (*)(
void *)) sha384Reset;
521 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha384Update;
522 ctx->
Digest = (int (*)(
void *, byte *)) sha384Digest;
524 ctx->
asn1 =
"3041300d060960864801650304020205000430";
527 ctx->
name =
"SHA512";
535 ctx->
Reset = (int (*)(
void *)) sha512Reset;
536 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha512Update;
537 ctx->
Digest = (int (*)(
void *, byte *)) sha512Digest;
539 ctx->
asn1 =
"3051300d060960864801650304020305000440";
544 ctx->
name =
"SKEIN256";
546 ctx->
paramsize =
sizeof(Skein_256_Ctxt_t);
549 (void) Skein_256_Init((Skein_256_Ctxt_t *)ctx->
param,
552 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) Skein_256_Update;
553 ctx->
Digest = (int (*)(
void *, byte *)) Skein_256_Final;
558 ctx->
name =
"SKEIN512";
560 ctx->
paramsize =
sizeof(Skein_512_Ctxt_t);
563 (void) Skein_512_Init((Skein_512_Ctxt_t *)ctx->
param,
566 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) Skein_512_Update;
567 ctx->
Digest = (int (*)(
void *, byte *)) Skein_512_Final;
570 ctx->
name =
"SKEIN1024";
573 ctx->
paramsize =
sizeof(Skein1024_Ctxt_t);
576 (void) Skein1024_Init((Skein1024_Ctxt_t *)ctx->
param,
579 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) Skein1024_Update;
580 ctx->
Digest = (int (*)(
void *, byte *)) Skein1024_Final;
587 ctx->
name =
"ARIRANG";
592 (void) arirangInit((arirangParam *)ctx->
param, (int)(8 * ctx->
digestsize));
593 ctx->
Reset = (int (*)(
void *)) arirangReset;
594 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) arirangUpdate;
595 ctx->
Digest = (int (*)(
void *, byte *)) arirangDigest;
607 (void) blakeInit((blakeParam *)ctx->
param, (int)(8 * ctx->
digestsize));
608 ctx->
Reset = (int (*)(
void *)) blakeReset;
609 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) blakeUpdate;
610 ctx->
Digest = (int (*)(
void *, byte *)) blakeDigest;
623 ctx->
Reset = (int (*)(
void *)) bmwReset;
624 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) bmwUpdate;
625 ctx->
Digest = (int (*)(
void *, byte *)) bmwDigest;
638 ctx->
Reset = (int (*)(
void *)) chiReset;
639 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) chiUpdate;
640 ctx->
Digest = (int (*)(
void *, byte *)) chiDigest;
647 ctx->
name =
"CUBEHASH";
652 (void) cubehashInit((cubehashParam *)ctx->
param, (int)(8 * ctx->
digestsize),
653 (int)((ctx->
flags >> 8) & 0xff),
654 (
int)((ctx->
flags ) & 0xff));
655 ctx->
Reset = (int (*)(
void *)) cubehashReset;
656 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) cubehashUpdate;
657 ctx->
Digest = (int (*)(
void *, byte *)) cubehashDigest;
669 (void) echo_Init((echo_hashState *)ctx->
param,
672 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _echo_Update;
673 ctx->
Digest = (int (*)(
void *, byte *)) echo_Final;
680 ctx->
name =
"EDON-R";
682 ctx->
paramsize =
sizeof(edonr_hashState);
685 (void) edonr_Init((edonr_hashState *)ctx->
param,
688 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) edonr_Update;
689 ctx->
Digest = (int (*)(
void *, byte *)) edonr_Final;
701 (void) fugueInit((fugueParam *)ctx->
param, (int)(8 * ctx->
digestsize));
702 ctx->
Reset = (int (*)(
void *)) fugueReset;
703 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) fugueUpdate;
704 ctx->
Digest = (int (*)(
void *, byte *)) fugueDigest;
711 ctx->
name =
"GROESTL";
713 ctx->
paramsize =
sizeof(groestl_hashState);
716 (void) groestl_Init((groestl_hashState *)ctx->
param,
719 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _groestl_Update;
720 ctx->
Digest = (int (*)(
void *, byte *)) groestl_Final;
732 (void) hamsiInit((hamsiParam *)ctx->
param, (int)(8 * ctx->
digestsize));
733 ctx->
Reset = (int (*)(
void *)) hamsiReset;
734 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) hamsiUpdate;
735 ctx->
Digest = (int (*)(
void *, byte *)) hamsiDigest;
748 ctx->
Reset = (int (*)(
void *)) jhReset;
749 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) jhUpdate;
750 ctx->
Digest = (int (*)(
void *, byte *)) jhDigest;
757 ctx->
name =
"KECCAK";
759 ctx->
paramsize =
sizeof(keccak_hashState);
762 (void) keccak_Init((keccak_hashState *)ctx->
param,
765 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _keccak_Update;
766 ctx->
Digest = (int (*)(
void *, byte *)) keccak_Final;
779 ctx->
Reset = (int (*)(
void *)) laneReset;
780 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) laneUpdate;
781 ctx->
Digest = (int (*)(
void *, byte *)) laneDigest;
793 (void) luffaInit((luffaParam *)ctx->
param, (int)(8 * ctx->
digestsize));
794 ctx->
Reset = (int (*)(
void *)) luffaReset;
795 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) luffaUpdate;
796 ctx->
Digest = (int (*)(
void *, byte *)) luffaDigest;
809 int L = md6_default_L;
810 unsigned char *K = NULL;
812 int r = md6_default_r(d, keylen);
814 if (ctx->
flags != 0) {
815 r = ((ctx->
flags >> 8) & 0xffff);
816 L = ((ctx->
flags ) & 0xff);
817 if (r <= 0 || r > 255) r = md6_default_r(d, keylen);
819 (void) md6_full_init((md6_state *)ctx->
param,
824 ctx->
Digest = (int (*)(
void *, byte *)) md6_final;
827 case PGPHASHALGO_SHABAL_192: ctx->
digestsize = 192/8;
goto shabal;
834 ctx->
name =
"SHABAL";
839 (void) shabalInit((shabalParam *)ctx->
param, (int)(8 * ctx->
digestsize));
840 ctx->
Reset = (int (*)(
void *)) shabalReset;
841 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) shabalUpdate;
842 ctx->
Digest = (int (*)(
void *, byte *)) shabalDigest;
849 ctx->
name =
"SHAVITE3";
851 ctx->
paramsize =
sizeof(shavite3_hashState);
854 (void) shavite3_Init((shavite3_hashState *)ctx->
param,
857 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _shavite3_Update;
858 ctx->
Digest = (int (*)(
void *, byte *)) shavite3_Final;
870 (void) simd_Init((simd_hashState *)ctx->
param,
873 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _simd_Update;
874 ctx->
Digest = (int (*)(
void *, byte *)) simd_Final;
886 (void) tib3_Init((tib3_hashState *)ctx->
param,
889 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _tib3_Update;
890 ctx->
Digest = (int (*)(
void *, byte *)) tib3_Final;
901 DPRINTF((stderr,
"==> ctx %p ==== Init(%s, %x) param %p\n", ctx, ctx->
name, flags, ctx->
param));
912 DPRINTF((stderr,
"==> ctx %p ==== Update(%s,%p[%u]) param %p\n", ctx, ctx->
name, data, (
unsigned)len, ctx->
param));
913 return (*ctx->
Update) (ctx->
param, (byte *)data, len);
917 #define HMAC_IPAD 0x36 918 #define HMAC_OPAD 0x5c 930 DPRINTF((stderr,
"==> ctx %p ==== Final(%s,%p,%p,%d) param %p digest %p[%u]\n", ctx, ctx->
name, datap, lenp, asAscii, ctx->
param, digest, (
unsigned)ctx->
digestsize));
936 if (ctx->
salt != NULL) {
939 byte * kdigest = NULL;
940 size_t kdigestlen = 0;
948 memcpy(digest, kdigest, kdigestlen);
949 kdigest =
_free(kdigest);
956 *(byte **)datap = digest;
962 const byte * s = (
const byte *) digest;
963 static const char hex[] =
"0123456789abcdef";
968 *t++ = hex[ (unsigned)((*s >> 4) & 0x0f) ];
969 *t++ = hex[ (unsigned)((*s++ ) & 0x0f) ];
992 if (keylen == 0) keylen = strlen((
char *)key);
994 DPRINTF((stderr,
"==> ctx %p ==== HMAC(%s,%p[%u])\n", ctx, ctx->
name, key, (
unsigned)keylen));
998 byte * kdigest = NULL;
999 size_t kdigestlen = 0;
1002 memcpy(ctx->
salt, kdigest, kdigestlen);
1003 kdigest =
_free(kdigest);
1005 memcpy(ctx->
salt, key, keylen);
1007 salt = (byte *)ctx->
salt;
#define ANNOTATE_BENIGN_RACE(_a, _b)
static DIGEST_CTX ctxGetPool(rpmioPool pool)
int sum64Digest(sum64Param *mp, rpmuint8_t *data)
int sum32Reset(register sum32Param *mp)
DIGEST_CTX rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
Initialize digest.
rpmioItem rpmioLinkPoolItem(rpmioItem item, const char *msg, const char *fn, unsigned ln)
Increment a pool item refcount.
enum pgpHashAlgo_e pgpHashAlgo
9.4.
#define DRD_xcalloc(_nmemb, _size)
rpmuint64_t(* update)(rpmuint64_t crc, const rpmuint8_t *data, size_t size)
void * rpmioFreePoolItem(rpmioItem item, const char *msg, const char *fn, unsigned ln)
Free a pool item.
int(* Update)(void *param, const byte *data, size_t size)
enum rpmDigestFlags_e rpmDigestFlags
Bit(s) to control digest operation.
CRC32, CRC64 and ADLER32 checksums.
rpmuint32_t(* update)(rpmuint32_t crc, const rpmuint8_t *data, size_t size)
static int md6_Update(void *param, const byte *_data, size_t _len)
rpmuint64_t(* combine)(rpmuint64_t crc1, rpmuint64_t crc2, size_t len2)
int(* Digest)(void *param, byte *digest)
int rpmHmacInit(DIGEST_CTX ctx, const void *key, size_t keylen)
Compute key material and add to digest context.
rpmuint32_t __adler32(rpmuint32_t adler, const rpmuint8_t *buf, rpmuint32_t len)
rpmuint32_t __adler32_combine(rpmuint32_t adler1, rpmuint32_t adler2, size_t len2)
int sum64Update(sum64Param *mp, const rpmuint8_t *data, size_t size)
int rpmDigestUpdate(DIGEST_CTX ctx, const void *data, size_t len)
Update context with next plain text buffer.
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
int(* Reset)(void *param)
unsigned long long rpmuint64_t
pgpHashAlgo rpmDigestAlgo(DIGEST_CTX ctx)
Return digest algorithm identifier.
rpmuint64_t __crc64_combine(rpmuint64_t crc1, rpmuint64_t crc2, size_t len2)
int sum32Digest(sum32Param *mp, rpmuint8_t *data)
rpmuint32_t __crc32_combine(rpmuint32_t crc1, rpmuint32_t crc2, size_t len2)
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
rpmDigestFlags rpmDigestF(DIGEST_CTX ctx)
Return digest flags.
int sum32Update(sum32Param *mp, const rpmuint8_t *data, size_t size)
rpmuint32_t(* combine)(rpmuint32_t crc1, rpmuint32_t crc2, size_t len2)
struct DIGEST_CTX_s * DIGEST_CTX
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
const char * rpmDigestName(DIGEST_CTX ctx)
Return digest name.
static int noopReset(void *param)
static void ctxFini(void *_ctx)
int sum64Reset(register sum64Param *mp)
const char * rpmDigestASN1(DIGEST_CTX ctx)
Return digest ASN1 oid string.
int rpmDigestFinal(DIGEST_CTX ctx, void *datap, size_t *lenp, int asAscii)
Return digest and destroy context.
rpmuint64_t __crc64(rpmuint64_t crc, const rpmuint8_t *data, size_t size)
DIGEST_CTX rpmDigestDup(DIGEST_CTX octx)
Duplicate a digest context.
rpmuint32_t __crc32(rpmuint32_t crc, const rpmuint8_t *data, size_t size)