bm-create-enc-payload/index.js

120 lines
4.8 KiB
JavaScript

// var messages = require('bitmessage').messages;
// var objects = require('bitmessage').objects;
// var Address = require('bitmessage').Address;
// var TcpTransport = require('bitmessage-transports').TcpTransport;
var crypto = require("crypto");
var eccrypto = require("eccrypto");
var assert = exports.assert = function(condition, message) {
if (!condition) {
throw new Error(message || "Assertion failed");
}
};
(async () => {
const encPublicKey = Buffer.from(
'0409d4e5c0ab3d25fe048c64c9da1a242c7f19417e9517cd266950d72c755713585c6178e97fe092fc897c9a1f1720d5770ae8eaad2fa8fcbd08e9324a5dde1857', 'hex'
);
const message = Buffer.from('The quick brown fox jumps over the lazy dog.');
const ephemPublicKey = Buffer.from(
'02ca00200293213dcf1388b61c2ae5cf80fee6ffffc049a2f9fe7365fe3867813ca812920020df94686c6afb565ac6149b153d61b3b287ee2c7f997c14238796c12b43a3865a', 'hex'
);
const sampleOpts = {
iv: Buffer.from('bddb7c2829b08038753084a2f3991681', 'hex'),
ephemPrivateKey: Buffer.from(
'5be6facd941b76e9d3ead03029fbdb6b6e0809293f7fb197d0c51f84e96b8ba4',
'hex'
)
};
const sampleCiphertext = '64203d5b24688e2547bba345fa139a5a1d962220d4d48a0cf3b1572c0d95b61643a6f9a0d75af7eacc1bd957147bf723';
const sampleMACKey = 'f83f1e9cc5d6b8448d39dc6a9d5f5b7f460e4a78e9286ee8d91ce1660a53eacd';
const sampleMAC = 'f2526d61b4851fb23409863826fd206165edc021368c7946571cead69046e619';
var mackey = await eccrypto.derive(
sampleOpts.ephemPrivateKey, encPublicKey
).then(function(Px) {
var hash = crypto.createHash("sha512").update(Px).digest();
// var encryptionKey = hash.slice(0, 32);
var macKey = hash.slice(32);
return macKey
});
console.log('[mackey]', mackey.toString('hex'));
assert(mackey.toString('hex') == sampleMACKey, 'Bad MAC key!')
var alt_mac = crypto.createHmac("sha256", mackey).update(
Buffer.concat([
sampleOpts.iv, ephemPublicKey, Buffer.from(sampleCiphertext, 'hex')])
).digest()
console.log('[alt mac]', alt_mac.toString('hex'));
var encrypted = await eccrypto.encrypt(encPublicKey, message, sampleOpts);
console.log('[ephem pubkey]', encrypted.ephemPublicKey.toString('hex'));
console.log('[ciphertext]', encrypted.ciphertext.toString('hex'));
console.log('[mac]', encrypted.mac.toString('hex'));
assert(encrypted.ciphertext.toString('hex') == sampleCiphertext, 'Bad ciphertext!');
assert(encrypted.mac.toString('hex') == sampleMAC, 'Bad MAC!');
// const from = Address.fromPassphrase('loremipsum1');
// console.log('[from]', from.encode());
// console.log('[from sign priv key]', from.signPrivateKey.toString('hex'));
// console.log('[from version]', from.version);
// console.log('[from stream]', from.stream);
// console.log('[from behaviour]', from.behavior);
// const toAddr = Address.fromPassphrase('gru');
// console.log('[toAddr]', toAddr.encode());
// console.log('[toAddr enc pub key]', toAddr.encPublicKey.toString('hex'));
// console.log('[toAddr version]', toAddr.version);
// console.log('[toAddr stream]', toAddr.stream);
// console.log('[toAddr ripe]', toAddr.ripe);
// const encodedMsg = await objects.msg.encodePayloadAsync({
// ttl: 1800,
// from: from,
// to: toAddr,
// message: 'hey there!',
// subject: 'Lorem Ipsum',
// encoding: 2,
// friend: true,
// skipPow: true,
// });
// const strippedMsg = encodedMsg.slice(8);
// console.log('[check messages]', strippedMsg);
// console.log('[check messages]', strippedMsg.toString('hex'));
// var d = await objects.msg.decodePayloadAsync(encodedMsg, {
// skipPow: true,
// identities: toAddr,
// });
// console.log('[decoded]', d.message);
// const encPublicKey = '04a60f6cd97ecd16768215ef059ccfbb1840b736bcdb0763872ddfeef4c417d2ec8439383ce68de9a2b30ad44e9f0e56a13fc2895a6e41f7cf3757e46181d32dd0';
// const encPrivateKey = '2cb5ae4e8cf8c71d1221f5c6c46810b448207cacedd86cc52219c3f107048c10';
// const dec = await objects.msg.decPayloadTest(encPrivateKey, e);
// console.log('[dec]', dec);
// var encObj = encrypted.decode(buf);
// resolve(eccrypto.decrypt(privateKey, encObj));
})();
// var tcp = new TcpTransport({
// dnsSeeds: [['bootstrap8444.bitmessage.org', 8444]],
// });
// tcp.bootstrap().then(function (nodes) {
// var remoteHost = nodes[0][0];
// var remotePort = nodes[0][1];
// console.log('Connecting to', nodes[0]);
// tcp.connect(remotePort, remoteHost);
// });
// tcp.on('established', function (version) {
// console.log('Connection established to', version.userAgent);
// tcp.on('message', function (command, payload) {
// console.log('Got new', command, 'message');
// var decoded;
// if (command === 'addr') {
// decoded = messages.addr.decodePayload(payload);
// console.log('Got', decoded.addrs.length, 'node addresses');
// }
// });
// });