@openzeppelin/miden-multisig-client 0.13.1 → 0.13.2
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/README.md +98 -119
- package/dist/account/builder.d.ts +18 -0
- package/dist/account/builder.d.ts.map +1 -1
- package/dist/account/builder.js +59 -29
- package/dist/account/builder.js.map +1 -1
- package/dist/account/builder.test.js +108 -32
- package/dist/account/builder.test.js.map +1 -1
- package/dist/account/index.d.ts +1 -1
- package/dist/account/index.d.ts.map +1 -1
- package/dist/account/index.js +1 -1
- package/dist/account/index.js.map +1 -1
- package/dist/account/masm/account-components/auth.d.ts +5 -0
- package/dist/account/masm/account-components/auth.d.ts.map +1 -0
- package/dist/account/masm/account-components/auth.js +67 -0
- package/dist/account/masm/account-components/auth.js.map +1 -0
- package/dist/account/masm/auth.d.ts +5 -0
- package/dist/account/masm/auth.d.ts.map +1 -0
- package/dist/account/masm/auth.js +1395 -0
- package/dist/account/masm/auth.js.map +1 -0
- package/dist/account/masm/index.d.ts +3 -0
- package/dist/account/masm/index.d.ts.map +1 -0
- package/dist/account/masm/index.js +5 -0
- package/dist/account/masm/index.js.map +1 -0
- package/dist/account/masm.d.ts +1 -4
- package/dist/account/masm.d.ts.map +1 -1
- package/dist/account/masm.js +3 -1034
- package/dist/account/masm.js.map +1 -1
- package/dist/account/storage.d.ts +2 -2
- package/dist/account/storage.d.ts.map +1 -1
- package/dist/account/storage.js +18 -16
- package/dist/account/storage.js.map +1 -1
- package/dist/client.d.ts +67 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +73 -22
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +31 -32
- package/dist/client.test.js.map +1 -1
- package/dist/index.d.ts +54 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +53 -9
- package/dist/index.js.map +1 -1
- package/dist/inspector.d.ts +32 -6
- package/dist/inspector.d.ts.map +1 -1
- package/dist/inspector.js +58 -23
- package/dist/inspector.js.map +1 -1
- package/dist/inspector.test.js +18 -18
- package/dist/inspector.test.js.map +1 -1
- package/dist/multisig/proposal/execution.d.ts +4 -4
- package/dist/multisig/proposal/execution.d.ts.map +1 -1
- package/dist/multisig/proposal/execution.js +42 -31
- package/dist/multisig/proposal/execution.js.map +1 -1
- package/dist/multisig/proposal/parser.d.ts +3 -3
- package/dist/multisig/proposal/parser.d.ts.map +1 -1
- package/dist/multisig/proposal/parser.js +23 -23
- package/dist/multisig/proposal/parser.js.map +1 -1
- package/dist/multisig/signing.d.ts +3 -3
- package/dist/multisig/signing.d.ts.map +1 -1
- package/dist/multisig/signing.js +3 -3
- package/dist/multisig/signing.js.map +1 -1
- package/dist/multisig.d.ts +188 -48
- package/dist/multisig.d.ts.map +1 -1
- package/dist/multisig.js +650 -308
- package/dist/multisig.js.map +1 -1
- package/dist/multisig.test.js +1680 -241
- package/dist/multisig.test.js.map +1 -1
- package/dist/procedures.d.ts +46 -24
- package/dist/procedures.d.ts.map +1 -1
- package/dist/procedures.js +46 -21
- package/dist/procedures.js.map +1 -1
- package/dist/proposal/factory.d.ts +18 -0
- package/dist/proposal/factory.d.ts.map +1 -0
- package/dist/proposal/factory.js +99 -0
- package/dist/proposal/factory.js.map +1 -0
- package/dist/proposal/metadata.d.ts +5 -12
- package/dist/proposal/metadata.d.ts.map +1 -1
- package/dist/proposal/metadata.js +118 -174
- package/dist/proposal/metadata.js.map +1 -1
- package/dist/proposal/signatures.d.ts +10 -0
- package/dist/proposal/signatures.d.ts.map +1 -0
- package/dist/proposal/signatures.js +54 -0
- package/dist/proposal/signatures.js.map +1 -0
- package/dist/signer.d.ts +2 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +2 -0
- package/dist/signer.js.map +1 -1
- package/dist/signers/ecdsa.d.ts +3 -0
- package/dist/signers/ecdsa.d.ts.map +1 -1
- package/dist/signers/ecdsa.js +8 -4
- package/dist/signers/ecdsa.js.map +1 -1
- package/dist/signers/ecdsa.test.d.ts +2 -0
- package/dist/signers/ecdsa.test.d.ts.map +1 -0
- package/dist/signers/ecdsa.test.js +65 -0
- package/dist/signers/ecdsa.test.js.map +1 -0
- package/dist/signers/falcon.d.ts +3 -0
- package/dist/signers/falcon.d.ts.map +1 -1
- package/dist/signers/falcon.js +8 -4
- package/dist/signers/falcon.js.map +1 -1
- package/dist/signers/falcon.test.js +12 -0
- package/dist/signers/falcon.test.js.map +1 -1
- package/dist/signers/miden-wallet.d.ts +3 -1
- package/dist/signers/miden-wallet.d.ts.map +1 -1
- package/dist/signers/miden-wallet.js +11 -2
- package/dist/signers/miden-wallet.js.map +1 -1
- package/dist/signers/miden-wallet.test.js +26 -0
- package/dist/signers/miden-wallet.test.js.map +1 -1
- package/dist/signers/para.d.ts +3 -3
- package/dist/signers/para.d.ts.map +1 -1
- package/dist/signers/para.js +15 -6
- package/dist/signers/para.js.map +1 -1
- package/dist/signers/para.test.js +39 -0
- package/dist/signers/para.test.js.map +1 -1
- package/dist/transaction/consumeNotes.d.ts.map +1 -1
- package/dist/transaction/consumeNotes.js +1 -0
- package/dist/transaction/consumeNotes.js.map +1 -1
- package/dist/transaction/index.d.ts +2 -1
- package/dist/transaction/index.d.ts.map +1 -1
- package/dist/transaction/index.js +2 -1
- package/dist/transaction/index.js.map +1 -1
- package/dist/transaction/options.d.ts +1 -1
- package/dist/transaction/options.d.ts.map +1 -1
- package/dist/transaction/p2id.d.ts +1 -0
- package/dist/transaction/p2id.d.ts.map +1 -1
- package/dist/transaction/p2id.js +9 -3
- package/dist/transaction/p2id.js.map +1 -1
- package/dist/transaction/updateGuardian.d.ts +7 -0
- package/dist/transaction/updateGuardian.d.ts.map +1 -0
- package/dist/transaction/{updatePsm.js → updateGuardian.js} +15 -29
- package/dist/transaction/updateGuardian.js.map +1 -0
- package/dist/transaction/updateProcedureThreshold.d.ts +9 -0
- package/dist/transaction/updateProcedureThreshold.d.ts.map +1 -0
- package/dist/transaction/updateProcedureThreshold.js +55 -0
- package/dist/transaction/updateProcedureThreshold.js.map +1 -0
- package/dist/transaction/updateSigners.d.ts.map +1 -1
- package/dist/transaction/updateSigners.js +5 -23
- package/dist/transaction/updateSigners.js.map +1 -1
- package/dist/transaction.d.ts +2 -1
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +2 -1
- package/dist/transaction.js.map +1 -1
- package/dist/types/proposal.d.ts +32 -15
- package/dist/types/proposal.d.ts.map +1 -1
- package/dist/types.d.ts +24 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/digest.d.ts +5 -0
- package/dist/utils/digest.d.ts.map +1 -1
- package/dist/utils/digest.js +34 -1
- package/dist/utils/digest.js.map +1 -1
- package/dist/utils/digest.test.d.ts +2 -0
- package/dist/utils/digest.test.d.ts.map +1 -0
- package/dist/utils/digest.test.js +48 -0
- package/dist/utils/digest.test.js.map +1 -0
- package/dist/utils/signature.d.ts +3 -1
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/signature.js +31 -6
- package/dist/utils/signature.js.map +1 -1
- package/dist/utils/word.test.js +1 -52
- package/dist/utils/word.test.js.map +1 -1
- package/masm/account_components/auth/multisig.masm +13 -0
- package/masm/account_components/auth/multisig_ecdsa.masm +13 -0
- package/masm/account_components/auth/multisig_guardian.masm +17 -0
- package/masm/account_components/auth/multisig_guardian_ecdsa.masm +17 -0
- package/masm/auth/guardian.masm +177 -0
- package/masm/auth/guardian_ecdsa.masm +178 -0
- package/masm/{multisig.masm → auth/multisig.masm} +149 -55
- package/masm/{multisig_ecdsa.masm → auth/multisig_ecdsa.masm} +148 -56
- package/package.json +11 -9
- package/src/account/builder.test.ts +165 -0
- package/src/account/builder.ts +71 -34
- package/src/account/index.ts +1 -1
- package/src/account/masm/account-components/auth.ts +70 -0
- package/src/account/masm/auth.ts +1398 -0
- package/src/account/masm/index.ts +5 -0
- package/src/account/masm.ts +3 -1040
- package/src/account/storage.ts +18 -16
- package/src/client.test.ts +31 -35
- package/src/client.ts +98 -26
- package/src/index.ts +84 -22
- package/src/inspector.test.ts +17 -17
- package/src/inspector.ts +63 -29
- package/src/multisig/proposal/execution.ts +66 -49
- package/src/multisig/proposal/parser.ts +26 -26
- package/src/multisig/signing.ts +4 -4
- package/src/multisig.test.ts +2097 -248
- package/src/multisig.ts +882 -388
- package/src/procedures.ts +50 -26
- package/src/proposal/factory.ts +171 -0
- package/src/proposal/metadata.ts +165 -0
- package/src/proposal/signatures.ts +68 -0
- package/src/signer.ts +2 -0
- package/src/signers/ecdsa.test.ts +80 -0
- package/src/signers/ecdsa.ts +15 -4
- package/src/signers/falcon.test.ts +19 -0
- package/src/signers/falcon.ts +16 -5
- package/src/signers/miden-wallet.test.ts +47 -0
- package/src/signers/miden-wallet.ts +18 -1
- package/src/signers/para.test.ts +57 -0
- package/src/signers/para.ts +26 -7
- package/src/transaction/consumeNotes.ts +1 -0
- package/src/transaction/index.ts +2 -2
- package/src/transaction/options.ts +1 -2
- package/src/transaction/p2id.test.ts +190 -0
- package/src/transaction/p2id.ts +11 -5
- package/src/transaction/rpoRandomCoin.test.ts +64 -0
- package/src/transaction/rpoRandomCoin.ts +24 -0
- package/src/transaction/{updatePsm.ts → updateGuardian.ts} +19 -32
- package/src/transaction/updateProcedureThreshold.ts +97 -0
- package/src/transaction/updateSigners.ts +12 -27
- package/src/transaction.ts +5 -3
- package/src/types/proposal.ts +43 -11
- package/src/types.ts +29 -11
- package/src/utils/digest.test.ts +55 -0
- package/src/utils/digest.ts +51 -1
- package/src/utils/signature.ts +47 -9
- package/src/utils/word.test.ts +1 -55
- package/dist/account.d.ts +0 -104
- package/dist/account.d.ts.map +0 -1
- package/dist/account.js +0 -136
- package/dist/account.js.map +0 -1
- package/dist/builder.d.ts +0 -54
- package/dist/builder.d.ts.map +0 -1
- package/dist/builder.js +0 -78
- package/dist/builder.js.map +0 -1
- package/dist/http.d.ts +0 -64
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -162
- package/dist/http.js.map +0 -1
- package/dist/keystore.d.ts +0 -65
- package/dist/keystore.d.ts.map +0 -1
- package/dist/keystore.js +0 -121
- package/dist/keystore.js.map +0 -1
- package/dist/miden.d.ts +0 -9
- package/dist/miden.d.ts.map +0 -1
- package/dist/miden.js +0 -26
- package/dist/miden.js.map +0 -1
- package/dist/multisig/metadata.d.ts +0 -18
- package/dist/multisig/metadata.d.ts.map +0 -1
- package/dist/multisig/metadata.js +0 -100
- package/dist/multisig/metadata.js.map +0 -1
- package/dist/multisig/metadata.test.d.ts +0 -2
- package/dist/multisig/metadata.test.d.ts.map +0 -1
- package/dist/multisig/metadata.test.js +0 -323
- package/dist/multisig/metadata.test.js.map +0 -1
- package/dist/proposal/exported.d.ts +0 -12
- package/dist/proposal/exported.d.ts.map +0 -1
- package/dist/proposal/exported.js +0 -88
- package/dist/proposal/exported.js.map +0 -1
- package/dist/signer.test.d.ts +0 -2
- package/dist/signer.test.d.ts.map +0 -1
- package/dist/signer.test.js +0 -123
- package/dist/signer.test.js.map +0 -1
- package/dist/transaction/p2id.interop.test.d.ts +0 -2
- package/dist/transaction/p2id.interop.test.d.ts.map +0 -1
- package/dist/transaction/p2id.interop.test.js +0 -36
- package/dist/transaction/p2id.interop.test.js.map +0 -1
- package/dist/transaction/updatePsm.d.ts +0 -7
- package/dist/transaction/updatePsm.d.ts.map +0 -1
- package/dist/transaction/updatePsm.js.map +0 -1
- package/dist/transport/http.d.ts +0 -64
- package/dist/transport/http.d.ts.map +0 -1
- package/dist/transport/http.js +0 -162
- package/dist/transport/http.js.map +0 -1
- package/dist/transport/index.d.ts +0 -5
- package/dist/transport/index.d.ts.map +0 -1
- package/dist/transport/index.js +0 -5
- package/dist/transport/index.js.map +0 -1
- package/dist/utils/state-validation.d.ts +0 -5
- package/dist/utils/state-validation.d.ts.map +0 -1
- package/dist/utils/state-validation.js +0 -30
- package/dist/utils/state-validation.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -6
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -52
- package/dist/utils/validation.js.map +0 -1
- package/masm/psm.masm +0 -178
- package/masm/psm_ecdsa.masm +0 -179
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AdviceMap, Felt, Signature, Word } from '@miden-sdk/miden-sdk';
|
|
2
|
-
import type { SignatureScheme } from '../types.js';
|
|
2
|
+
import type { ProposalSignatureEntry, SignatureScheme } from '../types.js';
|
|
3
3
|
export declare function signatureHexToBytes(hex: string, scheme?: SignatureScheme): Uint8Array;
|
|
4
4
|
export declare function buildSignatureAdviceEntry(pubkeyCommitment: Word, message: Word, signature: Signature, ecdsaPubkeyHex?: string, ecdsaSigHex?: string): {
|
|
5
5
|
key: Word;
|
|
@@ -18,4 +18,6 @@ export declare function mergeSignatureAdviceMaps(advice: AdviceMap, entries: Arr
|
|
|
18
18
|
values: Felt[];
|
|
19
19
|
}>): AdviceMap;
|
|
20
20
|
export declare function toWord(hex: string): Word;
|
|
21
|
+
export declare function normalizeSignerCommitment(signerId: string): string;
|
|
22
|
+
export declare function canonicalizeSignature(signature: ProposalSignatureEntry, signerCommitments: Set<string>): ProposalSignatureEntry;
|
|
21
23
|
//# sourceMappingURL=signature.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../src/utils/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAqB,SAAS,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../src/utils/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAqB,SAAS,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG3F,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,eAA0B,GACjC,UAAU,CAMZ;AAsBD,wBAAgB,yBAAyB,CACvC,gBAAgB,EAAE,IAAI,EACtB,OAAO,EAAE,IAAI,EACb,SAAS,EAAE,SAAS,EACpB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,IAAI,EAAE,CAAA;CAAE,CAiB/B;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7E;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,GACtB,MAAM,GAAG,IAAI,CAaf;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,qBAAqB,EAAE,MAAM,GAC5B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA8BhF;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,GAC5C,SAAS,CAKX;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAExC;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,sBAAsB,EACjC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,sBAAsB,CAexB"}
|
package/dist/utils/signature.js
CHANGED
|
@@ -12,7 +12,7 @@ function bytesToPackedU32Felts(bytes) {
|
|
|
12
12
|
const felts = [];
|
|
13
13
|
for (let i = 0; i < bytes.length; i += 4) {
|
|
14
14
|
let packed = 0;
|
|
15
|
-
for (let j = 0; j < 4 && i + j < bytes.length; j
|
|
15
|
+
for (let j = 0; j < 4 && i + j < bytes.length; j += 1) {
|
|
16
16
|
packed |= bytes[i + j] << (j * 8);
|
|
17
17
|
}
|
|
18
18
|
felts.push(new Felt(BigInt(packed >>> 0)));
|
|
@@ -66,7 +66,7 @@ export function verifyEcdsaCommitment(pubkeyHex, expectedCommitmentHex) {
|
|
|
66
66
|
const packedU32Values = [];
|
|
67
67
|
for (let i = 0; i < bytes.length; i += 4) {
|
|
68
68
|
let packed = 0;
|
|
69
|
-
for (let j = 0; j < 4 && i + j < bytes.length; j
|
|
69
|
+
for (let j = 0; j < 4 && i + j < bytes.length; j += 1) {
|
|
70
70
|
packed |= bytes[i + j] << (j * 8);
|
|
71
71
|
}
|
|
72
72
|
packedU32Values.push(packed >>> 0);
|
|
@@ -79,15 +79,15 @@ export function verifyEcdsaCommitment(pubkeyHex, expectedCommitmentHex) {
|
|
|
79
79
|
return {
|
|
80
80
|
match: computedHex === expectedNorm,
|
|
81
81
|
computedHex,
|
|
82
|
-
packedFelts: packedU32Values.map(
|
|
82
|
+
packedFelts: packedU32Values.map((value) => value.toString()),
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
|
-
catch (
|
|
85
|
+
catch (error) {
|
|
86
86
|
return {
|
|
87
87
|
match: false,
|
|
88
|
-
computedHex: `ERROR: ${
|
|
88
|
+
computedHex: `ERROR: ${error}`,
|
|
89
89
|
packedFelts: [],
|
|
90
|
-
error: String(
|
|
90
|
+
error: String(error),
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
93
|
}
|
|
@@ -100,4 +100,29 @@ export function mergeSignatureAdviceMaps(advice, entries) {
|
|
|
100
100
|
export function toWord(hex) {
|
|
101
101
|
return Word.fromHex(normalizeHexWord(hex));
|
|
102
102
|
}
|
|
103
|
+
export function normalizeSignerCommitment(signerId) {
|
|
104
|
+
const hex = signerId.startsWith('0x') || signerId.startsWith('0X')
|
|
105
|
+
? signerId.slice(2)
|
|
106
|
+
: signerId;
|
|
107
|
+
if (hex.length !== 64 || !/^[0-9a-fA-F]+$/.test(hex)) {
|
|
108
|
+
throw new Error(`expected signerId as 32-byte hex, got ${signerId}`);
|
|
109
|
+
}
|
|
110
|
+
return normalizeHexWord(signerId);
|
|
111
|
+
}
|
|
112
|
+
export function canonicalizeSignature(signature, signerCommitments) {
|
|
113
|
+
try {
|
|
114
|
+
const signerId = normalizeSignerCommitment(signature.signerId);
|
|
115
|
+
if (!signerCommitments.has(signerId)) {
|
|
116
|
+
throw new Error(`signer ${signerId} is not part of this multisig`);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
...signature,
|
|
120
|
+
signerId,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
125
|
+
throw new Error(message);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
103
128
|
//# sourceMappingURL=signature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/utils/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,IAAI,EAAE,SAAS,EAAE,MAAM,EAAa,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG7D,MAAM,UAAU,mBAAmB,
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/utils/signature.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/word.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { wordElementToBigInt, wordToHex
|
|
2
|
+
import { wordElementToBigInt, wordToHex } from './word.js';
|
|
3
3
|
import { Word } from '@miden-sdk/miden-sdk';
|
|
4
4
|
// Mock the Miden SDK Word class
|
|
5
5
|
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
@@ -50,56 +50,5 @@ describe('word utilities', () => {
|
|
|
50
50
|
expect(hex).toBe(originalHex);
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
|
-
describe('wordToBytes', () => {
|
|
54
|
-
it('should convert a word with known felt values to LE bytes', () => {
|
|
55
|
-
const word = {
|
|
56
|
-
toFelts: () => [
|
|
57
|
-
{ asInt: () => 1n },
|
|
58
|
-
{ asInt: () => 2n },
|
|
59
|
-
{ asInt: () => 3n },
|
|
60
|
-
{ asInt: () => 4n },
|
|
61
|
-
],
|
|
62
|
-
};
|
|
63
|
-
const bytes = wordToBytes(word);
|
|
64
|
-
expect(bytes.length).toBe(32);
|
|
65
|
-
expect(bytes[0]).toBe(1);
|
|
66
|
-
expect(bytes[1]).toBe(0);
|
|
67
|
-
expect(bytes[8]).toBe(2);
|
|
68
|
-
expect(bytes[16]).toBe(3);
|
|
69
|
-
expect(bytes[24]).toBe(4);
|
|
70
|
-
});
|
|
71
|
-
it('should encode felts in little-endian order', () => {
|
|
72
|
-
const word = {
|
|
73
|
-
toFelts: () => [
|
|
74
|
-
{ asInt: () => 0x0102030405060708n },
|
|
75
|
-
{ asInt: () => 0n },
|
|
76
|
-
{ asInt: () => 0n },
|
|
77
|
-
{ asInt: () => 0n },
|
|
78
|
-
],
|
|
79
|
-
};
|
|
80
|
-
const bytes = wordToBytes(word);
|
|
81
|
-
expect(bytes[0]).toBe(0x08);
|
|
82
|
-
expect(bytes[1]).toBe(0x07);
|
|
83
|
-
expect(bytes[2]).toBe(0x06);
|
|
84
|
-
expect(bytes[3]).toBe(0x05);
|
|
85
|
-
expect(bytes[4]).toBe(0x04);
|
|
86
|
-
expect(bytes[5]).toBe(0x03);
|
|
87
|
-
expect(bytes[6]).toBe(0x02);
|
|
88
|
-
expect(bytes[7]).toBe(0x01);
|
|
89
|
-
});
|
|
90
|
-
it('should handle zero felts', () => {
|
|
91
|
-
const word = {
|
|
92
|
-
toFelts: () => [
|
|
93
|
-
{ asInt: () => 0n },
|
|
94
|
-
{ asInt: () => 0n },
|
|
95
|
-
{ asInt: () => 0n },
|
|
96
|
-
{ asInt: () => 0n },
|
|
97
|
-
],
|
|
98
|
-
};
|
|
99
|
-
const bytes = wordToBytes(word);
|
|
100
|
-
expect(bytes.length).toBe(32);
|
|
101
|
-
expect(bytes.every((b) => b === 0)).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
53
|
});
|
|
105
54
|
//# sourceMappingURL=word.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"word.test.js","sourceRoot":"","sources":["../../src/utils/word.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"word.test.js","sourceRoot":"","sources":["../../src/utils/word.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Multi-Signature RPO Falcon 512 Authentication Component
|
|
2
|
+
|
|
3
|
+
use openzeppelin::auth::multisig
|
|
4
|
+
|
|
5
|
+
type BeWord = struct @bigendian { a: felt, b: felt, c: felt, d: felt }
|
|
6
|
+
|
|
7
|
+
pub use multisig::update_signers_and_threshold
|
|
8
|
+
pub use multisig::update_procedure_threshold
|
|
9
|
+
|
|
10
|
+
pub proc auth_tx_multisig(salt: BeWord)
|
|
11
|
+
exec.multisig::auth_tx
|
|
12
|
+
exec.multisig::assert_new_tx
|
|
13
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Multi-Signature ECDSA secp256k1 Authentication Component
|
|
2
|
+
|
|
3
|
+
use openzeppelin::auth::multisig_ecdsa
|
|
4
|
+
|
|
5
|
+
type BeWord = struct @bigendian { a: felt, b: felt, c: felt, d: felt }
|
|
6
|
+
|
|
7
|
+
pub use multisig_ecdsa::update_signers_and_threshold
|
|
8
|
+
pub use multisig_ecdsa::update_procedure_threshold
|
|
9
|
+
|
|
10
|
+
pub proc auth_tx_multisig_ecdsa(salt: BeWord)
|
|
11
|
+
exec.multisig_ecdsa::auth_tx
|
|
12
|
+
exec.multisig_ecdsa::assert_new_tx
|
|
13
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Multi-Signature RPO Falcon 512 Authentication Component With GUARDIAN
|
|
2
|
+
|
|
3
|
+
use openzeppelin::auth::multisig
|
|
4
|
+
use openzeppelin::auth::guardian
|
|
5
|
+
|
|
6
|
+
type BeWord = struct @bigendian { a: felt, b: felt, c: felt, d: felt }
|
|
7
|
+
|
|
8
|
+
pub use multisig::update_signers_and_threshold
|
|
9
|
+
pub use multisig::update_procedure_threshold
|
|
10
|
+
pub use guardian::update_guardian_public_key
|
|
11
|
+
pub use guardian::verify_guardian_signature
|
|
12
|
+
|
|
13
|
+
pub proc auth_tx_multisig_guardian(salt: BeWord)
|
|
14
|
+
exec.multisig::auth_tx
|
|
15
|
+
exec.guardian::verify_guardian_signature
|
|
16
|
+
exec.multisig::assert_new_tx
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Multi-Signature ECDSA secp256k1 Authentication Component With GUARDIAN
|
|
2
|
+
|
|
3
|
+
use openzeppelin::auth::multisig_ecdsa
|
|
4
|
+
use openzeppelin::auth::guardian_ecdsa
|
|
5
|
+
|
|
6
|
+
type BeWord = struct @bigendian { a: felt, b: felt, c: felt, d: felt }
|
|
7
|
+
|
|
8
|
+
pub use multisig_ecdsa::update_signers_and_threshold
|
|
9
|
+
pub use multisig_ecdsa::update_procedure_threshold
|
|
10
|
+
pub use guardian_ecdsa::update_guardian_public_key
|
|
11
|
+
pub use guardian_ecdsa::verify_guardian_signature
|
|
12
|
+
|
|
13
|
+
pub proc auth_tx_multisig_guardian_ecdsa(salt: BeWord)
|
|
14
|
+
exec.multisig_ecdsa::auth_tx
|
|
15
|
+
exec.guardian_ecdsa::verify_guardian_signature
|
|
16
|
+
exec.multisig_ecdsa::assert_new_tx
|
|
17
|
+
end
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Guardian Authentication Component
|
|
2
|
+
#
|
|
3
|
+
# This component provides GUARDIAN signature verification for accounts.
|
|
4
|
+
# It can be used standalone or in conjunction with other auth components like multisig.
|
|
5
|
+
|
|
6
|
+
use miden::protocol::active_account
|
|
7
|
+
use miden::protocol::native_account
|
|
8
|
+
|
|
9
|
+
type BeWord = struct @bigendian { a: felt, b: felt, c: felt, d: felt }
|
|
10
|
+
|
|
11
|
+
# IMPORTANT SECURITY NOTES
|
|
12
|
+
# --------------------------------------------------------------------------------
|
|
13
|
+
# - The selector in `GUARDIAN_SELECTOR_SLOT` controls whether the extra GUARDIAN signature
|
|
14
|
+
# is enforced:
|
|
15
|
+
# * GUARDIAN_ON => exactly one valid GUARDIAN signature is required.
|
|
16
|
+
# * GUARDIAN_OFF => GUARDIAN signature is skipped for that call.
|
|
17
|
+
#
|
|
18
|
+
# - `verify_guardian_signature` reads the selector from initial storage state.
|
|
19
|
+
# This means changes made during the same transaction won't affect the check.
|
|
20
|
+
#
|
|
21
|
+
# - `enable_guardian` / `disable_guardian` procedures allow explicit control over GUARDIAN state.
|
|
22
|
+
#
|
|
23
|
+
# - `update_guardian_public_key`:
|
|
24
|
+
# * Installs a new GUARDIAN public key in the map at `GUARDIAN_PUBLIC_KEY_MAP_SLOT`.
|
|
25
|
+
# * Does not itself perform any signature checks.
|
|
26
|
+
# * To update the key without requiring GUARDIAN signature, ensure selector is OFF.
|
|
27
|
+
#
|
|
28
|
+
# Storage Layout
|
|
29
|
+
# --------------------------------------------------------------------------------
|
|
30
|
+
#
|
|
31
|
+
# +---------------------+---------------+
|
|
32
|
+
# | DESCRIPTION | SLOT |
|
|
33
|
+
# +---------------------+---------------+
|
|
34
|
+
# | GUARDIAN SELECTOR (word) | 0 |
|
|
35
|
+
# | GUARDIAN PUBLIC KEY MAP | 1 |
|
|
36
|
+
# +---------------------+---------------+
|
|
37
|
+
#
|
|
38
|
+
# - GUARDIAN_SELECTOR_SLOT (0):
|
|
39
|
+
# * Stores a word that is compared against [1, 0, 0, 0] (GUARDIAN_ON).
|
|
40
|
+
# * Any value != GUARDIAN_ON is treated as GUARDIAN_OFF.
|
|
41
|
+
#
|
|
42
|
+
# - GUARDIAN_PUBLIC_KEY_MAP_SLOT (1):
|
|
43
|
+
# * A map from a fixed key [0, 0, 0, 0] to the single GUARDIAN public key:
|
|
44
|
+
# [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
45
|
+
# * GUARDIAN_PUBLIC_KEY is a RPO Falcon 512 public key represented as a word.
|
|
46
|
+
|
|
47
|
+
# CONSTANTS
|
|
48
|
+
# =================================================================================================
|
|
49
|
+
|
|
50
|
+
# Slot where the GUARDIAN selector flag is stored (using word() for named slot access):
|
|
51
|
+
# - GUARDIAN_ON => GUARDIAN signature required
|
|
52
|
+
# - GUARDIAN_OFF => GUARDIAN signature skipped
|
|
53
|
+
const GUARDIAN_SELECTOR_SLOT=word("openzeppelin::guardian::selector")
|
|
54
|
+
|
|
55
|
+
# Map slot for GUARDIAN public key
|
|
56
|
+
# Uses exactly one GUARDIAN public key at index [0, 0, 0, 0]
|
|
57
|
+
# [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
58
|
+
const GUARDIAN_PUBLIC_KEY_MAP_SLOT=word("openzeppelin::guardian::public_key")
|
|
59
|
+
|
|
60
|
+
# Selector flag values
|
|
61
|
+
const GUARDIAN_ON=[1, 0, 0, 0]
|
|
62
|
+
const GUARDIAN_OFF=[0, 0, 0, 0]
|
|
63
|
+
|
|
64
|
+
# The event emitted when a signature is not found for a required signer.
|
|
65
|
+
const AUTH_UNAUTHORIZED_EVENT=event("miden::auth::unauthorized")
|
|
66
|
+
|
|
67
|
+
# GUARDIAN PROCEDURES
|
|
68
|
+
# =================================================================================================
|
|
69
|
+
|
|
70
|
+
#! Enable GUARDIAN verification by setting the selector to ON.
|
|
71
|
+
#!
|
|
72
|
+
#! Operand stack inputs: []
|
|
73
|
+
#! Outputs: []
|
|
74
|
+
#!
|
|
75
|
+
#! Notes:
|
|
76
|
+
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_ON (1)
|
|
77
|
+
#! - After this, transactions will require GUARDIAN signature verification
|
|
78
|
+
proc enable_guardian
|
|
79
|
+
push.GUARDIAN_ON
|
|
80
|
+
# => [GUARDIAN_ON]
|
|
81
|
+
|
|
82
|
+
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
83
|
+
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_ON]
|
|
84
|
+
|
|
85
|
+
exec.native_account::set_item
|
|
86
|
+
# => [OLD_ROOT]
|
|
87
|
+
|
|
88
|
+
dropw
|
|
89
|
+
# => []
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
#! Disable GUARDIAN verification by setting the selector to OFF.
|
|
93
|
+
#!
|
|
94
|
+
#! Operand stack inputs: []
|
|
95
|
+
#! Outputs: []
|
|
96
|
+
#!
|
|
97
|
+
#! Notes:
|
|
98
|
+
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_OFF (0)
|
|
99
|
+
#! - After this, transactions will NOT require GUARDIAN signature verification
|
|
100
|
+
proc disable_guardian
|
|
101
|
+
push.GUARDIAN_OFF
|
|
102
|
+
# => [GUARDIAN_OFF]
|
|
103
|
+
|
|
104
|
+
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
105
|
+
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_OFF]
|
|
106
|
+
|
|
107
|
+
exec.native_account::set_item
|
|
108
|
+
# => [OLD_ROOT]
|
|
109
|
+
|
|
110
|
+
dropw
|
|
111
|
+
# => []
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
#! Update the GUARDIAN public key.
|
|
115
|
+
#!
|
|
116
|
+
#! Operand stack inputs: []
|
|
117
|
+
#! Advice stack inputs: [PUB_KEY]
|
|
118
|
+
#! - PUB_KEY is the new GUARDIAN RPO Falcon 512 public key
|
|
119
|
+
#!
|
|
120
|
+
#! Notes:
|
|
121
|
+
#! - Stores PUB_KEY into GUARDIAN_PUBLIC_KEY_MAP_SLOT:
|
|
122
|
+
#! [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
123
|
+
#! - To update the key without requiring GUARDIAN signature, ensure
|
|
124
|
+
#! GUARDIAN_SELECTOR_SLOT = 0 (OFF) before calling this.
|
|
125
|
+
pub proc update_guardian_public_key
|
|
126
|
+
exec.disable_guardian
|
|
127
|
+
# ------ Update the GUARDIAN public key ------
|
|
128
|
+
adv_loadw
|
|
129
|
+
# => [PUB_KEY]
|
|
130
|
+
|
|
131
|
+
push.0.0.0.0
|
|
132
|
+
# => [MAP_KEY, PUB_KEY]
|
|
133
|
+
# Note that MAP_KEY is [0, 0, 0, 0] for a single GUARDIAN_KEY
|
|
134
|
+
|
|
135
|
+
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
136
|
+
# => [pub_key_slot_prefix, pub_key_slot_suffix, MAP_KEY, PUB_KEY]
|
|
137
|
+
|
|
138
|
+
exec.native_account::set_map_item
|
|
139
|
+
# => [OLD_MAP_VALUE]
|
|
140
|
+
|
|
141
|
+
dropw
|
|
142
|
+
# => []
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
#! Conditionally verify a "GUARDIAN" signature against a stored public key hash.
|
|
146
|
+
#! The condition is controlled by the selector at GUARDIAN_SELECTOR_SLOT.
|
|
147
|
+
#!
|
|
148
|
+
#! Inputs: [MSG]
|
|
149
|
+
#! Outputs: [MSG]
|
|
150
|
+
#!
|
|
151
|
+
#! Panics if:
|
|
152
|
+
#! - Selector is ON but the provided GUARDIAN signature is invalid or missing.
|
|
153
|
+
#!
|
|
154
|
+
#! Notes:
|
|
155
|
+
#! - MSG is TX_SUMMARY_COMMITMENT provided by auth procedure
|
|
156
|
+
#! - If selector is OFF (0), GUARDIAN verification is skipped
|
|
157
|
+
#! - Selector value is read from initial storage state
|
|
158
|
+
pub proc verify_guardian_signature(msg: BeWord) -> BeWord
|
|
159
|
+
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
160
|
+
exec.active_account::get_item
|
|
161
|
+
drop drop drop
|
|
162
|
+
# => [selector, MSG]
|
|
163
|
+
|
|
164
|
+
push.1 eq
|
|
165
|
+
if.true
|
|
166
|
+
push.1
|
|
167
|
+
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
168
|
+
exec.::miden::standards::auth::falcon512_rpo::verify_signatures
|
|
169
|
+
push.1 neq
|
|
170
|
+
if.true
|
|
171
|
+
emit.AUTH_UNAUTHORIZED_EVENT
|
|
172
|
+
push.0 assert.err="invalid GUARDIAN signature"
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
# => [MSG]
|
|
176
|
+
exec.enable_guardian
|
|
177
|
+
end
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Guardian Authentication Component (ECDSA)
|
|
2
|
+
#
|
|
3
|
+
# This component provides GUARDIAN signature verification for accounts using
|
|
4
|
+
# ECDSA secp256k1 (k256/keccak) signatures.
|
|
5
|
+
# It can be used standalone or in conjunction with other auth components like multisig.
|
|
6
|
+
|
|
7
|
+
use miden::protocol::active_account
|
|
8
|
+
use miden::protocol::native_account
|
|
9
|
+
|
|
10
|
+
type BeWord = struct @bigendian { a: felt, b: felt, c: felt, d: felt }
|
|
11
|
+
|
|
12
|
+
# IMPORTANT SECURITY NOTES
|
|
13
|
+
# --------------------------------------------------------------------------------
|
|
14
|
+
# - The selector in `GUARDIAN_SELECTOR_SLOT` controls whether the extra GUARDIAN signature
|
|
15
|
+
# is enforced:
|
|
16
|
+
# * GUARDIAN_ON => exactly one valid GUARDIAN signature is required.
|
|
17
|
+
# * GUARDIAN_OFF => GUARDIAN signature is skipped for that call.
|
|
18
|
+
#
|
|
19
|
+
# - `verify_guardian_signature` reads the selector from initial storage state.
|
|
20
|
+
# This means changes made during the same transaction won't affect the check.
|
|
21
|
+
#
|
|
22
|
+
# - `enable_guardian` / `disable_guardian` procedures allow explicit control over GUARDIAN state.
|
|
23
|
+
#
|
|
24
|
+
# - `update_guardian_public_key`:
|
|
25
|
+
# * Installs a new GUARDIAN public key in the map at `GUARDIAN_PUBLIC_KEY_MAP_SLOT`.
|
|
26
|
+
# * Does not itself perform any signature checks.
|
|
27
|
+
# * To update the key without requiring GUARDIAN signature, ensure selector is OFF.
|
|
28
|
+
#
|
|
29
|
+
# Storage Layout
|
|
30
|
+
# --------------------------------------------------------------------------------
|
|
31
|
+
#
|
|
32
|
+
# +---------------------+---------------+
|
|
33
|
+
# | DESCRIPTION | SLOT |
|
|
34
|
+
# +---------------------+---------------+
|
|
35
|
+
# | GUARDIAN SELECTOR (word) | 0 |
|
|
36
|
+
# | GUARDIAN PUBLIC KEY MAP | 1 |
|
|
37
|
+
# +---------------------+---------------+
|
|
38
|
+
#
|
|
39
|
+
# - GUARDIAN_SELECTOR_SLOT (0):
|
|
40
|
+
# * Stores a word that is compared against [1, 0, 0, 0] (GUARDIAN_ON).
|
|
41
|
+
# * Any value != GUARDIAN_ON is treated as GUARDIAN_OFF.
|
|
42
|
+
#
|
|
43
|
+
# - GUARDIAN_PUBLIC_KEY_MAP_SLOT (1):
|
|
44
|
+
# * A map from a fixed key [0, 0, 0, 0] to the single GUARDIAN public key:
|
|
45
|
+
# [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
46
|
+
# * GUARDIAN_PUBLIC_KEY is an ECDSA secp256k1 public key represented as a word.
|
|
47
|
+
|
|
48
|
+
# CONSTANTS
|
|
49
|
+
# =================================================================================================
|
|
50
|
+
|
|
51
|
+
# Slot where the GUARDIAN selector flag is stored (using word() for named slot access):
|
|
52
|
+
# - GUARDIAN_ON => GUARDIAN signature required
|
|
53
|
+
# - GUARDIAN_OFF => GUARDIAN signature skipped
|
|
54
|
+
const GUARDIAN_SELECTOR_SLOT=word("openzeppelin::guardian::selector")
|
|
55
|
+
|
|
56
|
+
# Map slot for GUARDIAN public key
|
|
57
|
+
# Uses exactly one GUARDIAN public key at index [0, 0, 0, 0]
|
|
58
|
+
# [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
59
|
+
const GUARDIAN_PUBLIC_KEY_MAP_SLOT=word("openzeppelin::guardian::public_key")
|
|
60
|
+
|
|
61
|
+
# Selector flag values
|
|
62
|
+
const GUARDIAN_ON=[1, 0, 0, 0]
|
|
63
|
+
const GUARDIAN_OFF=[0, 0, 0, 0]
|
|
64
|
+
|
|
65
|
+
# The event emitted when a signature is not found for a required signer.
|
|
66
|
+
const AUTH_UNAUTHORIZED_EVENT=event("miden::auth::unauthorized")
|
|
67
|
+
|
|
68
|
+
# GUARDIAN PROCEDURES
|
|
69
|
+
# =================================================================================================
|
|
70
|
+
|
|
71
|
+
#! Enable GUARDIAN verification by setting the selector to ON.
|
|
72
|
+
#!
|
|
73
|
+
#! Operand stack inputs: []
|
|
74
|
+
#! Outputs: []
|
|
75
|
+
#!
|
|
76
|
+
#! Notes:
|
|
77
|
+
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_ON (1)
|
|
78
|
+
#! - After this, transactions will require GUARDIAN signature verification
|
|
79
|
+
proc enable_guardian
|
|
80
|
+
push.GUARDIAN_ON
|
|
81
|
+
# => [GUARDIAN_ON]
|
|
82
|
+
|
|
83
|
+
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
84
|
+
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_ON]
|
|
85
|
+
|
|
86
|
+
exec.native_account::set_item
|
|
87
|
+
# => [OLD_ROOT]
|
|
88
|
+
|
|
89
|
+
dropw
|
|
90
|
+
# => []
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
#! Disable GUARDIAN verification by setting the selector to OFF.
|
|
94
|
+
#!
|
|
95
|
+
#! Operand stack inputs: []
|
|
96
|
+
#! Outputs: []
|
|
97
|
+
#!
|
|
98
|
+
#! Notes:
|
|
99
|
+
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_OFF (0)
|
|
100
|
+
#! - After this, transactions will NOT require GUARDIAN signature verification
|
|
101
|
+
proc disable_guardian
|
|
102
|
+
push.GUARDIAN_OFF
|
|
103
|
+
# => [GUARDIAN_OFF]
|
|
104
|
+
|
|
105
|
+
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
106
|
+
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_OFF]
|
|
107
|
+
|
|
108
|
+
exec.native_account::set_item
|
|
109
|
+
# => [OLD_ROOT]
|
|
110
|
+
|
|
111
|
+
dropw
|
|
112
|
+
# => []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
#! Update the GUARDIAN public key.
|
|
116
|
+
#!
|
|
117
|
+
#! Operand stack inputs: []
|
|
118
|
+
#! Advice stack inputs: [PUB_KEY]
|
|
119
|
+
#! - PUB_KEY is the new GUARDIAN ECDSA secp256k1 public key
|
|
120
|
+
#!
|
|
121
|
+
#! Notes:
|
|
122
|
+
#! - Stores PUB_KEY into GUARDIAN_PUBLIC_KEY_MAP_SLOT:
|
|
123
|
+
#! [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
124
|
+
#! - To update the key without requiring GUARDIAN signature, ensure
|
|
125
|
+
#! GUARDIAN_SELECTOR_SLOT = 0 (OFF) before calling this.
|
|
126
|
+
pub proc update_guardian_public_key
|
|
127
|
+
exec.disable_guardian
|
|
128
|
+
# ------ Update the GUARDIAN public key ------
|
|
129
|
+
adv_loadw
|
|
130
|
+
# => [PUB_KEY]
|
|
131
|
+
|
|
132
|
+
push.0.0.0.0
|
|
133
|
+
# => [MAP_KEY, PUB_KEY]
|
|
134
|
+
# Note that MAP_KEY is [0, 0, 0, 0] for a single GUARDIAN_KEY
|
|
135
|
+
|
|
136
|
+
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
137
|
+
# => [pub_key_slot_prefix, pub_key_slot_suffix, MAP_KEY, PUB_KEY]
|
|
138
|
+
|
|
139
|
+
exec.native_account::set_map_item
|
|
140
|
+
# => [OLD_MAP_VALUE]
|
|
141
|
+
|
|
142
|
+
dropw
|
|
143
|
+
# => []
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
#! Conditionally verify a "GUARDIAN" signature against a stored public key hash.
|
|
147
|
+
#! The condition is controlled by the selector at GUARDIAN_SELECTOR_SLOT.
|
|
148
|
+
#!
|
|
149
|
+
#! Inputs: [MSG]
|
|
150
|
+
#! Outputs: [MSG]
|
|
151
|
+
#!
|
|
152
|
+
#! Panics if:
|
|
153
|
+
#! - Selector is ON but the provided GUARDIAN signature is invalid or missing.
|
|
154
|
+
#!
|
|
155
|
+
#! Notes:
|
|
156
|
+
#! - MSG is TX_SUMMARY_COMMITMENT provided by auth procedure
|
|
157
|
+
#! - If selector is OFF (0), GUARDIAN verification is skipped
|
|
158
|
+
#! - Selector value is read from initial storage state
|
|
159
|
+
pub proc verify_guardian_signature(msg: BeWord) -> BeWord
|
|
160
|
+
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
161
|
+
exec.active_account::get_item
|
|
162
|
+
drop drop drop
|
|
163
|
+
# => [selector, MSG]
|
|
164
|
+
|
|
165
|
+
push.1 eq
|
|
166
|
+
if.true
|
|
167
|
+
push.1
|
|
168
|
+
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
169
|
+
exec.::miden::standards::auth::ecdsa_k256_keccak::verify_signatures
|
|
170
|
+
push.1 neq
|
|
171
|
+
if.true
|
|
172
|
+
emit.AUTH_UNAUTHORIZED_EVENT
|
|
173
|
+
push.0 assert.err="invalid GUARDIAN signature"
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
# => [MSG]
|
|
177
|
+
exec.enable_guardian
|
|
178
|
+
end
|