-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAE_libray.js
142 lines (105 loc) · 4.46 KB
/
AE_libray.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
const bip39 = require("bip39");
const { hdkey } = require("ethereumjs-wallet");
const Wallet = require('ethereumjs-wallet').default;
const { base58_to_binary } = require('base58-js');
const { ethers } = require("ethers");
const { toChecksumAddress } = require('ethereum-checksum-address');
module.exports = { hexadice, createHDWalletFromMnemonic, createHDWalletFromSeed, createRO_HDWalletFromPublicExtendedKey,
getWalletFromHDWallet, getPrivateExtendedKey, getPublicExtendedKey,getAddressFromPublicKey, getHDWalletDerivation, hexConversionFromBinary,
getPrivateKeyFromExtended, getPublicKeyFromExtended, getEthereumWalletFromPrivateKey, signMessage, getAdressFromSignedMessage,
verifyMessageSignature, verifyMessageByPublicExtendedKey, getRandomInt, getRandomIntDerivation}
function hexadice(value) {
conversion = value.toString(16).padStart(2,"0");
return conversion;
}
// Create HDWallet
function createHDWalletFromMnemonic(mnemonic) {
const seed = bip39.mnemonicToSeedSync(mnemonic)
return hdkey.fromMasterSeed(seed);
}
function createHDWalletFromSeed(seed){
return hdkey.fromMasterSeed(seed);
}
function createRO_HDWalletFromPublicExtendedKey(publicExtendedKey) {
return hdkey.fromExtendedKey(publicExtendedKey);
}
function getWalletFromHDWallet(HDWallet) {
return HDWallet.getWallet()
}
function getPrivateExtendedKey(HDWallet) {
return HDWallet.privateExtendedKey();
}
function getAddressFromPublicKey(publicKeyStr) {
return fromPublicKey(publicKeyStr).getAddressString();
}
function getPublicExtendedKey(HDWallet) {
return HDWallet.publicExtendedKey();
}
function getHDWalletDerivation(HDWallet, derivation) {
//Require stating with 'm' as in 'm/2/3'
return HDWallet.derivePath(derivation);
}
function hexConversionFromBinary(binaryAddress, init, length)
{
hexConversionREAD = "";
i = 0;
binaryAddress.forEach(element => {
hexConversionREAD+= hexadice(element,i);
i++;
});
if (init === undefined || length === undefined) {
return "0x"+hexConversionREAD;
}
else {
return "0x"+hexConversionREAD.substring(init, init + length);
}
}
function getPrivateKeyFromExtended(privateExtendedKey) {
//From: https://learnmeabitcoin.com/technical/extended-keys#:~:text=An%20extended%20key%20is%20a,public%20keys%20in%20your%20wallet.
const bin = base58_to_binary(privateExtendedKey);
return hexConversionFromBinary(bin,92,64);
}
function getPublicKeyFromExtended(publicExtendedKey) {
const bin = base58_to_binary(publicExtendedKey);
return hexConversionFromBinary(bin,90,66);
}
function getEthereumWalletFromPrivateKey(privateKey) {
return new ethers.Wallet(privateKey)
}
async function signMessage(etherumWallet, message) {
return await etherumWallet.signMessage(message);
}
function getAdressFromSignedMessage(message, signature) {
return ethers.utils.verifyMessage(message, signature );
}
function verifyMessageSignature(message, signature, address) {
return (toChecksumAddress(address) === toChecksumAddress(getAdressFromSignedMessage(message, signature)) )
}
function verifyMessageByPublicExtendedKey(message, signature, extendedPublicKey) {
// Entity has to validate the signature of the message with the "/0" derivation of the relationship_public_key that Entity already knows
// First create a wallet for Public Key derivations
relationship_public_key_wallet = createRO_HDWalletFromPublicExtendedKey(extendedPublicKey);
// get an Ethereum wallet from the HDWallet
relationship_public_key_wallet_login_validator = getWalletFromHDWallet(relationship_public_key_wallet);
// get the Address of that wallet
relationship_public_key_wallet_login_address = relationship_public_key_wallet_login_validator.getAddressString();
// In the other hand get the Address form the signature
signed_login_address = getAdressFromSignedMessage(message,signature);
// Compare both Addresses, use toChecksumAddress just in case any of them is not normalized
if (toChecksumAddress(relationship_public_key_wallet_login_address) === toChecksumAddress(signed_login_address))
{
console.log ("VALID SIGNATURE");
return true;
}
else
{
console.log ("INCORRECT SIGNATURE");
return false;
}
}
function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
function getRandomIntDerivation() {
return Math.floor(Math.random() * 2147483648);
}