version 5.5.1
add SipHash and HalfSipHash for PIDigest
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "pidigest_md5_p.h"
|
||||
#include "pidigest_sha1_p.h"
|
||||
#include "pidigest_sha2_p.h"
|
||||
#include "pidigest_siphash_p.h"
|
||||
|
||||
|
||||
int PIDigest::hashLength(Type type) {
|
||||
@@ -49,6 +50,10 @@ int PIDigest::hashLength(Type type) {
|
||||
case Type::BLAKE2b_256: return 32;
|
||||
case Type::BLAKE2b_384: return 48;
|
||||
case Type::BLAKE2b_512: return 64;
|
||||
case Type::SipHash_2_4_64: return 8;
|
||||
case Type::SipHash_2_4_128: return 16;
|
||||
case Type::HalfSipHash_2_4_32: return 4;
|
||||
case Type::HalfSipHash_2_4_64: return 8;
|
||||
default: break;
|
||||
}
|
||||
return 0;
|
||||
@@ -77,6 +82,10 @@ int PIDigest::blockLength(Type type) {
|
||||
case Type::BLAKE2b_256:
|
||||
case Type::BLAKE2b_384:
|
||||
case Type::BLAKE2b_512: return 128;
|
||||
case Type::SipHash_2_4_64: return 8;
|
||||
case Type::SipHash_2_4_128: return 16;
|
||||
case Type::HalfSipHash_2_4_32: return 4;
|
||||
case Type::HalfSipHash_2_4_64: return 8;
|
||||
default: break;
|
||||
}
|
||||
return 0;
|
||||
@@ -105,6 +114,10 @@ PIConstChars PIDigest::typeName(Type type) {
|
||||
case Type::BLAKE2b_256: return "BLAKE2b_256";
|
||||
case Type::BLAKE2b_384: return "BLAKE2b_384";
|
||||
case Type::BLAKE2b_512: return "BLAKE2b_512";
|
||||
case Type::SipHash_2_4_64: return "SipHash_2_4_64";
|
||||
case Type::SipHash_2_4_128: return "SipHash_2_4_128";
|
||||
case Type::HalfSipHash_2_4_32: return "HalfSipHash_2_4_32";
|
||||
case Type::HalfSipHash_2_4_64: return "HalfSipHash_2_4_64";
|
||||
default: break;
|
||||
}
|
||||
return "Unknown";
|
||||
@@ -123,16 +136,42 @@ PIByteArray PIDigest::calculate(const PIByteArray & msg, Type type) {
|
||||
case Type::SHA2_512: return SHA2::sha5xx(msg, SHA2::initial_512, 64);
|
||||
case Type::SHA2_512_224: return SHA2::sha5xx(msg, SHA2::initial_512_224, 28);
|
||||
case Type::SHA2_512_256: return SHA2::sha5xx(msg, SHA2::initial_512_256, 32);
|
||||
case Type::BLAKE2s_128: return BLAKE2::blake2s(msg, 16);
|
||||
case Type::BLAKE2s_160: return BLAKE2::blake2s(msg, 20);
|
||||
case Type::BLAKE2s_224: return BLAKE2::blake2s(msg, 28);
|
||||
case Type::BLAKE2s_256: return BLAKE2::blake2s(msg, 32);
|
||||
case Type::BLAKE2b_128: return BLAKE2::blake2b(msg, 16);
|
||||
case Type::BLAKE2b_160: return BLAKE2::blake2b(msg, 20);
|
||||
case Type::BLAKE2b_224: return BLAKE2::blake2b(msg, 28);
|
||||
case Type::BLAKE2b_256: return BLAKE2::blake2b(msg, 32);
|
||||
case Type::BLAKE2b_384: return BLAKE2::blake2b(msg, 48);
|
||||
case Type::BLAKE2b_512: return BLAKE2::blake2b(msg, 64);
|
||||
case Type::BLAKE2s_128: return BLAKE2::blake2s(msg, {}, 16);
|
||||
case Type::BLAKE2s_160: return BLAKE2::blake2s(msg, {}, 20);
|
||||
case Type::BLAKE2s_224: return BLAKE2::blake2s(msg, {}, 28);
|
||||
case Type::BLAKE2s_256: return BLAKE2::blake2s(msg, {}, 32);
|
||||
case Type::BLAKE2b_128: return BLAKE2::blake2b(msg, {}, 16);
|
||||
case Type::BLAKE2b_160: return BLAKE2::blake2b(msg, {}, 20);
|
||||
case Type::BLAKE2b_224: return BLAKE2::blake2b(msg, {}, 28);
|
||||
case Type::BLAKE2b_256: return BLAKE2::blake2b(msg, {}, 32);
|
||||
case Type::BLAKE2b_384: return BLAKE2::blake2b(msg, {}, 48);
|
||||
case Type::BLAKE2b_512: return BLAKE2::blake2b(msg, {}, 64);
|
||||
case Type::SipHash_2_4_64: return SipHash::siphash(msg, {}, 8);
|
||||
case Type::SipHash_2_4_128: return SipHash::siphash(msg, {}, 16);
|
||||
case Type::HalfSipHash_2_4_32: return SipHash::halfsiphash(msg, {}, 4);
|
||||
case Type::HalfSipHash_2_4_64: return SipHash::halfsiphash(msg, {}, 8);
|
||||
default: break;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
PIByteArray PIDigest::calculateWithKey(const PIByteArray & msg, const PIByteArray & key, Type type) {
|
||||
switch (type) {
|
||||
case Type::BLAKE2s_128: return BLAKE2::blake2s(msg, key, 16);
|
||||
case Type::BLAKE2s_160: return BLAKE2::blake2s(msg, key, 20);
|
||||
case Type::BLAKE2s_224: return BLAKE2::blake2s(msg, key, 28);
|
||||
case Type::BLAKE2s_256: return BLAKE2::blake2s(msg, key, 32);
|
||||
case Type::BLAKE2b_128: return BLAKE2::blake2b(msg, key, 16);
|
||||
case Type::BLAKE2b_160: return BLAKE2::blake2b(msg, key, 20);
|
||||
case Type::BLAKE2b_224: return BLAKE2::blake2b(msg, key, 28);
|
||||
case Type::BLAKE2b_256: return BLAKE2::blake2b(msg, key, 32);
|
||||
case Type::BLAKE2b_384: return BLAKE2::blake2b(msg, key, 48);
|
||||
case Type::BLAKE2b_512: return BLAKE2::blake2b(msg, key, 64);
|
||||
case Type::SipHash_2_4_64: return SipHash::siphash(msg, key, 8);
|
||||
case Type::SipHash_2_4_128: return SipHash::siphash(msg, key, 16);
|
||||
case Type::HalfSipHash_2_4_32: return SipHash::halfsiphash(msg, key, 4);
|
||||
case Type::HalfSipHash_2_4_64: return SipHash::halfsiphash(msg, key, 8);
|
||||
default: break;
|
||||
}
|
||||
return {};
|
||||
|
||||
@@ -39,15 +39,18 @@ class PIP_EXPORT PIDigest {
|
||||
public:
|
||||
enum class Type {
|
||||
SHA1,
|
||||
|
||||
SHA2_224,
|
||||
SHA2_256,
|
||||
SHA2_384,
|
||||
SHA2_512,
|
||||
SHA2_512_224,
|
||||
SHA2_512_256,
|
||||
|
||||
MD2,
|
||||
MD4,
|
||||
MD5,
|
||||
|
||||
BLAKE2s_128,
|
||||
BLAKE2s_160,
|
||||
BLAKE2s_224,
|
||||
@@ -58,6 +61,12 @@ public:
|
||||
BLAKE2b_256,
|
||||
BLAKE2b_384,
|
||||
BLAKE2b_512,
|
||||
|
||||
SipHash_2_4_64,
|
||||
SipHash_2_4_128,
|
||||
HalfSipHash_2_4_32,
|
||||
HalfSipHash_2_4_64,
|
||||
|
||||
Count,
|
||||
};
|
||||
|
||||
@@ -66,6 +75,7 @@ public:
|
||||
static PIConstChars typeName(Type type);
|
||||
|
||||
static PIByteArray calculate(const PIByteArray & msg, Type type);
|
||||
static PIByteArray calculateWithKey(const PIByteArray & msg, const PIByteArray & key, Type type);
|
||||
static PIByteArray HMAC(const PIByteArray & msg, const PIByteArray & key, PIDigest::Type type);
|
||||
};
|
||||
|
||||
|
||||
@@ -21,44 +21,18 @@
|
||||
|
||||
#include "3rd/BLAKE2/blake2.h"
|
||||
|
||||
#define IMPLEMENT(func, key_len) \
|
||||
PIByteArray BLAKE2::func(const PIByteArray & in, const PIByteArray & key, int out_bytes) { \
|
||||
PIByteArray ret(out_bytes); \
|
||||
::func(ret.data(), ret.size(), in.data(), in.size(), key.isEmpty() ? nullptr : key.data(), piMini(key.size(), key_len)); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
PIByteArray BLAKE2::blake2s(const PIByteArray & in, int out_bytes) {
|
||||
PIByteArray ret(out_bytes);
|
||||
::blake2s(ret.data(), ret.size(), in.data(), in.size(), nullptr, 0);
|
||||
return ret;
|
||||
}
|
||||
IMPLEMENT(blake2s, BLAKE2S_KEYBYTES)
|
||||
IMPLEMENT(blake2b, BLAKE2B_KEYBYTES)
|
||||
IMPLEMENT(blake2sp, BLAKE2S_KEYBYTES)
|
||||
IMPLEMENT(blake2bp, BLAKE2B_KEYBYTES)
|
||||
IMPLEMENT(blake2xs, BLAKE2S_KEYBYTES)
|
||||
IMPLEMENT(blake2xb, BLAKE2B_KEYBYTES)
|
||||
|
||||
|
||||
PIByteArray BLAKE2::blake2b(const PIByteArray & in, int out_bytes) {
|
||||
PIByteArray ret(out_bytes);
|
||||
::blake2b(ret.data(), ret.size(), in.data(), in.size(), nullptr, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PIByteArray BLAKE2::blake2sp(const PIByteArray & in, int out_bytes) {
|
||||
PIByteArray ret(out_bytes);
|
||||
::blake2sp(ret.data(), ret.size(), in.data(), in.size(), nullptr, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PIByteArray BLAKE2::blake2bp(const PIByteArray & in, int out_bytes) {
|
||||
PIByteArray ret(out_bytes);
|
||||
::blake2bp(ret.data(), ret.size(), in.data(), in.size(), nullptr, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PIByteArray BLAKE2::blake2xs(const PIByteArray & in, int out_bytes) {
|
||||
PIByteArray ret(out_bytes);
|
||||
::blake2xs(ret.data(), ret.size(), in.data(), in.size(), nullptr, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PIByteArray BLAKE2::blake2xb(const PIByteArray & in, int out_bytes) {
|
||||
PIByteArray ret(out_bytes);
|
||||
::blake2xb(ret.data(), ret.size(), in.data(), in.size(), nullptr, 0);
|
||||
return ret;
|
||||
}
|
||||
#undef IMPLEMENT
|
||||
|
||||
@@ -24,12 +24,12 @@
|
||||
|
||||
class BLAKE2 {
|
||||
public:
|
||||
static PIByteArray blake2s(const PIByteArray & in, int out_bytes);
|
||||
static PIByteArray blake2b(const PIByteArray & in, int out_bytes);
|
||||
static PIByteArray blake2sp(const PIByteArray & in, int out_bytes);
|
||||
static PIByteArray blake2bp(const PIByteArray & in, int out_bytes);
|
||||
static PIByteArray blake2xs(const PIByteArray & in, int out_bytes);
|
||||
static PIByteArray blake2xb(const PIByteArray & in, int out_bytes);
|
||||
static PIByteArray blake2s(const PIByteArray & in, const PIByteArray & key, int out_bytes);
|
||||
static PIByteArray blake2b(const PIByteArray & in, const PIByteArray & key, int out_bytes);
|
||||
static PIByteArray blake2sp(const PIByteArray & in, const PIByteArray & key, int out_bytes);
|
||||
static PIByteArray blake2bp(const PIByteArray & in, const PIByteArray & key, int out_bytes);
|
||||
static PIByteArray blake2xs(const PIByteArray & in, const PIByteArray & key, int out_bytes);
|
||||
static PIByteArray blake2xb(const PIByteArray & in, const PIByteArray & key, int out_bytes);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user