@alephium/web3 0.5.0-rc.12 → 0.5.0-rc.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { ExplorerProvider, NodeProvider } from '../api';
2
2
  import { node } from '../api';
3
- import { Account, EnableOptionsBase, Destination, SignDeployContractTxParams, SignDeployContractTxResult, SignExecuteScriptTxParams, SignExecuteScriptTxResult, SignMessageParams, SignMessageResult, SignTransferTxParams, SignTransferTxResult, SignUnsignedTxParams, SignUnsignedTxResult, SubmissionResult, SubmitTransactionParams, KeyType } from './types';
3
+ import { Account, EnableOptionsBase, Destination, SignDeployContractTxParams, SignDeployContractTxResult, SignExecuteScriptTxParams, SignExecuteScriptTxResult, SignMessageParams, SignMessageResult, SignTransferTxParams, SignTransferTxResult, SignUnsignedTxParams, SignUnsignedTxResult, SubmissionResult, SubmitTransactionParams, KeyType, MessageHasher } from './types';
4
4
  export declare abstract class SignerProvider {
5
5
  abstract get nodeProvider(): NodeProvider | undefined;
6
6
  abstract get explorerProvider(): ExplorerProvider | undefined;
@@ -52,7 +52,9 @@ export declare abstract class SignerProviderWithCachedAccounts<T extends Account
52
52
  getAccounts(): Promise<T[]>;
53
53
  getAccount(address: string): Promise<T>;
54
54
  }
55
- export declare function verifySignedMessage(message: string, publicKey: string, signature: string, keyType?: KeyType): boolean;
55
+ export declare function extendMessage(message: string): string;
56
+ export declare function hashMessage(message: string, hasher: MessageHasher): string;
57
+ export declare function verifySignedMessage(message: string, messageHasher: MessageHasher, publicKey: string, signature: string, keyType?: KeyType): boolean;
56
58
  export declare function toApiDestination(data: Destination): node.Destination;
57
59
  export declare function toApiDestinations(data: Destination[]): node.Destination[];
58
60
  export declare function fromApiDestination(data: node.Destination): Destination;
@@ -43,7 +43,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
43
43
  return (mod && mod.__esModule) ? mod : { "default": mod };
44
44
  };
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.fromApiDestination = exports.toApiDestinations = exports.toApiDestination = exports.verifySignedMessage = exports.SignerProviderWithCachedAccounts = exports.SignerProviderWithMultipleAccounts = exports.SignerProviderSimple = exports.InteractiveSignerProvider = exports.SignerProvider = void 0;
46
+ exports.fromApiDestination = exports.toApiDestinations = exports.toApiDestination = exports.verifySignedMessage = exports.hashMessage = exports.extendMessage = exports.SignerProviderWithCachedAccounts = exports.SignerProviderWithMultipleAccounts = exports.SignerProviderSimple = exports.InteractiveSignerProvider = exports.SignerProvider = void 0;
47
+ const buffer_1 = require("buffer/");
48
+ const crypto_1 = require("crypto");
47
49
  const api_1 = require("../api");
48
50
  const utils = __importStar(require("../utils"));
49
51
  const blakejs_1 = __importDefault(require("blakejs"));
@@ -135,9 +137,8 @@ class SignerProviderSimple extends SignerProvider {
135
137
  return { signature, ...response };
136
138
  }
137
139
  async signMessage(params) {
138
- const extendedMessage = extendMessage(params.message);
139
- const messageHash = blakejs_1.default.blake2b(extendedMessage, undefined, 32);
140
- const signature = await this.signRaw(params.signerAddress, utils.binToHex(messageHash));
140
+ const messageHash = hashMessage(params.message, params.messageHasher);
141
+ const signature = await this.signRaw(params.signerAddress, messageHash);
141
142
  return { signature: signature };
142
143
  }
143
144
  }
@@ -198,10 +199,27 @@ exports.SignerProviderWithCachedAccounts = SignerProviderWithCachedAccounts;
198
199
  function extendMessage(message) {
199
200
  return 'Alephium Signed Message: ' + message;
200
201
  }
201
- function verifySignedMessage(message, publicKey, signature, keyType) {
202
- const extendedMessage = extendMessage(message);
203
- const messageHash = blakejs_1.default.blake2b(extendedMessage, undefined, 32);
204
- return utils.verifySignature(utils.binToHex(messageHash), publicKey, signature, keyType);
202
+ exports.extendMessage = extendMessage;
203
+ function hashMessage(message, hasher) {
204
+ switch (hasher) {
205
+ case 'alephium':
206
+ return utils.binToHex(blakejs_1.default.blake2b(extendMessage(message), undefined, 32));
207
+ case 'sha256':
208
+ const sha256 = (0, crypto_1.createHash)('sha256');
209
+ sha256.update(buffer_1.Buffer.from(message));
210
+ return utils.binToHex(sha256.digest());
211
+ case 'blake2b':
212
+ return utils.binToHex(blakejs_1.default.blake2b(message, undefined, 32));
213
+ case 'identity':
214
+ return message;
215
+ default:
216
+ throw Error(`Invalid message hasher: ${hasher}`);
217
+ }
218
+ }
219
+ exports.hashMessage = hashMessage;
220
+ function verifySignedMessage(message, messageHasher, publicKey, signature, keyType) {
221
+ const messageHash = hashMessage(message, messageHasher);
222
+ return utils.verifySignature(messageHash, publicKey, signature, keyType);
205
223
  }
206
224
  exports.verifySignedMessage = verifySignedMessage;
207
225
  function toApiDestination(data) {
@@ -88,10 +88,12 @@ export interface SignUnsignedTxResult {
88
88
  gasAmount: number;
89
89
  gasPrice: Number256;
90
90
  }
91
+ export declare type MessageHasher = 'alephium' | 'sha256' | 'blake2b' | 'identity';
91
92
  export interface SignMessageParams {
92
93
  signerAddress: string;
93
94
  signerKeyType?: KeyType;
94
95
  message: string;
96
+ messageHasher: MessageHasher;
95
97
  }
96
98
  export interface SignMessageResult {
97
99
  signature: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alephium/web3",
3
- "version": "0.5.0-rc.12",
3
+ "version": "0.5.0-rc.13",
4
4
  "description": "A JS/TS library to interact with the Alephium platform",
5
5
  "license": "GPL",
6
6
  "main": "dist/src/index.js",
@@ -16,6 +16,8 @@ You should have received a copy of the GNU Lesser General Public License
16
16
  along with the library. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
18
 
19
+ import { Buffer } from 'buffer/'
20
+ import { createHash } from 'crypto'
19
21
  import { ExplorerProvider, fromApiNumber256, fromApiTokens, NodeProvider, toApiNumber256, toApiTokens } from '../api'
20
22
  import { node } from '../api'
21
23
  import * as utils from '../utils'
@@ -38,7 +40,8 @@ import {
38
40
  SignUnsignedTxResult,
39
41
  SubmissionResult,
40
42
  SubmitTransactionParams,
41
- KeyType
43
+ KeyType,
44
+ MessageHasher
42
45
  } from './types'
43
46
  import { TransactionBuilder } from './tx-builder'
44
47
  import { addressFromPublicKey, groupOfAddress } from '../utils'
@@ -176,9 +179,8 @@ export abstract class SignerProviderSimple extends SignerProvider {
176
179
  }
177
180
 
178
181
  async signMessage(params: SignMessageParams): Promise<SignMessageResult> {
179
- const extendedMessage = extendMessage(params.message)
180
- const messageHash = blake.blake2b(extendedMessage, undefined, 32)
181
- const signature = await this.signRaw(params.signerAddress, utils.binToHex(messageHash))
182
+ const messageHash = hashMessage(params.message, params.messageHasher)
183
+ const signature = await this.signRaw(params.signerAddress, messageHash)
182
184
  return { signature: signature }
183
185
  }
184
186
 
@@ -242,14 +244,36 @@ export abstract class SignerProviderWithCachedAccounts<T extends Account> extend
242
244
  }
243
245
  }
244
246
 
245
- function extendMessage(message: string): string {
247
+ export function extendMessage(message: string): string {
246
248
  return 'Alephium Signed Message: ' + message
247
249
  }
248
250
 
249
- export function verifySignedMessage(message: string, publicKey: string, signature: string, keyType?: KeyType): boolean {
250
- const extendedMessage = extendMessage(message)
251
- const messageHash = blake.blake2b(extendedMessage, undefined, 32)
252
- return utils.verifySignature(utils.binToHex(messageHash), publicKey, signature, keyType)
251
+ export function hashMessage(message: string, hasher: MessageHasher): string {
252
+ switch (hasher) {
253
+ case 'alephium':
254
+ return utils.binToHex(blake.blake2b(extendMessage(message), undefined, 32))
255
+ case 'sha256':
256
+ const sha256 = createHash('sha256')
257
+ sha256.update(Buffer.from(message))
258
+ return utils.binToHex(sha256.digest())
259
+ case 'blake2b':
260
+ return utils.binToHex(blake.blake2b(message, undefined, 32))
261
+ case 'identity':
262
+ return message
263
+ default:
264
+ throw Error(`Invalid message hasher: ${hasher}`)
265
+ }
266
+ }
267
+
268
+ export function verifySignedMessage(
269
+ message: string,
270
+ messageHasher: MessageHasher,
271
+ publicKey: string,
272
+ signature: string,
273
+ keyType?: KeyType
274
+ ): boolean {
275
+ const messageHash = hashMessage(message, messageHasher)
276
+ return utils.verifySignature(messageHash, publicKey, signature, keyType)
253
277
  }
254
278
 
255
279
  export function toApiDestination(data: Destination): node.Destination {
@@ -136,12 +136,19 @@ export interface SignUnsignedTxResult {
136
136
  }
137
137
  assertType<Eq<SignUnsignedTxResult, SignTransferTxResult>>
138
138
 
139
+ export type MessageHasher =
140
+ | 'alephium' // Message is prefixed with 'Alephium signed message: ' before hashed with blake2b
141
+ | 'sha256'
142
+ | 'blake2b'
143
+ | 'identity' // No hash is used, the message to be 32 bytes
144
+
139
145
  export interface SignMessageParams {
140
146
  signerAddress: string
141
147
  signerKeyType?: KeyType
142
148
  message: string
149
+ messageHasher: MessageHasher
143
150
  }
144
- assertType<Eq<SignMessageParams, { message: string } & SignerAddress>>()
151
+ assertType<Eq<SignMessageParams, { message: string; messageHasher: MessageHasher } & SignerAddress>>()
145
152
  export interface SignMessageResult {
146
153
  signature: string
147
154
  }