@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.
@@ -1,26 +1,58 @@
1
- // mayo_bridge.c - WASM bridge for MAYO-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
- // Derives keypair deterministically from a 24-byte seed.
8
- // randombytes_inject.c will consume the seed on the first randombytes() call
9
- // made internally by crypto_sign_keypair subsequent calls fall back to system entropy.
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
- unsigned char *cpk, unsigned char *csk) {
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
- const unsigned char *csk,
18
- unsigned char *sig, size_t *siglen) {
19
- return crypto_sign_signature(sig, siglen, msg, msglen, csk);
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
- const unsigned char *sig,
24
- const unsigned char *cpk) {
25
- return crypto_sign_verify(sig, CRYPTO_BYTES, msg, msglen, cpk);
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
  }
@@ -1,26 +1,58 @@
1
- // mayo_bridge.c - WASM bridge for MAYO-2
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
- // Derives keypair deterministically from a 24-byte seed.
8
- // randombytes_inject.c will consume the seed on the first randombytes() call
9
- // made internally by crypto_sign_keypair subsequent calls fall back to system entropy.
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
- return crypto_sign_signature(sig, siglen, msg, msglen, csk);
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
- return crypto_sign_verify(sig, CRYPTO_BYTES, msg, msglen, 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/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
- -Oz `
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
- -Oz `
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" `