@openzeppelin/miden-multisig-client 0.16.2 → 0.17.0-rc.1
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 +144 -7
- package/dist/account/builder.d.ts.map +1 -1
- package/dist/account/builder.js +32 -25
- package/dist/account/builder.js.map +1 -1
- package/dist/account/builder.test.js +73 -21
- package/dist/account/builder.test.js.map +1 -1
- package/dist/account/layout.d.ts +31 -0
- package/dist/account/layout.d.ts.map +1 -0
- package/dist/account/layout.js +31 -0
- package/dist/account/layout.js.map +1 -0
- package/dist/account/masm/account-components/auth.d.ts +1 -4
- package/dist/account/masm/account-components/auth.d.ts.map +1 -1
- package/dist/account/masm/account-components/auth.js +36 -53
- package/dist/account/masm/account-components/auth.js.map +1 -1
- package/dist/account/masm/index.d.ts +0 -1
- package/dist/account/masm/index.d.ts.map +1 -1
- package/dist/account/masm/index.js +0 -1
- package/dist/account/masm/index.js.map +1 -1
- package/dist/account/storage.d.ts +4 -0
- package/dist/account/storage.d.ts.map +1 -1
- package/dist/account/storage.js +9 -20
- package/dist/account/storage.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -3
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +68 -15
- package/dist/client.test.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/inspector.d.ts +59 -1
- package/dist/inspector.d.ts.map +1 -1
- package/dist/inspector.js +157 -29
- package/dist/inspector.js.map +1 -1
- package/dist/inspector.test.js +246 -37
- package/dist/inspector.test.js.map +1 -1
- package/dist/multisig.d.ts +106 -32
- package/dist/multisig.d.ts.map +1 -1
- package/dist/multisig.js +289 -95
- package/dist/multisig.js.map +1 -1
- package/dist/multisig.test.js +581 -58
- package/dist/multisig.test.js.map +1 -1
- package/dist/procedures.d.ts +6 -7
- package/dist/procedures.d.ts.map +1 -1
- package/dist/procedures.js +6 -7
- package/dist/procedures.js.map +1 -1
- package/dist/proposal/metadata.d.ts.map +1 -1
- package/dist/proposal/metadata.js +13 -2
- package/dist/proposal/metadata.js.map +1 -1
- package/dist/proposal/metadata.test.js +57 -0
- package/dist/proposal/metadata.test.js.map +1 -1
- package/dist/prover/workflow.d.ts +3 -2
- package/dist/prover/workflow.d.ts.map +1 -1
- package/dist/prover/workflow.js +5 -2
- package/dist/prover/workflow.js.map +1 -1
- package/dist/prover/workflow.test.js +6 -4
- package/dist/prover/workflow.test.js.map +1 -1
- package/dist/transaction/index.d.ts +1 -1
- package/dist/transaction/index.d.ts.map +1 -1
- package/dist/transaction/index.js +1 -1
- package/dist/transaction/index.js.map +1 -1
- package/dist/transaction/p2id.d.ts +17 -6
- package/dist/transaction/p2id.d.ts.map +1 -1
- package/dist/transaction/p2id.js +22 -31
- package/dist/transaction/p2id.js.map +1 -1
- package/dist/transaction/p2id.test.js +62 -24
- package/dist/transaction/p2id.test.js.map +1 -1
- package/dist/transaction/summary.d.ts +45 -2
- package/dist/transaction/summary.d.ts.map +1 -1
- package/dist/transaction/summary.js +42 -2
- package/dist/transaction/summary.js.map +1 -1
- package/dist/transaction/summary.test.d.ts +2 -0
- package/dist/transaction/summary.test.d.ts.map +1 -0
- package/dist/transaction/summary.test.js +26 -0
- package/dist/transaction/summary.test.js.map +1 -0
- package/dist/transaction/updateGuardian.d.ts.map +1 -1
- package/dist/transaction/updateGuardian.js +16 -18
- package/dist/transaction/updateGuardian.js.map +1 -1
- package/dist/transaction/updateProcedureThreshold.d.ts.map +1 -1
- package/dist/transaction/updateProcedureThreshold.js +15 -17
- package/dist/transaction/updateProcedureThreshold.js.map +1 -1
- package/dist/transaction/updateSigners.d.ts +6 -1
- package/dist/transaction/updateSigners.d.ts.map +1 -1
- package/dist/transaction/updateSigners.js +20 -17
- package/dist/transaction/updateSigners.js.map +1 -1
- package/dist/transaction.d.ts +2 -2
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +1 -1
- package/dist/transaction.js.map +1 -1
- package/dist/types/proposal.d.ts +28 -4
- package/dist/types/proposal.d.ts.map +1 -1
- package/dist/types/proposal.js +18 -0
- package/dist/types/proposal.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/signature.d.ts +11 -7
- package/dist/utils/signature.d.ts.map +1 -1
- package/dist/utils/signature.js +24 -58
- package/dist/utils/signature.js.map +1 -1
- package/dist/utils/word.d.ts +7 -0
- package/dist/utils/word.d.ts.map +1 -1
- package/dist/utils/word.js +15 -0
- package/dist/utils/word.js.map +1 -1
- package/masm/account_components/auth/guarded_multisig.masm +42 -0
- package/package.json +7 -4
- package/src/account/builder.test.ts +111 -45
- package/src/account/builder.ts +45 -33
- package/src/account/layout.ts +33 -0
- package/src/account/masm/account-components/auth.ts +36 -56
- package/src/account/masm/index.ts +0 -1
- package/src/account/storage.ts +9 -22
- package/src/client.test.ts +80 -15
- package/src/client.ts +5 -3
- package/src/index.ts +26 -1
- package/src/inspector.test.ts +330 -38
- package/src/inspector.ts +196 -33
- package/src/multisig.test.ts +679 -63
- package/src/multisig.ts +361 -107
- package/src/procedures.ts +6 -7
- package/src/proposal/metadata.test.ts +76 -0
- package/src/proposal/metadata.ts +13 -2
- package/src/prover/workflow.test.ts +9 -4
- package/src/prover/workflow.ts +15 -3
- package/src/transaction/index.ts +7 -1
- package/src/transaction/p2id.test.ts +112 -31
- package/src/transaction/p2id.ts +39 -38
- package/src/transaction/summary.test.ts +32 -0
- package/src/transaction/summary.ts +83 -4
- package/src/transaction/updateGuardian.ts +15 -25
- package/src/transaction/updateProcedureThreshold.ts +13 -29
- package/src/transaction/updateSigners.ts +38 -30
- package/src/transaction.ts +8 -1
- package/src/types/proposal.ts +43 -4
- package/src/types.ts +0 -1
- package/src/utils/signature.ts +32 -65
- package/src/utils/word.ts +17 -0
- package/dist/account/masm/auth.d.ts +0 -5
- package/dist/account/masm/auth.d.ts.map +0 -1
- package/dist/account/masm/auth.js +0 -1509
- package/dist/account/masm/auth.js.map +0 -1
- package/masm/account_components/auth/multisig.masm +0 -12
- package/masm/account_components/auth/multisig_ecdsa.masm +0 -12
- package/masm/account_components/auth/multisig_guardian.masm +0 -16
- package/masm/account_components/auth/multisig_guardian_ecdsa.masm +0 -16
- package/masm/auth/guardian.masm +0 -199
- package/masm/auth/guardian_ecdsa.masm +0 -195
- package/masm/auth/multisig.masm +0 -554
- package/masm/auth/multisig_ecdsa.masm +0 -554
- package/src/account/masm/auth.ts +0 -1512
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/account/masm/auth.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,0BAA0B;AAE1B,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0iB5B,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0iBlC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuM5B,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmMlC,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Multi-Signature RPO Falcon 512 Authentication Component
|
|
2
|
-
|
|
3
|
-
use openzeppelin::auth::multisig
|
|
4
|
-
|
|
5
|
-
pub use multisig::update_signers_and_threshold
|
|
6
|
-
pub use multisig::update_procedure_threshold
|
|
7
|
-
|
|
8
|
-
@auth_script
|
|
9
|
-
pub proc auth_tx_multisig(salt: word)
|
|
10
|
-
exec.multisig::auth_tx
|
|
11
|
-
exec.multisig::assert_new_tx
|
|
12
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Multi-Signature ECDSA secp256k1 Authentication Component
|
|
2
|
-
|
|
3
|
-
use openzeppelin::auth::multisig_ecdsa
|
|
4
|
-
|
|
5
|
-
pub use multisig_ecdsa::update_signers_and_threshold
|
|
6
|
-
pub use multisig_ecdsa::update_procedure_threshold
|
|
7
|
-
|
|
8
|
-
@auth_script
|
|
9
|
-
pub proc auth_tx_multisig_ecdsa(salt: word)
|
|
10
|
-
exec.multisig_ecdsa::auth_tx
|
|
11
|
-
exec.multisig_ecdsa::assert_new_tx
|
|
12
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# Multi-Signature RPO Falcon 512 Authentication Component With GUARDIAN
|
|
2
|
-
|
|
3
|
-
use openzeppelin::auth::multisig
|
|
4
|
-
use openzeppelin::auth::guardian
|
|
5
|
-
|
|
6
|
-
pub use multisig::update_signers_and_threshold
|
|
7
|
-
pub use multisig::update_procedure_threshold
|
|
8
|
-
pub use guardian::update_guardian_public_key
|
|
9
|
-
pub use guardian::verify_guardian_signature
|
|
10
|
-
|
|
11
|
-
@auth_script
|
|
12
|
-
pub proc auth_tx_multisig_guardian(salt: word)
|
|
13
|
-
exec.multisig::auth_tx
|
|
14
|
-
exec.guardian::verify_guardian_signature
|
|
15
|
-
exec.multisig::assert_new_tx
|
|
16
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# Multi-Signature ECDSA secp256k1 Authentication Component With GUARDIAN
|
|
2
|
-
|
|
3
|
-
use openzeppelin::auth::multisig_ecdsa
|
|
4
|
-
use openzeppelin::auth::guardian_ecdsa
|
|
5
|
-
|
|
6
|
-
pub use multisig_ecdsa::update_signers_and_threshold
|
|
7
|
-
pub use multisig_ecdsa::update_procedure_threshold
|
|
8
|
-
pub use guardian_ecdsa::update_guardian_public_key
|
|
9
|
-
pub use guardian_ecdsa::verify_guardian_signature
|
|
10
|
-
|
|
11
|
-
@auth_script
|
|
12
|
-
pub proc auth_tx_multisig_guardian_ecdsa(salt: word)
|
|
13
|
-
exec.multisig_ecdsa::auth_tx
|
|
14
|
-
exec.guardian_ecdsa::verify_guardian_signature
|
|
15
|
-
exec.multisig_ecdsa::assert_new_tx
|
|
16
|
-
end
|
package/masm/auth/guardian.masm
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
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::auth::AUTH_UNAUTHORIZED_EVENT
|
|
8
|
-
use miden::protocol::native_account
|
|
9
|
-
|
|
10
|
-
# IMPORTANT SECURITY NOTES
|
|
11
|
-
# --------------------------------------------------------------------------------
|
|
12
|
-
# - The selector in `GUARDIAN_SELECTOR_SLOT` controls whether the extra GUARDIAN signature
|
|
13
|
-
# is enforced:
|
|
14
|
-
# * GUARDIAN_ON => exactly one valid GUARDIAN signature is required.
|
|
15
|
-
# * GUARDIAN_OFF => GUARDIAN signature is skipped for that call.
|
|
16
|
-
#
|
|
17
|
-
# - `verify_guardian_signature` reads the selector from initial storage state.
|
|
18
|
-
# This means changes made during the same transaction won't affect the check.
|
|
19
|
-
#
|
|
20
|
-
# - `enable_guardian` / `disable_guardian` procedures allow explicit control over GUARDIAN state.
|
|
21
|
-
#
|
|
22
|
-
# - `update_guardian_public_key`:
|
|
23
|
-
# * Installs a new GUARDIAN public key in the map at `GUARDIAN_PUBLIC_KEY_MAP_SLOT`.
|
|
24
|
-
# * Does not itself perform any signature checks.
|
|
25
|
-
# * To update the key without requiring GUARDIAN signature, ensure selector is OFF.
|
|
26
|
-
#
|
|
27
|
-
# Storage Layout
|
|
28
|
-
# --------------------------------------------------------------------------------
|
|
29
|
-
#
|
|
30
|
-
# +---------------------+---------------+
|
|
31
|
-
# | DESCRIPTION | SLOT |
|
|
32
|
-
# +---------------------+---------------+
|
|
33
|
-
# | GUARDIAN SELECTOR (word) | 0 |
|
|
34
|
-
# | GUARDIAN PUBLIC KEY MAP | 1 |
|
|
35
|
-
# | GUARDIAN SCHEME ID MAP | 2 |
|
|
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 Falcon Poseidon2 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
|
-
# Map slot for GUARDIAN signature scheme IDs
|
|
61
|
-
# Uses exactly one scheme ID entry at index [0, 0, 0, 0]
|
|
62
|
-
# [0, 0, 0, 0] => [scheme_id, 0, 0, 0]
|
|
63
|
-
const GUARDIAN_SCHEME_ID_MAP_SLOT=word("openzeppelin::guardian::scheme_id")
|
|
64
|
-
|
|
65
|
-
# Selector flag values
|
|
66
|
-
const GUARDIAN_ON=[1, 0, 0, 0]
|
|
67
|
-
const GUARDIAN_OFF=[0, 0, 0, 0]
|
|
68
|
-
const FALCON_512_POSEIDON2_SCHEME_WORD=[2, 0, 0, 0]
|
|
69
|
-
|
|
70
|
-
# GUARDIAN PROCEDURES
|
|
71
|
-
# =================================================================================================
|
|
72
|
-
|
|
73
|
-
#! Enable GUARDIAN verification by setting the selector to ON.
|
|
74
|
-
#!
|
|
75
|
-
#! Operand stack inputs: []
|
|
76
|
-
#! Outputs: []
|
|
77
|
-
#!
|
|
78
|
-
#! Notes:
|
|
79
|
-
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_ON (1)
|
|
80
|
-
#! - After this, transactions will require GUARDIAN signature verification
|
|
81
|
-
proc enable_guardian
|
|
82
|
-
push.GUARDIAN_ON
|
|
83
|
-
# => [GUARDIAN_ON]
|
|
84
|
-
|
|
85
|
-
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
86
|
-
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_ON]
|
|
87
|
-
|
|
88
|
-
exec.native_account::set_item
|
|
89
|
-
# => [OLD_ROOT]
|
|
90
|
-
|
|
91
|
-
dropw
|
|
92
|
-
# => []
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
#! Disable GUARDIAN verification by setting the selector to OFF.
|
|
96
|
-
#!
|
|
97
|
-
#! Operand stack inputs: []
|
|
98
|
-
#! Outputs: []
|
|
99
|
-
#!
|
|
100
|
-
#! Notes:
|
|
101
|
-
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_OFF (0)
|
|
102
|
-
#! - After this, transactions will NOT require GUARDIAN signature verification
|
|
103
|
-
proc disable_guardian
|
|
104
|
-
push.GUARDIAN_OFF
|
|
105
|
-
# => [GUARDIAN_OFF]
|
|
106
|
-
|
|
107
|
-
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
108
|
-
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_OFF]
|
|
109
|
-
|
|
110
|
-
exec.native_account::set_item
|
|
111
|
-
# => [OLD_ROOT]
|
|
112
|
-
|
|
113
|
-
dropw
|
|
114
|
-
# => []
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
#! Update the GUARDIAN public key.
|
|
118
|
-
#!
|
|
119
|
-
#! Operand stack inputs: []
|
|
120
|
-
#! Advice stack inputs: [PUB_KEY]
|
|
121
|
-
#! - PUB_KEY is the new GUARDIAN RPO Falcon 512 public key
|
|
122
|
-
#!
|
|
123
|
-
#! Notes:
|
|
124
|
-
#! - Stores PUB_KEY into GUARDIAN_PUBLIC_KEY_MAP_SLOT:
|
|
125
|
-
#! [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
126
|
-
#! - To update the key without requiring GUARDIAN signature, ensure
|
|
127
|
-
#! GUARDIAN_SELECTOR_SLOT = 0 (OFF) before calling this.
|
|
128
|
-
pub proc update_guardian_public_key
|
|
129
|
-
exec.disable_guardian
|
|
130
|
-
# ------ Update the GUARDIAN public key ------
|
|
131
|
-
adv_loadw
|
|
132
|
-
# => [PUB_KEY]
|
|
133
|
-
|
|
134
|
-
push.0.0.0.0
|
|
135
|
-
# => [MAP_KEY, PUB_KEY]
|
|
136
|
-
# Note that MAP_KEY is [0, 0, 0, 0] for a single GUARDIAN_KEY
|
|
137
|
-
|
|
138
|
-
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
139
|
-
# => [pub_key_slot_prefix, pub_key_slot_suffix, MAP_KEY, PUB_KEY]
|
|
140
|
-
|
|
141
|
-
exec.native_account::set_map_item
|
|
142
|
-
# => [OLD_MAP_VALUE]
|
|
143
|
-
|
|
144
|
-
dropw
|
|
145
|
-
# => []
|
|
146
|
-
|
|
147
|
-
push.0.0.0.0
|
|
148
|
-
# => [MAP_KEY]
|
|
149
|
-
|
|
150
|
-
push.FALCON_512_POSEIDON2_SCHEME_WORD
|
|
151
|
-
# => [SCHEME_ID_WORD, MAP_KEY]
|
|
152
|
-
|
|
153
|
-
swapw
|
|
154
|
-
# => [MAP_KEY, SCHEME_ID_WORD]
|
|
155
|
-
|
|
156
|
-
push.GUARDIAN_SCHEME_ID_MAP_SLOT[0..2]
|
|
157
|
-
# => [scheme_id_slot_prefix, scheme_id_slot_suffix, MAP_KEY, SCHEME_ID_WORD]
|
|
158
|
-
|
|
159
|
-
exec.native_account::set_map_item
|
|
160
|
-
# => [OLD_MAP_VALUE]
|
|
161
|
-
|
|
162
|
-
dropw
|
|
163
|
-
# => []
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
#! Conditionally verify a "GUARDIAN" signature against a stored public key hash.
|
|
167
|
-
#! The condition is controlled by the selector at GUARDIAN_SELECTOR_SLOT.
|
|
168
|
-
#!
|
|
169
|
-
#! Inputs: [MSG]
|
|
170
|
-
#! Outputs: [MSG]
|
|
171
|
-
#!
|
|
172
|
-
#! Panics if:
|
|
173
|
-
#! - Selector is ON but the provided GUARDIAN signature is invalid or missing.
|
|
174
|
-
#!
|
|
175
|
-
#! Notes:
|
|
176
|
-
#! - MSG is TX_SUMMARY_COMMITMENT provided by auth procedure
|
|
177
|
-
#! - If selector is OFF (0), GUARDIAN verification is skipped
|
|
178
|
-
#! - Selector value is read from initial storage state
|
|
179
|
-
pub proc verify_guardian_signature(msg: word)
|
|
180
|
-
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
181
|
-
exec.active_account::get_item
|
|
182
|
-
drop drop drop
|
|
183
|
-
# => [selector, MSG]
|
|
184
|
-
|
|
185
|
-
push.1 eq
|
|
186
|
-
if.true
|
|
187
|
-
push.1
|
|
188
|
-
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
189
|
-
push.GUARDIAN_SCHEME_ID_MAP_SLOT[0..2]
|
|
190
|
-
exec.::miden::standards::auth::signature::verify_signatures
|
|
191
|
-
push.1 neq
|
|
192
|
-
if.true
|
|
193
|
-
emit.AUTH_UNAUTHORIZED_EVENT
|
|
194
|
-
push.0 assert.err="invalid GUARDIAN signature"
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
# => [MSG]
|
|
198
|
-
exec.enable_guardian
|
|
199
|
-
end
|
|
@@ -1,195 +0,0 @@
|
|
|
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::auth::AUTH_UNAUTHORIZED_EVENT
|
|
9
|
-
use miden::protocol::native_account
|
|
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 an ECDSA secp256k1 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
|
-
const GUARDIAN_SCHEME_ID_MAP_SLOT=word("openzeppelin::guardian::scheme_id")
|
|
60
|
-
|
|
61
|
-
# Selector flag values
|
|
62
|
-
const GUARDIAN_ON=[1, 0, 0, 0]
|
|
63
|
-
const GUARDIAN_OFF=[0, 0, 0, 0]
|
|
64
|
-
const ECDSA_K256_KECCAK_SCHEME_WORD=[1, 0, 0, 0]
|
|
65
|
-
|
|
66
|
-
# GUARDIAN PROCEDURES
|
|
67
|
-
# =================================================================================================
|
|
68
|
-
|
|
69
|
-
#! Enable GUARDIAN verification by setting the selector to ON.
|
|
70
|
-
#!
|
|
71
|
-
#! Operand stack inputs: []
|
|
72
|
-
#! Outputs: []
|
|
73
|
-
#!
|
|
74
|
-
#! Notes:
|
|
75
|
-
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_ON (1)
|
|
76
|
-
#! - After this, transactions will require GUARDIAN signature verification
|
|
77
|
-
proc enable_guardian
|
|
78
|
-
push.GUARDIAN_ON
|
|
79
|
-
# => [GUARDIAN_ON]
|
|
80
|
-
|
|
81
|
-
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
82
|
-
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_ON]
|
|
83
|
-
|
|
84
|
-
exec.native_account::set_item
|
|
85
|
-
# => [OLD_ROOT]
|
|
86
|
-
|
|
87
|
-
dropw
|
|
88
|
-
# => []
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
#! Disable GUARDIAN verification by setting the selector to OFF.
|
|
92
|
-
#!
|
|
93
|
-
#! Operand stack inputs: []
|
|
94
|
-
#! Outputs: []
|
|
95
|
-
#!
|
|
96
|
-
#! Notes:
|
|
97
|
-
#! - Sets GUARDIAN_SELECTOR_SLOT to GUARDIAN_OFF (0)
|
|
98
|
-
#! - After this, transactions will NOT require GUARDIAN signature verification
|
|
99
|
-
proc disable_guardian
|
|
100
|
-
push.GUARDIAN_OFF
|
|
101
|
-
# => [GUARDIAN_OFF]
|
|
102
|
-
|
|
103
|
-
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
104
|
-
# => [selector_slot_prefix, selector_slot_suffix, GUARDIAN_OFF]
|
|
105
|
-
|
|
106
|
-
exec.native_account::set_item
|
|
107
|
-
# => [OLD_ROOT]
|
|
108
|
-
|
|
109
|
-
dropw
|
|
110
|
-
# => []
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
#! Update the GUARDIAN public key.
|
|
114
|
-
#!
|
|
115
|
-
#! Operand stack inputs: []
|
|
116
|
-
#! Advice stack inputs: [PUB_KEY]
|
|
117
|
-
#! - PUB_KEY is the new GUARDIAN ECDSA secp256k1 public key
|
|
118
|
-
#!
|
|
119
|
-
#! Notes:
|
|
120
|
-
#! - Stores PUB_KEY into GUARDIAN_PUBLIC_KEY_MAP_SLOT:
|
|
121
|
-
#! [0, 0, 0, 0] => GUARDIAN_PUBLIC_KEY
|
|
122
|
-
#! - To update the key without requiring GUARDIAN signature, ensure
|
|
123
|
-
#! GUARDIAN_SELECTOR_SLOT = 0 (OFF) before calling this.
|
|
124
|
-
pub proc update_guardian_public_key
|
|
125
|
-
exec.disable_guardian
|
|
126
|
-
# ------ Update the GUARDIAN public key ------
|
|
127
|
-
adv_loadw
|
|
128
|
-
# => [PUB_KEY]
|
|
129
|
-
|
|
130
|
-
push.0.0.0.0
|
|
131
|
-
# => [MAP_KEY, PUB_KEY]
|
|
132
|
-
# Note that MAP_KEY is [0, 0, 0, 0] for a single GUARDIAN_KEY
|
|
133
|
-
|
|
134
|
-
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
135
|
-
# => [pub_key_slot_prefix, pub_key_slot_suffix, MAP_KEY, PUB_KEY]
|
|
136
|
-
|
|
137
|
-
exec.native_account::set_map_item
|
|
138
|
-
# => [OLD_MAP_VALUE]
|
|
139
|
-
|
|
140
|
-
dropw
|
|
141
|
-
# => []
|
|
142
|
-
|
|
143
|
-
push.0.0.0.0
|
|
144
|
-
# => [MAP_KEY]
|
|
145
|
-
|
|
146
|
-
push.ECDSA_K256_KECCAK_SCHEME_WORD
|
|
147
|
-
# => [SCHEME_ID_WORD, MAP_KEY]
|
|
148
|
-
|
|
149
|
-
swapw
|
|
150
|
-
# => [MAP_KEY, SCHEME_ID_WORD]
|
|
151
|
-
|
|
152
|
-
push.GUARDIAN_SCHEME_ID_MAP_SLOT[0..2]
|
|
153
|
-
# => [scheme_id_slot_prefix, scheme_id_slot_suffix, MAP_KEY, SCHEME_ID_WORD]
|
|
154
|
-
|
|
155
|
-
exec.native_account::set_map_item
|
|
156
|
-
# => [OLD_MAP_VALUE]
|
|
157
|
-
|
|
158
|
-
dropw
|
|
159
|
-
# => []
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
#! Conditionally verify a "GUARDIAN" signature against a stored public key hash.
|
|
163
|
-
#! The condition is controlled by the selector at GUARDIAN_SELECTOR_SLOT.
|
|
164
|
-
#!
|
|
165
|
-
#! Inputs: [MSG]
|
|
166
|
-
#! Outputs: [MSG]
|
|
167
|
-
#!
|
|
168
|
-
#! Panics if:
|
|
169
|
-
#! - Selector is ON but the provided GUARDIAN signature is invalid or missing.
|
|
170
|
-
#!
|
|
171
|
-
#! Notes:
|
|
172
|
-
#! - MSG is TX_SUMMARY_COMMITMENT provided by auth procedure
|
|
173
|
-
#! - If selector is OFF (0), GUARDIAN verification is skipped
|
|
174
|
-
#! - Selector value is read from initial storage state
|
|
175
|
-
pub proc verify_guardian_signature(msg: word)
|
|
176
|
-
push.GUARDIAN_SELECTOR_SLOT[0..2]
|
|
177
|
-
exec.active_account::get_item
|
|
178
|
-
drop drop drop
|
|
179
|
-
# => [selector, MSG]
|
|
180
|
-
|
|
181
|
-
push.1 eq
|
|
182
|
-
if.true
|
|
183
|
-
push.1
|
|
184
|
-
push.GUARDIAN_PUBLIC_KEY_MAP_SLOT[0..2]
|
|
185
|
-
push.GUARDIAN_SCHEME_ID_MAP_SLOT[0..2]
|
|
186
|
-
exec.::miden::standards::auth::signature::verify_signatures
|
|
187
|
-
push.1 neq
|
|
188
|
-
if.true
|
|
189
|
-
emit.AUTH_UNAUTHORIZED_EVENT
|
|
190
|
-
push.0 assert.err="invalid GUARDIAN signature"
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
# => [MSG]
|
|
194
|
-
exec.enable_guardian
|
|
195
|
-
end
|