@pinkparrot/qsafe-mayo-wasm 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bridge/mayo1_bridge.c +43 -11
- package/bridge/mayo2_bridge.c +38 -6
- package/build_mayo1.ps1 +3 -2
- package/build_mayo2.ps1 +2 -2
- package/dist/mayo.browser.min.js +1096 -998
- package/dist/mayo1.cjs +0 -0
- package/dist/mayo1.js +0 -0
- package/dist/mayo2.cjs +0 -0
- package/dist/mayo2.js +0 -0
- package/dist/mayo_api.js +13 -4
- package/jsconfig.json +8 -0
- package/package.json +1 -1
- package/test/test.mjs +29 -12
package/bridge/mayo1_bridge.c
CHANGED
|
@@ -1,26 +1,58 @@
|
|
|
1
|
-
//
|
|
1
|
+
// mayo1_bridge.c - WASM bridge for MAYO-1
|
|
2
2
|
#include "../mayo-c/src/mayo_1/api.h"
|
|
3
|
+
#include <stdlib.h>
|
|
3
4
|
#include <string.h>
|
|
4
5
|
|
|
5
6
|
extern void randombytes_set_seed(const unsigned char *seed, size_t len);
|
|
6
7
|
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
8
|
+
// -- Persistent WASM heap buffers --
|
|
9
|
+
// Allocated once at init, reused across all sign/verify calls.
|
|
10
|
+
// Max message size: 1 MB. Adjust if needed.
|
|
11
|
+
#define MAX_MSG_SIZE (1024 * 1024)
|
|
12
|
+
|
|
13
|
+
static unsigned char *_msg_buf = NULL;
|
|
14
|
+
static unsigned char *_sig_buf = NULL;
|
|
15
|
+
static unsigned char *_sk_buf = NULL;
|
|
16
|
+
static unsigned char *_pk_buf = NULL;
|
|
17
|
+
|
|
18
|
+
// Must be called once before any sign/verify. Returns 0 on success.
|
|
19
|
+
int mayo_init_buffers(void) {
|
|
20
|
+
if (_msg_buf) return 0; // already initialized
|
|
21
|
+
_msg_buf = (unsigned char *)malloc(MAX_MSG_SIZE);
|
|
22
|
+
_sig_buf = (unsigned char *)malloc(CRYPTO_BYTES);
|
|
23
|
+
_sk_buf = (unsigned char *)malloc(CRYPTO_SECRETKEYBYTES);
|
|
24
|
+
_pk_buf = (unsigned char *)malloc(CRYPTO_PUBLICKEYBYTES);
|
|
25
|
+
if (!_msg_buf || !_sig_buf || !_sk_buf || !_pk_buf) return 1;
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
10
29
|
int keypair_from_seed(const unsigned char *seed,
|
|
11
|
-
|
|
30
|
+
unsigned char *cpk, unsigned char *csk) {
|
|
12
31
|
randombytes_set_seed(seed, CRYPTO_SECRETKEYBYTES);
|
|
13
32
|
return crypto_sign_keypair(cpk, csk);
|
|
14
33
|
}
|
|
15
34
|
|
|
35
|
+
// Uses pre-allocated buffers — no malloc/free on hot path.
|
|
36
|
+
// Returns 1 if msg is too large or buffers not initialized.
|
|
16
37
|
int sign(const unsigned char *msg, size_t msglen,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
38
|
+
const unsigned char *csk,
|
|
39
|
+
unsigned char *sig, size_t *siglen) {
|
|
40
|
+
if (!_msg_buf) return 1;
|
|
41
|
+
if (msglen > MAX_MSG_SIZE) return 1;
|
|
42
|
+
memcpy(_msg_buf, msg, msglen);
|
|
43
|
+
memcpy(_sk_buf, csk, CRYPTO_SECRETKEYBYTES);
|
|
44
|
+
int ret = crypto_sign_signature(_sig_buf, siglen, _msg_buf, msglen, _sk_buf);
|
|
45
|
+
if (ret == 0) memcpy(sig, _sig_buf, *siglen);
|
|
46
|
+
return ret;
|
|
20
47
|
}
|
|
21
48
|
|
|
22
49
|
int verify(const unsigned char *msg, size_t msglen,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
50
|
+
const unsigned char *sig,
|
|
51
|
+
const unsigned char *cpk) {
|
|
52
|
+
if (!_msg_buf) return 1;
|
|
53
|
+
if (msglen > MAX_MSG_SIZE) return 1;
|
|
54
|
+
memcpy(_msg_buf, msg, msglen);
|
|
55
|
+
memcpy(_sig_buf, sig, CRYPTO_BYTES);
|
|
56
|
+
memcpy(_pk_buf, cpk, CRYPTO_PUBLICKEYBYTES);
|
|
57
|
+
return crypto_sign_verify(_sig_buf, CRYPTO_BYTES, _msg_buf, msglen, _pk_buf);
|
|
26
58
|
}
|
package/bridge/mayo2_bridge.c
CHANGED
|
@@ -1,26 +1,58 @@
|
|
|
1
|
-
//
|
|
1
|
+
// mayo2_bridge.c - WASM bridge for MAYO-2
|
|
2
2
|
#include "../mayo-c/src/mayo_2/api.h"
|
|
3
|
+
#include <stdlib.h>
|
|
3
4
|
#include <string.h>
|
|
4
5
|
|
|
5
6
|
extern void randombytes_set_seed(const unsigned char *seed, size_t len);
|
|
6
7
|
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
8
|
+
// -- Persistent WASM heap buffers --
|
|
9
|
+
// Allocated once at init, reused across all sign/verify calls.
|
|
10
|
+
// Max message size: 1 MB. Adjust if needed.
|
|
11
|
+
#define MAX_MSG_SIZE (1024 * 1024)
|
|
12
|
+
|
|
13
|
+
static unsigned char *_msg_buf = NULL;
|
|
14
|
+
static unsigned char *_sig_buf = NULL;
|
|
15
|
+
static unsigned char *_sk_buf = NULL;
|
|
16
|
+
static unsigned char *_pk_buf = NULL;
|
|
17
|
+
|
|
18
|
+
// Must be called once before any sign/verify. Returns 0 on success.
|
|
19
|
+
int mayo_init_buffers(void) {
|
|
20
|
+
if (_msg_buf) return 0; // already initialized
|
|
21
|
+
_msg_buf = (unsigned char *)malloc(MAX_MSG_SIZE);
|
|
22
|
+
_sig_buf = (unsigned char *)malloc(CRYPTO_BYTES);
|
|
23
|
+
_sk_buf = (unsigned char *)malloc(CRYPTO_SECRETKEYBYTES);
|
|
24
|
+
_pk_buf = (unsigned char *)malloc(CRYPTO_PUBLICKEYBYTES);
|
|
25
|
+
if (!_msg_buf || !_sig_buf || !_sk_buf || !_pk_buf) return 1;
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
10
29
|
int keypair_from_seed(const unsigned char *seed,
|
|
11
30
|
unsigned char *cpk, unsigned char *csk) {
|
|
12
31
|
randombytes_set_seed(seed, CRYPTO_SECRETKEYBYTES);
|
|
13
32
|
return crypto_sign_keypair(cpk, csk);
|
|
14
33
|
}
|
|
15
34
|
|
|
35
|
+
// Uses pre-allocated buffers — no malloc/free on hot path.
|
|
36
|
+
// Returns 1 if msg is too large or buffers not initialized.
|
|
16
37
|
int sign(const unsigned char *msg, size_t msglen,
|
|
17
38
|
const unsigned char *csk,
|
|
18
39
|
unsigned char *sig, size_t *siglen) {
|
|
19
|
-
|
|
40
|
+
if (!_msg_buf) return 1;
|
|
41
|
+
if (msglen > MAX_MSG_SIZE) return 1;
|
|
42
|
+
memcpy(_msg_buf, msg, msglen);
|
|
43
|
+
memcpy(_sk_buf, csk, CRYPTO_SECRETKEYBYTES);
|
|
44
|
+
int ret = crypto_sign_signature(_sig_buf, siglen, _msg_buf, msglen, _sk_buf);
|
|
45
|
+
if (ret == 0) memcpy(sig, _sig_buf, *siglen);
|
|
46
|
+
return ret;
|
|
20
47
|
}
|
|
21
48
|
|
|
22
49
|
int verify(const unsigned char *msg, size_t msglen,
|
|
23
50
|
const unsigned char *sig,
|
|
24
51
|
const unsigned char *cpk) {
|
|
25
|
-
|
|
52
|
+
if (!_msg_buf) return 1;
|
|
53
|
+
if (msglen > MAX_MSG_SIZE) return 1;
|
|
54
|
+
memcpy(_msg_buf, msg, msglen);
|
|
55
|
+
memcpy(_sig_buf, sig, CRYPTO_BYTES);
|
|
56
|
+
memcpy(_pk_buf, cpk, CRYPTO_PUBLICKEYBYTES);
|
|
57
|
+
return crypto_sign_verify(_sig_buf, CRYPTO_BYTES, _msg_buf, msglen, _pk_buf);
|
|
26
58
|
}
|
package/build_mayo1.ps1
CHANGED
|
@@ -21,11 +21,12 @@ emcc `
|
|
|
21
21
|
-I ./mayo-c/src/generic `
|
|
22
22
|
-I ./mayo-c/src/mayo_1 `
|
|
23
23
|
-DENABLE_PARAMS_DYNAMIC `
|
|
24
|
-
-
|
|
24
|
+
-msimd128 `
|
|
25
|
+
-O3 `
|
|
25
26
|
-flto `
|
|
26
27
|
-o ./dist/mayo1.cjs `
|
|
27
28
|
-s WASM=1 `
|
|
28
|
-
-s "EXPORTED_FUNCTIONS=['_keypair_from_seed','_sign','_verify','_malloc','_free']" `
|
|
29
|
+
-s "EXPORTED_FUNCTIONS=['_mayo_init_buffers','_keypair_from_seed','_sign','_verify','_malloc','_free']" `
|
|
29
30
|
-s "EXPORTED_RUNTIME_METHODS=['ccall','cwrap','HEAPU8']" `
|
|
30
31
|
-s MODULARIZE=1 `
|
|
31
32
|
-s EXPORT_NAME="Mayo1Module" `
|
package/build_mayo2.ps1
CHANGED
|
@@ -21,11 +21,11 @@ emcc `
|
|
|
21
21
|
-I ./mayo-c/src/generic `
|
|
22
22
|
-I ./mayo-c/src/mayo_2 `
|
|
23
23
|
-DENABLE_PARAMS_DYNAMIC `
|
|
24
|
-
-
|
|
24
|
+
-O3 `
|
|
25
25
|
-flto `
|
|
26
26
|
-o ./dist/mayo2.cjs `
|
|
27
27
|
-s WASM=1 `
|
|
28
|
-
-s "EXPORTED_FUNCTIONS=['_keypair_from_seed','_sign','_verify','_malloc','_free']" `
|
|
28
|
+
-s "EXPORTED_FUNCTIONS=['_mayo_init_buffers','_keypair_from_seed','_sign','_verify','_malloc','_free']" `
|
|
29
29
|
-s "EXPORTED_RUNTIME_METHODS=['ccall','cwrap','HEAPU8']" `
|
|
30
30
|
-s MODULARIZE=1 `
|
|
31
31
|
-s EXPORT_NAME="Mayo2Module" `
|