mirror of https://github.com/qortal/qortal-ui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33 lines
1.5 KiB
33 lines
1.5 KiB
import { HmacSha512, AES_CBC } from 'asmcrypto.js' |
|
import { kdf } from './kdf.js' |
|
// import Base58 from '../qora/deps/Base58.js' |
|
import Base58 from './deps/Base58.js' |
|
|
|
const getRandomValues = window.crypto ? window.crypto.getRandomValues.bind(window.crypto) : window.msCrypto.getRandomValues.bind(window.msCrypto) |
|
|
|
export const generateSaveWalletData = async (wallet, password, kdfThreads, statusUpdateFn) => { |
|
statusUpdateFn('Generating random values') |
|
let iv = new Uint8Array(16) |
|
getRandomValues(iv) |
|
let salt = new Uint8Array(32) |
|
getRandomValues(salt) // Can actually use a salt this time, as we can store the salt with the wallet |
|
|
|
// const key = PBKDF2_HMAC_SHA512.bytes(utils.stringtoUTF8Array(password), salt, PBKDF2_ROUNDS, 64) // 512bit key to be split in two for mac/encryption |
|
const key = await kdf(password, salt, statusUpdateFn) |
|
statusUpdateFn('Encrypting seed') |
|
const encryptionKey = key.slice(0, 32) |
|
const macKey = key.slice(32, 63) |
|
const encryptedSeed = AES_CBC.encrypt(wallet._byteSeed, encryptionKey, false, iv) |
|
// const mac = HmacSha512.bytes(encryptedSeed, macKey) |
|
statusUpdateFn('Generating mac') |
|
const mac = new HmacSha512(macKey).process(encryptedSeed).finish().result |
|
return { |
|
address0: wallet._addresses[0].address, |
|
encryptedSeed: Base58.encode(encryptedSeed), |
|
salt: Base58.encode(salt), |
|
iv: Base58.encode(iv), |
|
version: wallet._walletVersion, |
|
mac: Base58.encode(mac), |
|
kdfThreads |
|
} |
|
}
|
|
|