/** * Implements WIF encoding/decoding. * @see {@link https://en.bitcoin.it/wiki/Wallet_import_format} * @module bitmessage/wif */ "use strict"; var bufferEqual = require("buffer-equal"); var bs58 = require("bs58"); var assert = require("./_util").assert; var bmcrypto = require("./crypto"); // Compute the WIF checksum for the given data. function getwifchecksum(data) { return bmcrypto.sha256(bmcrypto.sha256(data)).slice(0, 4); } /** * Decode WIF-encoded private key (corresponded to a uncompressed public * key). * @param {string} wif - Encoded key * @return {Buffer} Private key. */ exports.decode = function(wif) { var bytes = bs58.decode(wif); assert(bytes[0] === 0x80, "Bad WIF"); var data = Buffer.from(bytes.slice(0, -4)); var checksum = Buffer.from(bytes.slice(-4)); assert(bufferEqual(checksum, getwifchecksum(data)), "Bad checkum"); return data.slice(1); }; /** * Convert private key to a WIF (corresponded to a uncompressed public * key). * @param {Buffer} privateKey - A private key to encode * @return {string} WIF-encoded private key. */ exports.encode = function(privateKey) { var data = Buffer.concat([Buffer.from([0x80]), privateKey]); var checksum = getwifchecksum(data); var bytes = Buffer.concat([data, checksum]); return bs58.encode(bytes); };