16 #include "blake2-rpm.h"
69 #include "radiogatun.h"
116 #define DPRINTF(_a) if (_ctx_debug < 0) fprintf _a
180 if (_ctxPool == NULL) {
187 memset(((
char *)ctx)+
sizeof(ctx->
_item), 0,
sizeof(*ctx)-
sizeof(ctx->
_item));
203 return (ctx != NULL ? ctx->
name :
"UNKNOWN");
208 return (ctx != NULL ? ctx->
asn1 : NULL);
241 static int md6_Update(
void * param,
const byte * _data,
size_t _len)
243 return md6_update((md6_state *)param, (
unsigned char *) _data, (
rpmuint64_t)(8 * _len));
274 ctx->
Reset = (int (*)(
void *)) md5Reset;
275 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) md5Update;
276 ctx->
Digest = (int (*)(
void *, byte *)) md5Digest;
278 ctx->
asn1 =
"3020300c06082a864886f70d020505000410";
288 ctx->
Reset = (int (*)(
void *)) sha1Reset;
289 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha1Update;
290 ctx->
Digest = (int (*)(
void *, byte *)) sha1Digest;
292 ctx->
asn1 =
"3021300906052b0e03021a05000414";
295 ctx->
name =
"RIPEMD128";
302 ctx->
Reset = (int (*)(
void *)) ripemd128Reset;
303 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd128Update;
304 ctx->
Digest = (int (*)(
void *, byte *)) ripemd128Digest;
308 ctx->
name =
"RIPEMD160";
315 ctx->
Reset = (int (*)(
void *)) ripemd160Reset;
316 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd160Update;
317 ctx->
Digest = (int (*)(
void *, byte *)) ripemd160Digest;
319 ctx->
asn1 =
"3021300906052b2403020105000414";
322 ctx->
name =
"RIPEMD256";
329 ctx->
Reset = (int (*)(
void *)) ripemd256Reset;
330 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd256Update;
331 ctx->
Digest = (int (*)(
void *, byte *)) ripemd256Digest;
335 ctx->
name =
"RIPEMD320";
342 ctx->
Reset = (int (*)(
void *)) ripemd320Reset;
343 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) ripemd320Update;
344 ctx->
Digest = (int (*)(
void *, byte *)) ripemd320Digest;
348 ctx->
name =
"SALSA10";
355 ctx->
Reset = (int (*)(
void *)) salsa10Reset;
356 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) salsa10Update;
357 ctx->
Digest = (int (*)(
void *, byte *)) salsa10Digest;
361 ctx->
name =
"SALSA20";
368 ctx->
Reset = (int (*)(
void *)) salsa20Reset;
369 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) salsa20Update;
370 ctx->
Digest = (int (*)(
void *, byte *)) salsa20Digest;
374 ctx->
name =
"TIGER192";
381 ctx->
Reset = (int (*)(
void *)) tigerReset;
382 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) tigerUpdate;
383 ctx->
Digest = (int (*)(
void *, byte *)) tigerDigest;
385 ctx->
asn1 =
"3029300d06092b06010401da470c0205000418";
396 ctx->
Reset = (int (*)(
void *)) md2Reset;
397 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) md2Update;
398 ctx->
Digest = (int (*)(
void *, byte *)) md2Digest;
400 ctx->
asn1 =
"3020300c06082a864886f70d020205000410";
410 ctx->
Reset = (int (*)(
void *)) md4Reset;
411 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) md4Update;
412 ctx->
Digest = (int (*)(
void *, byte *)) md4Digest;
434 ctx->
name =
"ADLER32";
487 ctx->
name =
"SHA224";
494 ctx->
Reset = (int (*)(
void *)) sha224Reset;
495 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha224Update;
496 ctx->
Digest = (int (*)(
void *, byte *)) sha224Digest;
498 ctx->
asn1 =
"302d300d06096086480165030402040500041C";
501 ctx->
name =
"SHA256";
508 ctx->
Reset = (int (*)(
void *)) sha256Reset;
509 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha256Update;
510 ctx->
Digest = (int (*)(
void *, byte *)) sha256Digest;
512 ctx->
asn1 =
"3031300d060960864801650304020105000420";
515 ctx->
name =
"SHA384";
523 ctx->
Reset = (int (*)(
void *)) sha384Reset;
524 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha384Update;
525 ctx->
Digest = (int (*)(
void *, byte *)) sha384Digest;
527 ctx->
asn1 =
"3041300d060960864801650304020205000430";
530 ctx->
name =
"SHA512";
538 ctx->
Reset = (int (*)(
void *)) sha512Reset;
539 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) sha512Update;
540 ctx->
Digest = (int (*)(
void *, byte *)) sha512Digest;
542 ctx->
asn1 =
"3051300d060960864801650304020305000440";
547 ctx->
name =
"SKEIN256";
549 ctx->
paramsize =
sizeof(Skein_256_Ctxt_t);
552 (void) Skein_256_Init((Skein_256_Ctxt_t *)ctx->
param,
555 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) Skein_256_Update;
556 ctx->
Digest = (int (*)(
void *, byte *)) Skein_256_Final;
561 ctx->
name =
"SKEIN512";
563 ctx->
paramsize =
sizeof(Skein_512_Ctxt_t);
566 (void) Skein_512_Init((Skein_512_Ctxt_t *)ctx->
param,
569 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) Skein_512_Update;
570 ctx->
Digest = (int (*)(
void *, byte *)) Skein_512_Final;
573 ctx->
name =
"SKEIN1024";
576 ctx->
paramsize =
sizeof(Skein1024_Ctxt_t);
579 (void) Skein1024_Init((Skein1024_Ctxt_t *)ctx->
param,
582 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) Skein1024_Update;
583 ctx->
Digest = (int (*)(
void *, byte *)) Skein1024_Final;
590 ctx->
name =
"ARIRANG";
595 (void) arirangInit((arirangParam *)ctx->
param, (int)(8 * ctx->
digestsize));
596 ctx->
Reset = (int (*)(
void *)) arirangReset;
597 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) arirangUpdate;
598 ctx->
Digest = (int (*)(
void *, byte *)) arirangDigest;
610 (void) blakeInit((blakeParam *)ctx->
param, (int)(8 * ctx->
digestsize));
611 ctx->
Reset = (int (*)(
void *)) blakeReset;
612 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) blakeUpdate;
613 ctx->
Digest = (int (*)(
void *, byte *)) blakeDigest;
616 ctx->
name =
"BLAKE2B";
623 (void) blake2bInit((blake2bParam *)ctx->
param, (int)(8 * ctx->
digestsize));
624 ctx->
Reset = (int (*)(
void *)) blake2bReset;
625 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) blake2bUpdate;
626 ctx->
Digest = (int (*)(
void *, byte *)) blake2bDigest;
629 ctx->
name =
"BLAKE2BP";
636 (void) blake2bpInit((blake2bpParam *)ctx->
param, (int)(8 * ctx->
digestsize));
637 ctx->
Reset = (int (*)(
void *)) blake2bpReset;
638 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) blake2bpUpdate;
639 ctx->
Digest = (int (*)(
void *, byte *)) blake2bpDigest;
642 ctx->
name =
"BLAKE2S";
649 (void) blake2sInit((blake2sParam *)ctx->
param, (int)(8 * ctx->
digestsize));
650 ctx->
Reset = (int (*)(
void *)) blake2sReset;
651 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) blake2sUpdate;
652 ctx->
Digest = (int (*)(
void *, byte *)) blake2sDigest;
655 ctx->
name =
"BLAKE2SP";
662 (void) blake2spInit((blake2spParam *)ctx->
param, (int)(8 * ctx->
digestsize));
663 ctx->
Reset = (int (*)(
void *)) blake2spReset;
664 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) blake2spUpdate;
665 ctx->
Digest = (int (*)(
void *, byte *)) blake2spDigest;
678 ctx->
Reset = (int (*)(
void *)) bmwReset;
679 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) bmwUpdate;
680 ctx->
Digest = (int (*)(
void *, byte *)) bmwDigest;
693 ctx->
Reset = (int (*)(
void *)) chiReset;
694 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) chiUpdate;
695 ctx->
Digest = (int (*)(
void *, byte *)) chiDigest;
702 ctx->
name =
"CUBEHASH";
707 (void) cubehashInit((cubehashParam *)ctx->
param, (int)(8 * ctx->
digestsize),
708 (int)((ctx->
flags >> 8) & 0xff),
709 (
int)((ctx->
flags ) & 0xff));
710 ctx->
Reset = (int (*)(
void *)) cubehashReset;
711 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) cubehashUpdate;
712 ctx->
Digest = (int (*)(
void *, byte *)) cubehashDigest;
724 (void) echo_Init((echo_hashState *)ctx->
param,
727 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _echo_Update;
728 ctx->
Digest = (int (*)(
void *, byte *)) echo_Final;
735 ctx->
name =
"EDON-R";
737 ctx->
paramsize =
sizeof(edonr_hashState);
740 (void) edonr_Init((edonr_hashState *)ctx->
param,
743 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) edonr_Update;
744 ctx->
Digest = (int (*)(
void *, byte *)) edonr_Final;
756 (void) fugueInit((fugueParam *)ctx->
param, (int)(8 * ctx->
digestsize));
757 ctx->
Reset = (int (*)(
void *)) fugueReset;
758 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) fugueUpdate;
759 ctx->
Digest = (int (*)(
void *, byte *)) fugueDigest;
766 ctx->
name =
"GROESTL";
768 ctx->
paramsize =
sizeof(groestl_hashState);
771 (void) groestl_Init((groestl_hashState *)ctx->
param,
774 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _groestl_Update;
775 ctx->
Digest = (int (*)(
void *, byte *)) groestl_Final;
787 (void) hamsiInit((hamsiParam *)ctx->
param, (int)(8 * ctx->
digestsize));
788 ctx->
Reset = (int (*)(
void *)) hamsiReset;
789 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) hamsiUpdate;
790 ctx->
Digest = (int (*)(
void *, byte *)) hamsiDigest;
803 ctx->
Reset = (int (*)(
void *)) jhReset;
804 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) jhUpdate;
805 ctx->
Digest = (int (*)(
void *, byte *)) jhDigest;
812 ctx->
name =
"KECCAK";
814 ctx->
paramsize =
sizeof(keccak_hashState);
817 (void) keccak_Init((keccak_hashState *)ctx->
param,
820 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _keccak_Update;
821 ctx->
Digest = (int (*)(
void *, byte *)) keccak_Final;
834 ctx->
Reset = (int (*)(
void *)) laneReset;
835 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) laneUpdate;
836 ctx->
Digest = (int (*)(
void *, byte *)) laneDigest;
848 (void) luffaInit((luffaParam *)ctx->
param, (int)(8 * ctx->
digestsize));
849 ctx->
Reset = (int (*)(
void *)) luffaReset;
850 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) luffaUpdate;
851 ctx->
Digest = (int (*)(
void *, byte *)) luffaDigest;
864 int L = md6_default_L;
865 unsigned char *K = NULL;
867 int r = md6_default_r(d, keylen);
869 if (ctx->
flags != 0) {
870 r = ((ctx->
flags >> 8) & 0xffff);
871 L = ((ctx->
flags ) & 0xff);
872 if (r <= 0 || r > 255) r = md6_default_r(d, keylen);
874 (void) md6_full_init((md6_state *)ctx->
param,
879 ctx->
Digest = (int (*)(
void *, byte *)) md6_final;
889 ctx->
Reset = (int (*)(
void *)) rg32Reset;
890 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) rg32Update;
891 ctx->
Digest = (int (*)(
void *, byte *)) rg32Digest;
900 ctx->
Reset = (int (*)(
void *)) rg64Reset;
901 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) rg64Update;
902 ctx->
Digest = (int (*)(
void *, byte *)) rg64Digest;
906 case PGPHASHALGO_SHABAL_192: ctx->
digestsize = 192/8;
goto shabal;
913 ctx->
name =
"SHABAL";
918 (void) shabalInit((shabalParam *)ctx->
param, (int)(8 * ctx->
digestsize));
919 ctx->
Reset = (int (*)(
void *)) shabalReset;
920 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) shabalUpdate;
921 ctx->
Digest = (int (*)(
void *, byte *)) shabalDigest;
928 ctx->
name =
"SHAVITE3";
930 ctx->
paramsize =
sizeof(shavite3_hashState);
933 (void) shavite3_Init((shavite3_hashState *)ctx->
param,
936 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _shavite3_Update;
937 ctx->
Digest = (int (*)(
void *, byte *)) shavite3_Final;
949 (void) simd_Init((simd_hashState *)ctx->
param,
952 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _simd_Update;
953 ctx->
Digest = (int (*)(
void *, byte *)) simd_Final;
965 (void) tib3_Init((tib3_hashState *)ctx->
param,
968 ctx->
Update = (int (*)(
void *,
const byte *, size_t)) _tib3_Update;
969 ctx->
Digest = (int (*)(
void *, byte *)) tib3_Final;
980 DPRINTF((stderr,
"==> ctx %p ==== Init(%s, %x) param %p\n", ctx, ctx->
name, flags, ctx->
param));
991 DPRINTF((stderr,
"==> ctx %p ==== Update(%s,%p[%u]) param %p\n", ctx, ctx->
name, data, (
unsigned)len, ctx->
param));
992 return (*ctx->
Update) (ctx->
param, (byte *)data, len);
996 #define HMAC_IPAD 0x36
997 #define HMAC_OPAD 0x5c
1009 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));
1015 if (ctx->
salt != NULL) {
1017 byte * salt = (byte *) ctx->
salt;
1018 byte * kdigest = NULL;
1019 size_t kdigestlen = 0;
1027 memcpy(digest, kdigest, kdigestlen);
1028 kdigest =
_free(kdigest);
1035 *(byte **)datap = digest;
1041 const byte * s = (
const byte *) digest;
1042 static const char hex[] =
"0123456789abcdef";
1047 *t++ = hex[ (unsigned)((*s >> 4) & 0x0f) ];
1048 *t++ = hex[ (unsigned)((*s++ ) & 0x0f) ];
1071 if (keylen == 0) keylen = strlen((
char *)key);
1073 DPRINTF((stderr,
"==> ctx %p ==== HMAC(%s,%p[%u])\n", ctx, ctx->
name, key, (
unsigned)keylen));
1077 byte * kdigest = NULL;
1078 size_t kdigestlen = 0;
1081 memcpy(ctx->
salt, kdigest, kdigestlen);
1082 kdigest =
_free(kdigest);
1084 memcpy(ctx->
salt, key, keylen);
1086 salt = (byte *)ctx->
salt;
const char const double d
#define ANNOTATE_BENIGN_RACE(_a, _b)
static DIGEST_CTX ctxGetPool(rpmioPool pool)
int sum64Digest(sum64Param *mp, rpmuint8_t *data)
const char const char size_t len
int sum32Reset(register sum32Param *mp)
int(* Update)(void *param, const byte *data, size_t size)
DIGEST_CTX rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
Initialize digest context.
rpmioItem rpmioLinkPoolItem(rpmioItem item, const char *msg, const char *fn, unsigned ln)
Increment a pool item refcount.
enum pgpHashAlgo_e pgpHashAlgo
9.4.
rpmuint64_t(* combine)(rpmuint64_t crc1, rpmuint64_t crc2, size_t len2)
#define DRD_xcalloc(_nmemb, _size)
void * rpmioFreePoolItem(rpmioItem item, const char *msg, const char *fn, unsigned ln)
Free a pool item.
enum rpmDigestFlags_e rpmDigestFlags
Bit(s) to control digest operation.
rpmuint32_t(* update)(rpmuint32_t crc, const rpmuint8_t *data, size_t size)
CRC32, CRC64 and ADLER32 checksums.
static int md6_Update(void *param, const byte *_data, size_t _len)
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.
const char const bson * data
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(* combine)(rpmuint32_t crc1, rpmuint32_t crc2, size_t len2)
rpmuint32_t __crc32_combine(rpmuint32_t crc1, rpmuint32_t crc2, size_t len2)
int(* Reset)(void *param)
const char const bson int mongo_write_concern int flags
const char const bson * key
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.
const char const char size_t size
int sum32Update(sum32Param *mp, const rpmuint8_t *data, size_t size)
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)
int(* Digest)(void *param, byte *digest)
rpmuint64_t(* update)(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)