mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
add crypt.hmac64_md5
This commit is contained in:
@@ -546,10 +546,8 @@ const uint32_t r[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22
|
||||
// leftrotate function definition
|
||||
#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))
|
||||
|
||||
// hmac64 use md5 algorithm without padding, and the result is (c^d .. a^b)
|
||||
static void
|
||||
hmac(uint32_t x[2], uint32_t y[2], uint32_t result[2]) {
|
||||
uint32_t w[16];
|
||||
digest_md5(uint32_t w[16], uint32_t result[4]) {
|
||||
uint32_t a, b, c, d, f, g, temp;
|
||||
int i;
|
||||
|
||||
@@ -558,13 +556,6 @@ hmac(uint32_t x[2], uint32_t y[2], uint32_t result[2]) {
|
||||
c = 0x98badcfeu;
|
||||
d = 0x10325476u;
|
||||
|
||||
for (i=0;i<16;i+=4) {
|
||||
w[i] = x[1];
|
||||
w[i+1] = x[0];
|
||||
w[i+2] = y[1];
|
||||
w[i+3] = y[0];
|
||||
}
|
||||
|
||||
for(i = 0; i<64; i++) {
|
||||
if (i < 16) {
|
||||
f = (b & c) | ((~b) & d);
|
||||
@@ -585,11 +576,54 @@ hmac(uint32_t x[2], uint32_t y[2], uint32_t result[2]) {
|
||||
c = b;
|
||||
b = b + LEFTROTATE((a + f + k[i] + w[g]), r[i]);
|
||||
a = temp;
|
||||
|
||||
}
|
||||
|
||||
result[0] = c^d;
|
||||
result[1] = a^b;
|
||||
result[0] = a;
|
||||
result[1] = b;
|
||||
result[2] = c;
|
||||
result[3] = d;
|
||||
}
|
||||
|
||||
// hmac64 use md5 algorithm without padding, and the result is (c^d .. a^b)
|
||||
static void
|
||||
hmac(uint32_t x[2], uint32_t y[2], uint32_t result[2]) {
|
||||
uint32_t w[16];
|
||||
uint32_t r[4];
|
||||
int i;
|
||||
for (i=0;i<16;i+=4) {
|
||||
w[i] = x[1];
|
||||
w[i+1] = x[0];
|
||||
w[i+2] = y[1];
|
||||
w[i+3] = y[0];
|
||||
}
|
||||
|
||||
digest_md5(w,r);
|
||||
|
||||
result[0] = r[2]^r[3];
|
||||
result[1] = r[0]^r[1];
|
||||
}
|
||||
|
||||
static void
|
||||
hmac_md5(uint32_t x[2], uint32_t y[2], uint32_t result[2]) {
|
||||
uint32_t w[16];
|
||||
uint32_t r[4];
|
||||
int i;
|
||||
for (i=0;i<12;i+=4) {
|
||||
w[i] = x[0];
|
||||
w[i+1] = x[1];
|
||||
w[i+2] = y[0];
|
||||
w[i+3] = y[1];
|
||||
}
|
||||
|
||||
w[12] = 0x80;
|
||||
w[13] = 0;
|
||||
w[14] = 384;
|
||||
w[15] = 0;
|
||||
|
||||
digest_md5(w,r);
|
||||
|
||||
result[0] = (r[0] + 0x67452301u) ^ (r[2] + 0x98badcfeu);
|
||||
result[1] = (r[1] + 0xefcdab89u) ^ (r[3] + 0x10325476u);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -634,6 +668,21 @@ lhmac64(lua_State *L) {
|
||||
return pushqword(L, result);
|
||||
}
|
||||
|
||||
/*
|
||||
h1 = crypt.hmac64_md5(a,b)
|
||||
m = md5.sum((a..b):rep(3))
|
||||
h2 = crypt.xor_str(m:sub(1,8), m:sub(9,16))
|
||||
assert(h1 == h2)
|
||||
*/
|
||||
static int
|
||||
lhmac64_md5(lua_State *L) {
|
||||
uint32_t x[2], y[2];
|
||||
read64(L, x, y);
|
||||
uint32_t result[2];
|
||||
hmac_md5(x,y,result);
|
||||
return pushqword(L, result);
|
||||
}
|
||||
|
||||
/*
|
||||
8bytes key
|
||||
string text
|
||||
@@ -921,6 +970,7 @@ luaopen_skynet_crypt(lua_State *L) {
|
||||
{ "hexencode", ltohex },
|
||||
{ "hexdecode", lfromhex },
|
||||
{ "hmac64", lhmac64 },
|
||||
{ "hmac64_md5", lhmac64_md5 },
|
||||
{ "dhexchange", ldhexchange },
|
||||
{ "dhsecret", ldhsecret },
|
||||
{ "base64encode", lb64encode },
|
||||
|
||||
Reference in New Issue
Block a user