8000 crypto, feat: support shake. · fibjs/fibjs@3b7d8a9 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 3b7d8a9

Browse files
committed
crypto, feat: support shake.
1 parent 9ae4816 commit 3b7d8a9

File tree

8 files changed

+380
-29
lines changed

8 files changed

+380
-29
lines changed

fibjs/include/ifs/hash.h

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ class hash_base : public object_base {
3535
C_SHA3_256 = 9,
3636
C_SHA3_384 = 10,
3737
C_SHA3_512 = 11,
38-
C_KECCAK256 = 12,
39-
C_KECCAK384 = 13,
40-
C_KECCAK512 = 14,
41-
C_BLAKE2S = 15,
42-
C_BLAKE2B = 16,
43-
C_BLAKE2SP = 17,
44-
C_BLAKE2BP = 18
38+
C_SHAKE128 = 12,
39+
C_SHAKE256 = 13,
40+
C_KECCAK256 = 14,
41+
C_KECCAK384 = 15,
42+
C_KECCAK512 = 16,
43+
C_BLAKE2S = 17,
44+
C_BLAKE2B = 18,
45+
C_BLAKE2SP = 19,
46+
C_BLAKE2BP = 20
4547
};
4648

4749
public:
@@ -59,6 +61,8 @@ class hash_base : public object_base {
5961
static result_t sha3_256(Buffer_base* data, obj_ptr<Digest_base>& retVal);
6062
static result_t sha3_384(Buffer_base* data, obj_ptr<Digest_base>& retVal);
6163
static result_t sha3_512(Buffer_base* data, obj_ptr<Digest_base>& retVal);
64+
static result_t shake128(Buffer_base* data, obj_ptr<Digest_base>& retVal);
65+
static result_t shake256(Buffer_base* data, obj_ptr<Digest_base>& retV 8000 al);
6266
static result_t keccak256(Buffer_base* data, obj_ptr<Digest_base>& retVal);
6367
static result_t keccak384(Buffer_base* data, obj_ptr<Digest_base>& retVal);
6468
static result_t keccak512(Buffer_base* data, obj_ptr<Digest_base>& retVal);
@@ -78,6 +82,8 @@ class hash_base : public object_base {
7882
static result_t hmac_sm3(PKey_base* pubKey, exlib::string id, Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
7983
static result_t hmac_sha3_256(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
8084
static result_t hmac_sha3_384(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
85+
static result_t hmac_shake128(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
86+
static result_t hmac_shake256(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
8187
static result_t hmac_sha3_512(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
8288
static result_t hmac_keccak256(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
8389
static result_t hmac_keccak384(Buffer_base* key, Buffer_base* data, obj_ptr<Digest_base>& retVal);
@@ -109,6 +115,8 @@ class hash_base : public object_base {
109115
static void s_static_sha3_256(const v8::FunctionCallbackInfo<v8::Value>& args);
110116
static void s_static_sha3_384(const v8::FunctionCallbackInfo<v8::Value>& args);
111117
static void s_static_sha3_512(const v8::FunctionCallbackInfo<v8::Value>& args);
118+
static void s_static_shake128(const v8::FunctionCallbackInfo<v8::Value>& args);
119+
static void s_static_shake256(const v8::FunctionCallbackInfo<v8::Value>& args);
112120
static void s_static_keccak256(const v8::FunctionCallbackInfo<v8::Value>& args);
113121
static void s_static_keccak384(const v8::FunctionCallbackInfo<v8::Value>& args);
114122
static void s_static_keccak512(const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -127,6 +135,8 @@ class hash_base : public object_base {
127135
static void s_static_hmac_sm3(const v8::FunctionCallbackInfo<v8::Value>& args);
128136
static void s_static_hmac_sha3_256(const v8::FunctionCallbackInfo<v8::Value>& args);
129137
static void s_static_hmac_sha3_384(const v8::FunctionCallbackInfo<v8::Value>& args);
138+
static void s_static_hmac_shake128(const v8::FunctionCallbackInfo<v8::Value>& args);
139+
static void s_static_hmac_shake256(const v8::FunctionCallbackInfo<v8::Value>& args);
130140
static void s_static_hmac_sha3_512(const v8::FunctionCallbackInfo<v8::Value>& args);
131141
static void s_static_hmac_keccak256(const v8::FunctionCallbackInfo<v8::Value>& args);
132142
static void s_static_hmac_keccak384(const v8::FunctionCallbackInfo<v8::Value>& args);
@@ -158,6 +168,8 @@ inline ClassInfo& hash_base::class_info()
158168
{ "sha3_256", s_static_sha3_256, true, false },
159169
{ "sha3_384", s_static_sha3_384, true, false },
160170
{ "sha3_512", s_static_sha3_512, true, false },
171+
{ "shake128", s_static_shake128, true, false },
172+
{ "shake256", s_static_shake256, true, false },
161173
{ "keccak256", s_static_keccak256, true, false },
162174
{ "keccak384", s_static_keccak384, true, false },
163175
{ "keccak512", s_static_keccak512, true, false },
@@ -176,6 +188,8 @@ inline ClassInfo& hash_base::class_info()
176188
{ "hmac_sm3", s_static_hmac_sm3, true, false },
177189
{ "hmac_sha3_256", s_static_hmac_sha3_256, true, false },
178190
{ "hmac_sha3_384", s_static_hmac_sha3_384, true, false },
191+
{ "hmac_shake128", s_static_hmac_shake128, true, false },
192+
{ "hmac_shake256", s_static_hmac_shake256, true, false },
179193
{ "hmac_sha3_512", s_static_hmac_sha3_512, true, false },
180194
{ "hmac_keccak256", s_static_hmac_keccak256, true, false },
181195
{ "hmac_keccak384", s_static_hmac_keccak384, true, false },
@@ -198,6 +212,8 @@ inline ClassInfo& hash_base::class_info()
198212
{ "SHA3_256", C_SHA3_256 },
199213
{ "SHA3_384", C_SHA3_384 },
200214
{ "SHA3_512", C_SHA3_512 },
215+
{ "SHAKE128", C_SHAKE128 },
216+
{ "SHAKE256", C_SHAKE256 },
201217
{ "KECCAK256", C_KECCAK256 },
202218
{ "KECCAK384", C_KECCAK384 },
203219
{ "KECCAK512", C_KECCAK512 },
@@ -406,6 +422,36 @@ inline void hash_base::s_static_sha3_512(const v8::FunctionCallbackInfo<v8::Valu
406422
METHOD_RETURN();
407423
}
408424

425+
inline void hash_base::s_static_shake128(const v8::FunctionCallbackInfo<v8::Value>& args)
426+
{
427+
obj_ptr<Digest_base> vr;
428+
429+
METHOD_ENTER();
430+
431+
METHOD_OVER(1, 0);
432+
433+
OPT_ARG(obj_ptr<Buffer_base>, 0, NULL);
434+
435+
hr = shake128(v0, vr);
436+
437+
METHOD_RETURN();
438+
}
439+
440+
inline void hash_base::s_static_shake256(const v8::FunctionCallbackInfo<v8::Value>& args)
441+
{
442+
obj_ptr<Digest_base> vr;
443+
444+
METHOD_ENTER();
445+
446+
METHOD_OVER(1, 0);
447+
448+
OPT_ARG(obj_ptr<Buffer_base>, 0, NULL);
449+
450+
hr = shake256(v0, vr);
451+
452+
METHOD_RETURN();
453+
}
454+
409455
inline void hash_base::s_static_keccak256(const v8::FunctionCallbackInfo<v8::Value>& args)
410456
{
411457
obj_ptr<Digest_base> vr;
@@ -697,6 +743,38 @@ inline void hash_base::s_static_hmac_sha3_384(const v8::FunctionCallbackInfo<v8:
697743
METHOD_RETURN();
698744
}
699745

746+
inline void hash_base::s_static_hmac_shake128(const v8::FunctionCallbackInfo<v8::Value>& args)
747+
{
748+
obj_ptr<Digest_base> vr;
749+
750+
METHOD_ENTER();
751+
752+
METHOD_OVER(2, 1);
753+
754+
ARG(obj_ptr<Buffer_base>, 0);
755+
OPT_ARG(obj_ptr<Buffer_base>, 1, NULL);
756+
757+
hr = hmac_shake128(v0, v1, vr);
758+
759+
METHOD_RETURN();
760+
}
761+
762+
inline void hash_base::s_static_hmac_shake256(const v8::FunctionCallbackInfo<v8::Value>& args)
763+
{
764+
obj_ptr<Digest_base> vr;
765+
766+
METHOD_ENTER();
767+
768+
METHOD_OVER(2, 1);
769+
770+
ARG(obj_ptr<Buffer_base>, 0);
771+
OPT_ARG(obj_ptr<Buffer_base>, 1, NULL);
772+
773+
hr = hmac_shake256(v0, v1, vr);
774+
775+
METHOD_RETURN();
776+
}
777+
700778
inline void hash_base::s_static_hmac_sha3_512(const v8::FunctionCallbackInfo<v8::Value>& args)
701779
{
702780
obj_ptr<Digest_base> vr;

fibjs/src/crypto/hash.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class init_hashes {
3333
g_hashes->append("sha3_256");
3434
g_hashes->append("sha3_384");
3535
g_hashes->append("sha3_512");
36+
g_hashes->append("shake128");
37+
g_hashes->append("shake256");
3638
g_hashes->append("keccak256");
3739
g_hashes->append("keccak384");
3840
g_hashes->append("keccak512");
@@ -97,6 +99,8 @@ DEF_FUNC(ripemd160, RIPEMD160);
9799
DEF_FUNC(sha3_256, SHA3_256);
98100
DEF_FUNC(sha3_384, SHA3_384);
99101
DEF_FUNC(sha3_512, SHA3_512);
102+
DEF_FUNC(shake128, SHAKE128);
103+
DEF_FUNC(shake256, SHAKE256);
100104
DEF_FUNC(keccak256, KECCAK256);
101105
DEF_FUNC(keccak384, KECCAK384);
102106
DEF_FUNC(keccak512, KECCAK512);

fibjs/src/crypto/md_api.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ namespace fibjs {
1616
extern mbedtls_md_info_x mbedtls_sha3_256_info;
1717
extern mbedtls_md_info_x mbedtls_sha3_384_info;
1818
extern mbedtls_md_info_x mbedtls_sha3_512_info;
19+
extern mbedtls_md_info_x mbedtls_shake128_info;
20+
extern mbedtls_md_info_x mbedtls_shake256_info;
1921
extern mbedtls_md_info_x mbedtls_keccak256_info;
2022
extern mbedtls_md_info_x mbedtls_keccak384_info;
2123
extern mbedtls_md_info_x mbedtls_keccak512_info;
@@ -28,6 +30,8 @@ static mbedtls_md_info_x* md_infos[] = {
2830
&mbedtls_sha3_256_info,
2931
&mbedtls_sha3_384_info,
3032
&mbedtls_sha3_512_info,
33+
&mbedtls_shake128_info,
34+
&mbedtls_shake256_info,
3135
&mbedtls_keccak256_info,
3236
&mbedtls_keccak384_info,
3337
&mbedtls_keccak512_info,

fibjs/src/crypto/md_api.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@
77
#define MBEDTLS_MD_SHA3_256 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 1)
88
#define MBEDTLS_MD_SHA3_384 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 2)
99
#define MBEDTLS_MD_SHA3_512 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 3)
10-
#define MBEDTLS_MD_KECCAK256 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 4)
11-
#define MBEDTLS_MD_KECCAK384 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 5)
12-
#define MBEDTLS_MD_KECCAK512 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 6)
13-
#define MBEDTLS_MD_BLAKE2S mbedtls_md_type_t(MBEDTLS_MD_SM3 + 7)
14-
#define MBEDTLS_MD_BLAKE2B mbedtls_md_type_t(MBEDTLS_MD_SM3 + 8)
15-
#define MBEDTLS_MD_BLAKE2SP mbedtls_md_type_t(MBEDTLS_MD_SM3 + 9)
16-
#define MBEDTLS_MD_BLAKE2BP mbedtls_md_type_t(MBEDTLS_MD_SM3 + 10)
17-
#define MBEDTLS_MD_MAX mbedtls_md_type_t(MBEDTLS_MD_SM3 + 11)
10+
#define MBEDTLS_MD_SHAKE128 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 4)
11+
#define MBEDTLS_MD_SHAKE256 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 5)
12+
#define MBEDTLS_MD_KECCAK256 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 6)
13+
#define MBEDTLS_MD_KECCAK384 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 7)
14+
#define MBEDTLS_MD_KECCAK512 mbedtls_md_type_t(MBEDTLS_MD_SM3 + 8)
15+
#define MBEDTLS_MD_BLAKE2S mbedtls_md_type_t(MBEDTLS_MD_SM3 + 9)
16+
#define MBEDTLS_MD_BLAKE2B mbedtls_md_type_t(MBEDTLS_MD_SM3 + 10)
17+
#define MBEDTLS_MD_BLAKE2SP mbedtls_md_type_t(MBEDTLS_MD_SM3 + 11)
18+
#define MBEDTLS_MD_BLAKE2BP mbedtls_md_type_t(MBEDTLS_MD_SM3 + 12)
19+
#define MBEDTLS_MD_MAX mbedtls_md_type_t(MBEDTLS_MD_SM3 + 13)
1820

1921
namespace fibjs {
2022

fibjs/src/crypto/md_shake.cpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
/*
2+
* md_sha3.cpp
3+
*
4+
* Created on: Aug 16, 2023
5+
* Author: lion
6+
*/
7+
8+
#define MBEDTLS_ALLOW_PRIVATE_ACCESS
9+
10+
#include "object.h"
11+
#include <string.h>
12+
#include "fips202.h"
13+
#include "md_api.h"
14+
15+
namespace fibjs {
16+
17+
static int _start_128(mbedtls_md_context_t* ctx)
18+
{
19+
shake128_inc_init((shake128incctx*)&ctx->md_ctx);
20+
return 0;
21+
}
22+
23+
static int _start_256(mbedtls_md_context_t* ctx)
24+
{
25+
shake256_inc_init((shake256incctx*)&ctx->md_ctx);
26+
return 0;
27+
}
28+
29+
static int _update_128(mbedtls_md_context_t* ctx, const unsigned char* input, size_t ilen)
30+
{
31+
shake128_absorb((shake128ctx*)&ctx->md_ctx, input, ilen);
32+
return 0;
33+
}
34+
35+
static int _update_256(mbedtls_md_context_t* ctx, const unsigned char* input, size_t ilen)
36+
{
37+
shake256_absorb((shake256ctx*)&ctx->md_ctx, input, ilen);
38+
return 0;
39+
}
40+
41+
static int _finish_128(mbedtls_md_context_t* ctx, unsigned char* output)
42+
{
43+
size_t outlen = 16;
44+
size_t nblocks = outlen / SHAKE128_RATE;
45+
uint8_t t[SHAKE128_RATE];
46+
47+
shake128_squeezeblocks(output, nblocks, (shake128ctx*)&ctx->md_ctx);
48+
49+
output += nblocks * SHAKE128_RATE;
50+
outlen -= nblocks * SHAKE128_RATE;
51+
52+
if (outlen) {
53+
shake128_squeezeblocks(t, 1, (shake128ctx*)&ctx->md_ctx);
54+
for (size_t i = 0; i < outlen; ++i) {
55+
output[i] = t[i];
56+
}
57+
}
58+
59+
shake128_ctx_release((shake128ctx*)&ctx->md_ctx);
60+
ctx->md_ctx = NULL;
61+
return 0;
62+
}
63+
64+
static int _finish_256(mbedtls_md_context_t* ctx, unsigned char* output)
65+
{
66+
size_t outlen = 32;
67+
size_t nblocks = outlen / SHAKE256_RATE;
68+
uint8_t t[SHAKE256_RATE];
69+
70+
shake256_squeezeblocks(output, nblocks, (shake256ctx*)&ctx->md_ctx);
71+
72+
output += nblocks * SHAKE256_RATE;
73+
outlen -= nblocks * SHAKE256_RATE;
74+
75+
if (outlen) {
76+
shake256_squeezeblocks(t, 1, (shake256ctx*)&ctx->md_ctx);
77+
for (size_t i = 0; i < outlen; ++i) {
78+
output[i] = t[i];
79+
}
80+
}
81+
82+
shake256_ctx_release((shake256ctx*)&ctx->md_ctx);
83+
ctx->md_ctx = NULL;
84+
return 0;
85+
}
86+
87+
mbedtls_md_info_x mbedtls_shake128_info = {
88+
{ "SHAKE128",
89+
MBEDTLS_MD_SHAKE128,
90+
16,
91+
32 },
92+
0,
93+
_start_128,
94+
_update_128,
95+
_finish_128
96+
};
97+
98+
mbedtls_md_info_x mbedtls_shake256_info = {
99+
{ "SHAKE256",
100+
MBEDTLS_MD_SHAKE256,
101+
32,
102+
64 },
103+
0,
104+
_start_256,
105+
_update_256,
106+
_finish_256
107+
};
108+
109+
} /* namespace fibjs */

0 commit comments

Comments
 (0)
0