@pulse-compute/crypto 1.0.0-beta.4 → 1.0.0-beta.6

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.
Files changed (95) hide show
  1. package/README.md +89 -8
  2. package/as/digest-text.as.ts +34 -0
  3. package/as/pulse-hmac-as.ts +7 -1
  4. package/conformance/digest-text.json +38 -0
  5. package/conformance/hs256.json +85 -0
  6. package/dist/contracts.d.ts +34 -12
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/contracts.js +9 -3
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/digest.d.ts +14 -0
  11. package/dist/digest.d.ts.map +1 -0
  12. package/dist/digest.js +17 -0
  13. package/dist/digest.js.map +1 -0
  14. package/dist/index.d.ts +6 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +20 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/internal/rsa.d.ts +58 -0
  19. package/dist/internal/rsa.d.ts.map +1 -0
  20. package/dist/internal/rsa.js +185 -0
  21. package/dist/internal/rsa.js.map +1 -0
  22. package/dist/internal/verification.d.ts +3 -3
  23. package/dist/internal/verification.d.ts.map +1 -1
  24. package/dist/internal/verification.js +2 -2
  25. package/dist/internal/verification.js.map +1 -1
  26. package/guests/es256-rustcrypto/README.md +43 -0
  27. package/guests/es256-rustcrypto/build.cjs +297 -0
  28. package/guests/es256-rustcrypto/prebuilt/es256-verifier.unoptimized.wasm +0 -0
  29. package/guests/es256-rustcrypto/prebuilt/es256-verifier.wasm +0 -0
  30. package/guests/es256-rustcrypto/probe/.cargo/config.toml +18 -0
  31. package/guests/es256-rustcrypto/probe/Cargo.lock +238 -0
  32. package/guests/es256-rustcrypto/probe/Cargo.toml +26 -0
  33. package/guests/es256-rustcrypto/probe/README.md +35 -0
  34. package/guests/es256-rustcrypto/probe/rust-toolchain.toml +5 -0
  35. package/guests/es256-rustcrypto/probe/src/lib.rs +108 -0
  36. package/guests/es256-rustcrypto/pulse.guest-unit.json +119 -0
  37. package/guests/es256-rustcrypto/source/.cargo/config.toml +18 -0
  38. package/guests/es256-rustcrypto/source/Cargo.lock +265 -0
  39. package/guests/es256-rustcrypto/source/Cargo.toml +23 -0
  40. package/guests/es256-rustcrypto/source/README.md +26 -0
  41. package/guests/es256-rustcrypto/source/bearssl/LICENSE.txt +21 -0
  42. package/guests/es256-rustcrypto/source/bearssl/UPSTREAM.json +49 -0
  43. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl.h +170 -0
  44. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_aead.h +1059 -0
  45. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_block.h +2618 -0
  46. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_ec.h +883 -0
  47. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_hash.h +1346 -0
  48. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_hmac.h +241 -0
  49. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_kdf.h +185 -0
  50. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_pem.h +294 -0
  51. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_prf.h +150 -0
  52. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_rand.h +397 -0
  53. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_rsa.h +1366 -0
  54. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_ssl.h +4296 -0
  55. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_x509.h +1397 -0
  56. package/guests/es256-rustcrypto/source/bearssl/src/codec/ccopy.c +44 -0
  57. package/guests/es256-rustcrypto/source/bearssl/src/codec/dec32be.c +38 -0
  58. package/guests/es256-rustcrypto/source/bearssl/src/codec/enc32be.c +38 -0
  59. package/guests/es256-rustcrypto/source/bearssl/src/config.h +229 -0
  60. package/guests/es256-rustcrypto/source/bearssl/src/inner.h +2532 -0
  61. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_add.c +46 -0
  62. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_bitlen.c +44 -0
  63. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decmod.c +124 -0
  64. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decode.c +57 -0
  65. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decred.c +103 -0
  66. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_encode.c +79 -0
  67. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_fmont.c +60 -0
  68. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_iszero.c +39 -0
  69. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_moddiv.c +488 -0
  70. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_modpow.c +65 -0
  71. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_modpow2.c +160 -0
  72. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_montmul.c +93 -0
  73. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_mulacc.c +61 -0
  74. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_muladd.c +157 -0
  75. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_ninv31.c +39 -0
  76. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_reduce.c +66 -0
  77. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_rshift.c +47 -0
  78. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_sub.c +46 -0
  79. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_tmont.c +36 -0
  80. package/guests/es256-rustcrypto/source/bearssl/src/int/i32_div32.c +56 -0
  81. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_i31_priv.c +203 -0
  82. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_i31_pub.c +106 -0
  83. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
  84. package/guests/es256-rustcrypto/source/build.rs +38 -0
  85. package/guests/es256-rustcrypto/source/freestanding/string.h +8 -0
  86. package/guests/es256-rustcrypto/source/rs256.c +103 -0
  87. package/guests/es256-rustcrypto/source/rust-toolchain.toml +5 -0
  88. package/guests/es256-rustcrypto/source/src/lib.rs +308 -0
  89. package/package.json +22 -4
  90. package/pulse.package.json +64 -0
  91. package/pulsewasm.compiler.cjs +89 -0
  92. package/pulsewasm.manifest.cjs +15 -0
  93. package/pulsewasm.native.cjs +79 -7
  94. package/src/provider.cjs +141 -2
  95. package/src/provider.d.cts +6 -0
@@ -0,0 +1,297 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const assert = require('node:assert/strict');
5
+ const childProcess = require('node:child_process');
6
+ const fs = require('node:fs');
7
+ const os = require('node:os');
8
+ const path = require('node:path');
9
+
10
+ const unitRoot = __dirname;
11
+ const sourceDirectory = path.join(unitRoot, 'source');
12
+ const prebuiltDirectory = path.join(unitRoot, 'prebuilt');
13
+ const manifestFile = path.join(unitRoot, 'pulse.guest-unit.json');
14
+ const repoRoot = path.resolve(unitRoot, '..', '..', '..', '..');
15
+ const {
16
+ fileRecord,
17
+ sha256,
18
+ sourceTreeRecord,
19
+ stableJson,
20
+ } = require(path.join(
21
+ repoRoot,
22
+ 'wasm/packages/wasm-guest-link/src/files.js',
23
+ ));
24
+ const {
25
+ binaryenIdentity,
26
+ runTool,
27
+ } = require(path.join(
28
+ repoRoot,
29
+ 'wasm/packages/wasm-guest-link/src/toolchain.js',
30
+ ));
31
+ const {
32
+ optimizationPostures,
33
+ } = require(path.join(
34
+ repoRoot,
35
+ 'wasm/packages/wasm-guest-link/src/constants.js',
36
+ ));
37
+
38
+ const EXPECTED_RUSTC = '1.97.1 (8bab26f4f 2026-07-14)';
39
+ const EXPECTED_CARGO = '1.97.1 (c980f4866 2026-06-30)';
40
+ const TARGET = 'wasm32v1-none';
41
+ const CRATE_STEM = 'pulse_es256_rustcrypto_verifier.wasm';
42
+ const BUILD_IDENTITY = 'pulse.crypto.es256-rs256.build.v3';
43
+
44
+ function usage() {
45
+ process.stderr.write('Usage: node build.cjs (--write|--check)\n');
46
+ process.exitCode = 2;
47
+ }
48
+
49
+ function run(file, args, options = {}) {
50
+ const result = childProcess.spawnSync(file, args, {
51
+ cwd: options.cwd || sourceDirectory,
52
+ env: options.env || process.env,
53
+ encoding: 'utf8',
54
+ maxBuffer: 16 * 1024 * 1024,
55
+ shell: false,
56
+ timeout: options.timeoutMs || 300_000,
57
+ });
58
+ if (result.error || result.status !== 0) {
59
+ throw new Error(
60
+ `${path.basename(file)} failed (${result.status}): ` +
61
+ `${String(result.stderr || result.error || '').trim()}`,
62
+ );
63
+ }
64
+ return String(result.stdout || '').trim();
65
+ }
66
+
67
+ function version(executable, kind) {
68
+ const prefix = `${kind} `;
69
+ const output = run(executable, ['--version'], { timeoutMs: 30_000 });
70
+ if (!output.startsWith(prefix)) {
71
+ throw new Error(`Unexpected ${kind} version output.`);
72
+ }
73
+ return output.slice(prefix.length);
74
+ }
75
+
76
+ function buildOnce(cargo, sequence) {
77
+ const directory = fs.mkdtempSync(
78
+ path.join(os.tmpdir(), `pulse-es256-g1-build-${sequence}-`),
79
+ );
80
+ const targetDirectory = path.join(directory, 'target');
81
+ const rawFile = path.join(
82
+ targetDirectory,
83
+ TARGET,
84
+ 'release',
85
+ CRATE_STEM,
86
+ );
87
+ const optimizedFile = path.join(directory, 'es256-verifier.wasm');
88
+ const environment = {
89
+ ...process.env,
90
+ CARGO_TARGET_DIR: targetDirectory,
91
+ };
92
+ try {
93
+ run(cargo, [
94
+ 'build',
95
+ '--manifest-path',
96
+ path.join(sourceDirectory, 'Cargo.toml'),
97
+ '--locked',
98
+ '--release',
99
+ '--target',
100
+ TARGET,
101
+ ], {
102
+ env: environment,
103
+ });
104
+ runTool('wasm-opt', [
105
+ rawFile,
106
+ ...optimizationPostures['native-size'],
107
+ '-o',
108
+ optimizedFile,
109
+ ], {
110
+ cwd: directory,
111
+ timeoutMs: 120_000,
112
+ });
113
+ return Object.freeze({
114
+ directory,
115
+ raw: fs.readFileSync(rawFile),
116
+ optimized: fs.readFileSync(optimizedFile),
117
+ });
118
+ } catch (error) {
119
+ fs.rmSync(directory, { recursive: true, force: true });
120
+ throw error;
121
+ }
122
+ }
123
+
124
+ function manifest(source, lock, artifact, rustc, cargo, binaryen) {
125
+ const wasmOpt = binaryen.tools.find((entry) => entry.name === 'wasm-opt');
126
+ assert.ok(wasmOpt);
127
+ const buildScript = fs.readFileSync(__filename);
128
+ // Historical source-selection attestation is pinned in the reviewed guest
129
+ // catalog. Reconstruction must not depend on ignored local evidence files.
130
+ const g0SourceDecisionSha256 = '58db9e3587ace112a8864c7916f603d8773dce653deafb7d743c0dc1f4d62d63';
131
+ return Object.freeze({
132
+ version: 'pulse.guest-unit.v2',
133
+ id: 'pulse.crypto.es256.rustcrypto-p256.v1',
134
+ module: 'pulse_crypto_es256',
135
+ owner: '@pulse-compute/crypto',
136
+ packageVersion: '1.0.0-beta.6',
137
+ abi: 'pulse.crypto.es256-rs256.verify-and-sign.v3',
138
+ origin: 'package-prebuilt',
139
+ artifact: Object.freeze({
140
+ file: 'prebuilt/es256-verifier.wasm',
141
+ bytes: artifact.bytes,
142
+ sha256: artifact.sha256,
143
+ }),
144
+ source: Object.freeze({
145
+ included: true,
146
+ directory: 'source',
147
+ treeSha256: source.sha256,
148
+ }),
149
+ toolchain: Object.freeze({
150
+ kind: 'rust-cargo',
151
+ target: TARGET,
152
+ locked: true,
153
+ versions: Object.freeze({
154
+ rustc,
155
+ cargo,
156
+ zig: '0.13.0',
157
+ binaryen: binaryen.version,
158
+ }),
159
+ }),
160
+ imports: Object.freeze([Object.freeze({
161
+ module: 'env',
162
+ name: 'memory',
163
+ kind: 'memory',
164
+ type: Object.freeze({
165
+ minimumPages: 32,
166
+ maximumPages: 32,
167
+ shared: false,
168
+ }),
169
+ })]),
170
+ exports: Object.freeze(['pulse_crypto_es256_sign', 'pulse_crypto_es256_verify', 'pulse_crypto_rs256_sign', 'pulse_crypto_rs256_verify'].map(name => Object.freeze({
171
+ name,
172
+ kind: 'function',
173
+ parameters: Object.freeze(['i32', 'i32']),
174
+ results: Object.freeze(['i32']),
175
+ role: 'abi',
176
+ }))),
177
+ memory: Object.freeze({
178
+ identity: 'pulse.guest-memory.invocation-frame.v2',
179
+ import: 'env.memory',
180
+ owner: 'link-stage',
181
+ }),
182
+ start: Object.freeze({
183
+ policy: 'forbidden',
184
+ }),
185
+ features: Object.freeze({
186
+ baseline: 'mvp',
187
+ allowed: Object.freeze([]),
188
+ required: Object.freeze([]),
189
+ }),
190
+ provenance: Object.freeze({
191
+ packageManifest: '../../package.json',
192
+ lockfile: 'source/Cargo.lock',
193
+ reproducibleSourceIncluded: true,
194
+ cargoLockSha256: lock.sha256,
195
+ sourceTreeSha256: source.sha256,
196
+ reconstructionCommandIdentity: BUILD_IDENTITY,
197
+ buildScript: 'build.cjs',
198
+ buildScriptSha256: sha256(buildScript),
199
+ optimizationPosture: 'native-size',
200
+ binaryenWasmOptSha256: wasmOpt.sha256,
201
+ g0SourceDecision:
202
+ '../../../../wasm/.test-results/jwt-g0/es256-source-decision.json',
203
+ g0SourceDecisionSha256,
204
+ }),
205
+ });
206
+ }
207
+
208
+ function compareBytes(label, actual, expectedFile) {
209
+ assert.equal(fs.existsSync(expectedFile), true, `${label} is missing`);
210
+ assert.deepEqual(actual, fs.readFileSync(expectedFile), `${label} differs`);
211
+ }
212
+
213
+ function main() {
214
+ const mode = process.argv[2];
215
+ if (!['--write', '--check'].includes(mode) || process.argv.length !== 3) {
216
+ usage();
217
+ return;
218
+ }
219
+ assert.equal(fs.existsSync(path.join(sourceDirectory, 'target')), false,
220
+ 'Guest source must be clean: set CARGO_TARGET_DIR outside source for direct Cargo experiments.');
221
+ const upstreamRoot = path.join(sourceDirectory, 'bearssl');
222
+ const upstream = JSON.parse(fs.readFileSync(path.join(upstreamRoot, 'UPSTREAM.json'), 'utf8'));
223
+ assert.equal(upstream.version, '0.6');
224
+ assert.equal(upstream.archiveSha256, '6705bba1714961b41a728dfc5debbe348d2966c117649392f8c8139efc83ff14');
225
+ for (const [file, expected] of Object.entries(upstream.files)) {
226
+ assert.equal(sha256(fs.readFileSync(path.join(upstreamRoot, file))), expected, `Vendored upstream file differs: ${file}`);
227
+ }
228
+ const cargoExecutable = process.env.CARGO || 'cargo';
229
+ const rustcExecutable = process.env.RUSTC || 'rustc';
230
+ const rustcVersion = version(rustcExecutable, 'rustc');
231
+ const cargoVersion = version(cargoExecutable, 'cargo');
232
+ assert.equal(rustcVersion, EXPECTED_RUSTC);
233
+ assert.equal(cargoVersion, EXPECTED_CARGO);
234
+
235
+ let first;
236
+ let second;
237
+ try {
238
+ first = buildOnce(cargoExecutable, 'a');
239
+ second = buildOnce(cargoExecutable, 'b');
240
+ assert.deepEqual(first.raw, second.raw, 'Cargo release bytes differ');
241
+ assert.deepEqual(
242
+ first.optimized,
243
+ second.optimized,
244
+ 'Binaryen optimized bytes differ',
245
+ );
246
+ const source = sourceTreeRecord(sourceDirectory);
247
+ const lock = fileRecord(path.join(sourceDirectory, 'Cargo.lock'));
248
+ const artifact = Object.freeze({
249
+ bytes: first.optimized.length,
250
+ sha256: sha256(first.optimized),
251
+ });
252
+ const expectedManifest = stableJson(manifest(
253
+ source,
254
+ lock,
255
+ artifact,
256
+ rustcVersion,
257
+ cargoVersion,
258
+ binaryenIdentity(),
259
+ ));
260
+ const rawFile = path.join(
261
+ prebuiltDirectory,
262
+ 'es256-verifier.unoptimized.wasm',
263
+ );
264
+ const optimizedFile = path.join(
265
+ prebuiltDirectory,
266
+ 'es256-verifier.wasm',
267
+ );
268
+
269
+ if (mode === '--write') {
270
+ fs.mkdirSync(prebuiltDirectory, { recursive: true });
271
+ fs.writeFileSync(rawFile, first.raw);
272
+ fs.writeFileSync(optimizedFile, first.optimized);
273
+ fs.writeFileSync(manifestFile, expectedManifest);
274
+ } else {
275
+ compareBytes('unoptimized prebuilt', first.raw, rawFile);
276
+ compareBytes('optimized prebuilt', first.optimized, optimizedFile);
277
+ assert.equal(
278
+ fs.readFileSync(manifestFile, 'utf8'),
279
+ expectedManifest,
280
+ 'guest manifest differs',
281
+ );
282
+ }
283
+
284
+ process.stdout.write(
285
+ `ok - ${BUILD_IDENTITY} reproduced ${artifact.sha256}\n`,
286
+ );
287
+ } finally {
288
+ if (first) {
289
+ fs.rmSync(first.directory, { recursive: true, force: true });
290
+ }
291
+ if (second) {
292
+ fs.rmSync(second.directory, { recursive: true, force: true });
293
+ }
294
+ }
295
+ }
296
+
297
+ main();
@@ -0,0 +1,18 @@
1
+ [build]
2
+ target = "wasm32v1-none"
3
+
4
+ [target.wasm32v1-none]
5
+ rustflags = [
6
+ "-C",
7
+ "link-arg=--import-memory",
8
+ "-C",
9
+ "link-arg=--initial-memory=2097152",
10
+ "-C",
11
+ "link-arg=--max-memory=2097152",
12
+ "-C",
13
+ "link-arg=--stack-first",
14
+ "-C",
15
+ "link-arg=-zstack-size=65536",
16
+ "-C",
17
+ "link-arg=--global-base=131072",
18
+ ]
@@ -0,0 +1,238 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "base16ct"
7
+ version = "0.2.0"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
10
+
11
+ [[package]]
12
+ name = "block-buffer"
13
+ version = "0.10.4"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
16
+ dependencies = [
17
+ "generic-array",
18
+ ]
19
+
20
+ [[package]]
21
+ name = "cfg-if"
22
+ version = "1.0.4"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
25
+
26
+ [[package]]
27
+ name = "const-oid"
28
+ version = "0.9.6"
29
+ source = "registry+https://github.com/rust-lang/crates.io-index"
30
+ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
31
+
32
+ [[package]]
33
+ name = "cpufeatures"
34
+ version = "0.2.17"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
37
+ dependencies = [
38
+ "libc",
39
+ ]
40
+
41
+ [[package]]
42
+ name = "crypto-bigint"
43
+ version = "0.5.5"
44
+ source = "registry+https://github.com/rust-lang/crates.io-index"
45
+ checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
46
+ dependencies = [
47
+ "generic-array",
48
+ "rand_core",
49
+ "subtle",
50
+ "zeroize",
51
+ ]
52
+
53
+ [[package]]
54
+ name = "crypto-common"
55
+ version = "0.1.6"
56
+ source = "registry+https://github.com/rust-lang/crates.io-index"
57
+ checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
58
+ dependencies = [
59
+ "generic-array",
60
+ "typenum",
61
+ ]
62
+
63
+ [[package]]
64
+ name = "der"
65
+ version = "0.7.10"
66
+ source = "registry+https://github.com/rust-lang/crates.io-index"
67
+ checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
68
+ dependencies = [
69
+ "const-oid",
70
+ "zeroize",
71
+ ]
72
+
73
+ [[package]]
74
+ name = "digest"
75
+ version = "0.10.7"
76
+ source = "registry+https://github.com/rust-lang/crates.io-index"
77
+ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
78
+ dependencies = [
79
+ "block-buffer",
80
+ "crypto-common",
81
+ ]
82
+
83
+ [[package]]
84
+ name = "ecdsa"
85
+ version = "0.16.9"
86
+ source = "registry+https://github.com/rust-lang/crates.io-index"
87
+ checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca"
88
+ dependencies = [
89
+ "elliptic-curve",
90
+ "signature",
91
+ ]
92
+
93
+ [[package]]
94
+ name = "elliptic-curve"
95
+ version = "0.13.8"
96
+ source = "registry+https://github.com/rust-lang/crates.io-index"
97
+ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47"
98
+ dependencies = [
99
+ "base16ct",
100
+ "crypto-bigint",
101
+ "digest",
102
+ "ff",
103
+ "generic-array",
104
+ "group",
105
+ "rand_core",
106
+ "sec1",
107
+ "subtle",
108
+ "zeroize",
109
+ ]
110
+
111
+ [[package]]
112
+ name = "ff"
113
+ version = "0.13.1"
114
+ source = "registry+https://github.com/rust-lang/crates.io-index"
115
+ checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393"
116
+ dependencies = [
117
+ "rand_core",
118
+ "subtle",
119
+ ]
120
+
121
+ [[package]]
122
+ name = "generic-array"
123
+ version = "0.14.9"
124
+ source = "registry+https://github.com/rust-lang/crates.io-index"
125
+ checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2"
126
+ dependencies = [
127
+ "typenum",
128
+ "version_check",
129
+ "zeroize",
130
+ ]
131
+
132
+ [[package]]
133
+ name = "group"
134
+ version = "0.13.0"
135
+ source = "registry+https://github.com/rust-lang/crates.io-index"
136
+ checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
137
+ dependencies = [
138
+ "ff",
139
+ "rand_core",
140
+ "subtle",
141
+ ]
142
+
143
+ [[package]]
144
+ name = "libc"
145
+ version = "0.2.189"
146
+ source = "registry+https://github.com/rust-lang/crates.io-index"
147
+ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
148
+
149
+ [[package]]
150
+ name = "p256"
151
+ version = "0.13.2"
152
+ source = "registry+https://github.com/rust-lang/crates.io-index"
153
+ checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
154
+ dependencies = [
155
+ "elliptic-curve",
156
+ "primeorder",
157
+ ]
158
+
159
+ [[package]]
160
+ name = "primeorder"
161
+ version = "0.13.6"
162
+ source = "registry+https://github.com/rust-lang/crates.io-index"
163
+ checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6"
164
+ dependencies = [
165
+ "elliptic-curve",
166
+ ]
167
+
168
+ [[package]]
169
+ name = "pulse-es256-rustcrypto-probe"
170
+ version = "0.0.0"
171
+ dependencies = [
172
+ "ecdsa",
173
+ "p256",
174
+ "sha2",
175
+ ]
176
+
177
+ [[package]]
178
+ name = "rand_core"
179
+ version = "0.6.4"
180
+ source = "registry+https://github.com/rust-lang/crates.io-index"
181
+ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
182
+
183
+ [[package]]
184
+ name = "sec1"
185
+ version = "0.7.3"
186
+ source = "registry+https://github.com/rust-lang/crates.io-index"
187
+ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
188
+ dependencies = [
189
+ "base16ct",
190
+ "der",
191
+ "generic-array",
192
+ "subtle",
193
+ "zeroize",
194
+ ]
195
+
196
+ [[package]]
197
+ name = "sha2"
198
+ version = "0.10.9"
199
+ source = "registry+https://github.com/rust-lang/crates.io-index"
200
+ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
201
+ dependencies = [
202
+ "cfg-if",
203
+ "cpufeatures",
204
+ "digest",
205
+ ]
206
+
207
+ [[package]]
208
+ name = "signature"
209
+ version = "2.2.0"
210
+ source = "registry+https://github.com/rust-lang/crates.io-index"
211
+ checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
212
+ dependencies = [
213
+ "rand_core",
214
+ ]
215
+
216
+ [[package]]
217
+ name = "subtle"
218
+ version = "2.6.1"
219
+ source = "registry+https://github.com/rust-lang/crates.io-index"
220
+ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
221
+
222
+ [[package]]
223
+ name = "typenum"
224
+ version = "1.20.1"
225
+ source = "registry+https://github.com/rust-lang/crates.io-index"
226
+ checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
227
+
228
+ [[package]]
229
+ name = "version_check"
230
+ version = "0.9.5"
231
+ source = "registry+https://github.com/rust-lang/crates.io-index"
232
+ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
233
+
234
+ [[package]]
235
+ name = "zeroize"
236
+ version = "1.9.0"
237
+ source = "registry+https://github.com/rust-lang/crates.io-index"
238
+ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
@@ -0,0 +1,26 @@
1
+ [package]
2
+ name = "pulse-es256-rustcrypto-probe"
3
+ version = "0.0.0"
4
+ edition = "2021"
5
+ publish = false
6
+ license = "Apache-2.0"
7
+
8
+ [lib]
9
+ crate-type = ["cdylib"]
10
+
11
+ [dependencies]
12
+ ecdsa = { version = "=0.16.9", default-features = false, features = ["arithmetic", "hazmat"] }
13
+ p256 = { version = "=0.13.2", default-features = false, features = ["arithmetic"] }
14
+ sha2 = { version = "=0.10.9", default-features = false }
15
+
16
+ [profile.dev]
17
+ panic = "abort"
18
+
19
+ [profile.release]
20
+ codegen-units = 1
21
+ debug = false
22
+ incremental = false
23
+ lto = true
24
+ opt-level = "z"
25
+ panic = "abort"
26
+ strip = "symbols"
@@ -0,0 +1,35 @@
1
+ # ES256 RustCrypto dependency probe
2
+
3
+ This maintainer-only G0 probe freezes the dependency and feature closure for
4
+ the first Pulse ES256 verifier candidate. It is not the production guest,
5
+ package prebuilt, application build path, or public ABI. G1 owns the real
6
+ single-export verifier and complete private-frame validation.
7
+
8
+ The selected closure deliberately avoids the aggregate `p256/ecdsa` feature.
9
+ It uses:
10
+
11
+ - `p256` `0.13.2`: `arithmetic` only;
12
+ - `ecdsa` `0.16.9`: `arithmetic` and `hazmat` only;
13
+ - `sha2` `0.10.9`: default features disabled.
14
+
15
+ `std`, `alloc`, `ecdsa/signing`, `ecdsa/verifying`, `rfc6979`, `pem`, `pkcs8`,
16
+ `serde`, JWK support, randomness, and `getrandom` are not enabled. The probe
17
+ calls the generic prehashed verification primitive directly so the high-level
18
+ signing feature and deterministic-signing dependency remain outside the
19
+ selected graph. Its one unsafe block is the probe-only raw-memory adapter;
20
+ the selected RustCrypto crates forbid unsafe code in their crate roots.
21
+
22
+ The checked-in lockfile is authoritative. The pinned toolchain target is
23
+ `wasm32v1-none`. The linker imports only fixed `env.memory` with 32 initial and
24
+ maximum pages, reserves the first 64 KiB for the Rust stack, and places static
25
+ data at 128 KiB.
26
+
27
+ Builds are maintainer-only:
28
+
29
+ ```bash
30
+ cargo build
31
+ cargo build --release
32
+ ```
33
+
34
+ Ordinary Pulse application builds must consume a reviewed package prebuilt.
35
+ They must never compile this source.
@@ -0,0 +1,5 @@
1
+ [toolchain]
2
+ channel = "1.97.1"
3
+ components = []
4
+ profile = "minimal"
5
+ targets = ["wasm32v1-none"]