@taquito/signer 25.0.0-rc.1 → 25.1.0-beta0
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 +19 -2
- package/dist/lib/in-memory-signer.js +19 -4
- package/dist/lib/mldsa-key.js +85 -0
- package/dist/lib/version.js +2 -2
- package/dist/taquito-signer.es6.js +2677 -149
- package/dist/taquito-signer.es6.js.map +1 -1
- package/dist/taquito-signer.umd.js +2676 -148
- package/dist/taquito-signer.umd.js.map +1 -1
- package/dist/types/key-interface.d.ts +2 -2
- package/dist/types/mldsa-key.d.ts +18 -0
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Taquito Signer package
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
_Documentation can be found [here](https://taquito.io/docs/inmemory_signer)_
|
|
4
|
+
_TypeDoc style documentation is available on-line [here](https://taquito.io/typedoc/modules/_taquito_signer.html)_
|
|
4
5
|
|
|
5
6
|
`@taquito/signer` is an npm package that provides developers with signing functionality for Taquito.
|
|
6
7
|
|
|
@@ -14,12 +15,14 @@ This signer implementation is for development workflows.
|
|
|
14
15
|
production use-cases! Use the InMemorySigner appropriately given your risk profile.**
|
|
15
16
|
|
|
16
17
|
## Install
|
|
18
|
+
|
|
17
19
|
```
|
|
18
20
|
npm i --save @taquito/taquito
|
|
19
21
|
npm i --save @taquito/signer
|
|
20
22
|
```
|
|
21
23
|
|
|
22
24
|
## Usage
|
|
25
|
+
|
|
23
26
|
### Loading an unencrypted private key
|
|
24
27
|
|
|
25
28
|
```js
|
|
@@ -47,6 +50,20 @@ Tezos.setProvider({
|
|
|
47
50
|
|
|
48
51
|
The following link can be used to fund an address on the different testnets: https://teztnets.com/.
|
|
49
52
|
|
|
53
|
+
### ML-DSA-44 (tz5)
|
|
54
|
+
|
|
55
|
+
`InMemorySigner.fromSecretKey` accepts Octez `mdsk` secret keys and `mdesk`
|
|
56
|
+
encrypted secret keys. It exposes the corresponding `mdpk` public key and `tz5`
|
|
57
|
+
address. Key generation from mnemonics and HD derivation do not support ML-DSA.
|
|
58
|
+
|
|
59
|
+
For this scheme, both `SignResult.sig` and `SignResult.prefixSig` use `mdsig`.
|
|
60
|
+
`SignResult.sbytes` includes Octez's `ff04` marker and the full 2420-byte signature.
|
|
61
|
+
Watermarks follow the existing signer API; proof of possession remains BLS-only.
|
|
62
|
+
|
|
63
|
+
Sending operations requires a protocol with `tz5_account_enable` enabled. This
|
|
64
|
+
support is validated against an isolated Octez 25.2 Ushuaia sandbox, and does not
|
|
65
|
+
imply activation on mainnet. See the [local conformance suite](../../integration-tests/tz5/README.md).
|
|
66
|
+
|
|
50
67
|
## Additional info
|
|
51
68
|
|
|
52
69
|
See the top-level [https://github.com/ecadlabs/taquito](https://github.com/ecadlabs/taquito) file for details on reporting issues, contributing and versioning.
|
|
@@ -26,6 +26,7 @@ const errors_1 = require("./errors");
|
|
|
26
26
|
const core_1 = require("@taquito/core");
|
|
27
27
|
const key_interface_1 = require("./key-interface");
|
|
28
28
|
const bls_key_1 = require("./bls-key");
|
|
29
|
+
const mldsa_key_1 = require("./mldsa-key");
|
|
29
30
|
const sha2_js_1 = require("@noble/hashes/sha2.js");
|
|
30
31
|
/**
|
|
31
32
|
* A local implementation of the signer. Will represent a Tezos account and be able to produce signature in its behalf
|
|
@@ -80,6 +81,8 @@ class InMemorySigner {
|
|
|
80
81
|
utils_1.PrefixV2.P256SecretKey,
|
|
81
82
|
utils_1.PrefixV2.BLS12_381EncryptedSecretKey,
|
|
82
83
|
utils_1.PrefixV2.BLS12_381SecretKey,
|
|
84
|
+
utils_1.PrefixV2.MLDSA44EncryptedSecretKey,
|
|
85
|
+
utils_1.PrefixV2.MLDSA44SecretKey,
|
|
83
86
|
];
|
|
84
87
|
const pre = (() => {
|
|
85
88
|
try {
|
|
@@ -93,7 +96,8 @@ class InMemorySigner {
|
|
|
93
96
|
const encrypted = pre === utils_1.PrefixV2.Ed25519EncryptedSeed ||
|
|
94
97
|
pre === utils_1.PrefixV2.Secp256k1EncryptedSecretKey ||
|
|
95
98
|
pre === utils_1.PrefixV2.P256EncryptedSecretKey ||
|
|
96
|
-
pre === utils_1.PrefixV2.BLS12_381EncryptedSecretKey
|
|
99
|
+
pre === utils_1.PrefixV2.BLS12_381EncryptedSecretKey ||
|
|
100
|
+
pre === utils_1.PrefixV2.MLDSA44EncryptedSecretKey;
|
|
97
101
|
let decrypt;
|
|
98
102
|
if (encrypted) {
|
|
99
103
|
if (!passphrase) {
|
|
@@ -132,6 +136,10 @@ class InMemorySigner {
|
|
|
132
136
|
case utils_1.PrefixV2.BLS12_381SecretKey:
|
|
133
137
|
__classPrivateFieldSet(this, _InMemorySigner_key, new bls_key_1.BLSKey(key, decrypt), "f");
|
|
134
138
|
break;
|
|
139
|
+
case utils_1.PrefixV2.MLDSA44EncryptedSecretKey:
|
|
140
|
+
case utils_1.PrefixV2.MLDSA44SecretKey:
|
|
141
|
+
__classPrivateFieldSet(this, _InMemorySigner_key, new mldsa_key_1.MLDSAKey(key, decrypt), "f");
|
|
142
|
+
break;
|
|
135
143
|
}
|
|
136
144
|
}
|
|
137
145
|
/**
|
|
@@ -143,13 +151,17 @@ class InMemorySigner {
|
|
|
143
151
|
const msg = typeof message == 'string' ? (0, utils_1.hex2buf)(message) : message;
|
|
144
152
|
const watermarkMsg = watermark !== undefined ? (0, utils_1.mergebuf)(watermark, msg) : msg;
|
|
145
153
|
const { rawSignature, sig: signature, prefixSig: prefixedSignature, } = await __classPrivateFieldGet(this, _InMemorySigner_key, "f").sign(watermarkMsg);
|
|
154
|
+
// Variable-length operation signatures carry the signature-prefix marker
|
|
155
|
+
// and scheme tag before the complete signature payload (Octez signature_v3).
|
|
156
|
+
const signatureTag = __classPrivateFieldGet(this, _InMemorySigner_key, "f") instanceof mldsa_key_1.MLDSAKey ? 4 : __classPrivateFieldGet(this, _InMemorySigner_key, "f") instanceof bls_key_1.BLSKey ? 3 : undefined;
|
|
157
|
+
const signatureBytes = signatureTag === undefined
|
|
158
|
+
? rawSignature
|
|
159
|
+
: (0, utils_1.mergebuf)(new Uint8Array([255, signatureTag]), rawSignature);
|
|
146
160
|
return {
|
|
147
161
|
bytes: (0, utils_1.buf2hex)(msg),
|
|
148
162
|
sig: signature,
|
|
149
163
|
prefixSig: prefixedSignature,
|
|
150
|
-
sbytes: (0, utils_1.buf2hex)((0, utils_1.mergebuf)(msg,
|
|
151
|
-
// bls only Signature_prefix ff03 ref:https://octez.tezos.com/docs/shell/p2p_api.html#signature-prefix-tag-255 & https://octez.tezos.com/docs/shell/p2p_api.html#bls-prefix-tag-3
|
|
152
|
-
(0, key_interface_1.isPOP)(__classPrivateFieldGet(this, _InMemorySigner_key, "f")) ? (0, utils_1.mergebuf)(new Uint8Array([255, 3]), rawSignature) : rawSignature)),
|
|
164
|
+
sbytes: (0, utils_1.buf2hex)((0, utils_1.mergebuf)(msg, signatureBytes)),
|
|
153
165
|
};
|
|
154
166
|
}
|
|
155
167
|
async provePossession() {
|
|
@@ -190,6 +202,7 @@ function publicKeyFromString(src) {
|
|
|
190
202
|
utils_1.PrefixV2.Secp256k1PublicKey,
|
|
191
203
|
utils_1.PrefixV2.P256PublicKey,
|
|
192
204
|
utils_1.PrefixV2.BLS12_381PublicKey,
|
|
205
|
+
utils_1.PrefixV2.MLDSA44PublicKey,
|
|
193
206
|
]);
|
|
194
207
|
switch (pre) {
|
|
195
208
|
case utils_1.PrefixV2.Ed25519PublicKey:
|
|
@@ -200,5 +213,7 @@ function publicKeyFromString(src) {
|
|
|
200
213
|
return new ec_key_1.ECPublicKey(keyData, 'p256');
|
|
201
214
|
case utils_1.PrefixV2.BLS12_381PublicKey:
|
|
202
215
|
return new bls_key_1.BLSPublicKey(keyData);
|
|
216
|
+
case utils_1.PrefixV2.MLDSA44PublicKey:
|
|
217
|
+
return new mldsa_key_1.MLDSAPublicKey(keyData);
|
|
203
218
|
}
|
|
204
219
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _MLDSAKey_key, _MLDSAPublicKey_key;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MLDSAPublicKey = exports.MLDSAKey = void 0;
|
|
16
|
+
const ml_dsa_js_1 = require("@noble/post-quantum/ml-dsa.js");
|
|
17
|
+
const blake2_js_1 = require("@noble/hashes/blake2.js");
|
|
18
|
+
const core_1 = require("@taquito/core");
|
|
19
|
+
const utils_1 = require("@taquito/utils");
|
|
20
|
+
// Octez stores the 2560-byte ML-DSA-44 secret followed by its 1312-byte public key.
|
|
21
|
+
const SECRET_KEY_SIZE = 2560;
|
|
22
|
+
class MLDSAKey {
|
|
23
|
+
constructor(key, decrypt) {
|
|
24
|
+
_MLDSAKey_key.set(this, void 0);
|
|
25
|
+
const [encoded, prefix] = (0, utils_1.b58DecodeAndCheckPrefix)(key, [
|
|
26
|
+
utils_1.PrefixV2.MLDSA44SecretKey,
|
|
27
|
+
utils_1.PrefixV2.MLDSA44EncryptedSecretKey,
|
|
28
|
+
]);
|
|
29
|
+
let data = encoded;
|
|
30
|
+
if (prefix === utils_1.PrefixV2.MLDSA44EncryptedSecretKey) {
|
|
31
|
+
if (!decrypt)
|
|
32
|
+
throw new Error('decryption function is not provided');
|
|
33
|
+
data = decrypt(data);
|
|
34
|
+
}
|
|
35
|
+
if (data.length !== utils_1.payloadLength[utils_1.PrefixV2.MLDSA44SecretKey]) {
|
|
36
|
+
throw new core_1.InvalidKeyError('Invalid ML-DSA-44 secret key length');
|
|
37
|
+
}
|
|
38
|
+
__classPrivateFieldSet(this, _MLDSAKey_key, Uint8Array.from(data), "f");
|
|
39
|
+
}
|
|
40
|
+
sign(message) {
|
|
41
|
+
// Octez uses pure ML-DSA with an empty context over Blake2b-256(message),
|
|
42
|
+
// not HashML-DSA. InMemorySigner has already prepended any watermark.
|
|
43
|
+
const rawSignature = ml_dsa_js_1.ml_dsa44.sign((0, blake2_js_1.blake2b)(message, { dkLen: 32 }), __classPrivateFieldGet(this, _MLDSAKey_key, "f").subarray(0, SECRET_KEY_SIZE));
|
|
44
|
+
const encoded = (0, utils_1.b58Encode)(rawSignature, utils_1.PrefixV2.MLDSA44Signature);
|
|
45
|
+
return { rawSignature, sig: encoded, prefixSig: encoded };
|
|
46
|
+
}
|
|
47
|
+
publicKey() {
|
|
48
|
+
return new MLDSAPublicKey(__classPrivateFieldGet(this, _MLDSAKey_key, "f").subarray(SECRET_KEY_SIZE));
|
|
49
|
+
}
|
|
50
|
+
secretKey() {
|
|
51
|
+
return (0, utils_1.b58Encode)(__classPrivateFieldGet(this, _MLDSAKey_key, "f"), utils_1.PrefixV2.MLDSA44SecretKey);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.MLDSAKey = MLDSAKey;
|
|
55
|
+
_MLDSAKey_key = new WeakMap();
|
|
56
|
+
class MLDSAPublicKey {
|
|
57
|
+
constructor(src) {
|
|
58
|
+
_MLDSAPublicKey_key.set(this, void 0);
|
|
59
|
+
const key = typeof src === 'string' ? (0, utils_1.b58DecodeAndCheckPrefix)(src, [utils_1.PrefixV2.MLDSA44PublicKey])[0] : src;
|
|
60
|
+
if (key.length !== utils_1.payloadLength[utils_1.PrefixV2.MLDSA44PublicKey]) {
|
|
61
|
+
throw new utils_1.InvalidPublicKeyError('Invalid ML-DSA-44 public key length');
|
|
62
|
+
}
|
|
63
|
+
__classPrivateFieldSet(this, _MLDSAPublicKey_key, Uint8Array.from(key), "f");
|
|
64
|
+
}
|
|
65
|
+
compare(other) {
|
|
66
|
+
if (!(other instanceof MLDSAPublicKey)) {
|
|
67
|
+
throw new utils_1.InvalidPublicKeyError('ML-DSA-44 key expected');
|
|
68
|
+
}
|
|
69
|
+
return (0, utils_1.compareArrays)(__classPrivateFieldGet(this, _MLDSAPublicKey_key, "f"), __classPrivateFieldGet(other, _MLDSAPublicKey_key, "f"));
|
|
70
|
+
}
|
|
71
|
+
hash() {
|
|
72
|
+
return (0, utils_1.b58Encode)((0, blake2_js_1.blake2b)(__classPrivateFieldGet(this, _MLDSAPublicKey_key, "f"), { dkLen: 20 }), utils_1.PrefixV2.MLDSA44PublicKeyHash);
|
|
73
|
+
}
|
|
74
|
+
bytes() {
|
|
75
|
+
return __classPrivateFieldGet(this, _MLDSAPublicKey_key, "f").slice();
|
|
76
|
+
}
|
|
77
|
+
toProtocol() {
|
|
78
|
+
return (0, utils_1.mergebuf)(new Uint8Array([4]), __classPrivateFieldGet(this, _MLDSAPublicKey_key, "f"));
|
|
79
|
+
}
|
|
80
|
+
toString() {
|
|
81
|
+
return (0, utils_1.b58Encode)(__classPrivateFieldGet(this, _MLDSAPublicKey_key, "f"), utils_1.PrefixV2.MLDSA44PublicKey);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.MLDSAPublicKey = MLDSAPublicKey;
|
|
85
|
+
_MLDSAPublicKey_key = new WeakMap();
|
package/dist/lib/version.js
CHANGED
|
@@ -3,6 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
// IMPORTANT: THIS FILE IS AUTO GENERATED! DO NOT MANUALLY EDIT!
|
|
5
5
|
exports.VERSION = {
|
|
6
|
-
"commitHash": "
|
|
7
|
-
"version": "25.
|
|
6
|
+
"commitHash": "a1d45363559ba27998bbc263b69c961710e4710a",
|
|
7
|
+
"version": "25.1.0-beta0"
|
|
8
8
|
};
|