diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 6fdf61a..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,30 +0,0 @@ -This software is licensed under the MIT License. - -Copyright (c) 2014 Ryan X. Charles - -Parts of this software are based on bitcore -Copyright (c) 2014 BitPay Inc. - -Parts of this software are based on BitcoinJS -Copyright (c) 2011 Stefan Thomas - -Parts of this software are based on BitcoinJ -Copyright (c) 2011 Google Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/examples.md b/examples.md deleted file mode 100755 index 8f30031..0000000 --- a/examples.md +++ /dev/null @@ -1,1104 +0,0 @@ -#Address.js - 'use strict'; - - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Address = bitcore.Address; - - var addrs = [ - '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', - '1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx', - 'A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', - '1600 Pennsylvania Ave NW', - ].map(function(addr) { - return new Address(addr); - }); - - addrs.forEach(function(addr) { - var valid = addr.isValid(); - console.log(addr.data + ' is ' + (valid ? '' : 'not ') + 'valid'); - }); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#Armory.js - var Armory = require('../lib/Armory'); - var Address = require('../lib/Address'); - - // Initial public key can be retrieved from paper backup - - var PublicX = '9df5 23e7 18b9 1f59 a790 2d46 999f 9357 ccf8 7208 24d4 3076 4516 b809 f7ab ce4e'; - var PublicY = '66ba 5d21 4682 0dae 401d 9506 8437 2516 79f9 0c56 4186 cc50 07df c6d0 6989 1ff4'; - var pubkey = '04' + PublicX.split(' ').join('') + PublicY.split(' ').join(''); - - // Chain code can be generated by entering paper backup - // on brainwallet.org/#chains or by using Armory.fromSeed() below - - var chaincode = '84ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e'; - - var armory = new Armory(chaincode, pubkey); - - console.log('Deriving public keys for'); - console.log('------------------------'); - console.log('Chain code: %s', chaincode); - console.log('Public key: %s', pubkey); - console.log(''); - - for (var i = 0; i < 5; i++) { - console.log(Address.fromPubKey(armory.pubkey).as('base58')); - armory = armory.next(); - } - - // Derive first public key and chain code from seed - var seed = [ - 'aagh hjfj sihk ietj giik wwai awtd uodh hnji', - 'soss uaku egod utai itos fijj ihgi jhau jtoo' - ]; - - console.log(''); - console.log(''); - console.log('Deriving public keys for'); - console.log('------------------------'); - console.log('Seed: %s', seed.join(' ')); - console.log(''); - - // skip first public key - var a = Armory.fromSeed(seed.join('\n')).next(); - - for (var i = 0; i < 5; i++) { - console.log(Address.fromPubKey(a.pubkey).as('base58')); - a = a.next(); - } - - - var mpk = '045a09a3286873a72f164476bde9d1d8e5c2bc044e35aa47eb6e798e325a86417f7c35b61d9905053533e0b4f2a26eca0330aadf21c638969e45aaace50e4c0c8784ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e'; - - console.log(''); - console.log(''); - console.log('Deriving public keys for'); - console.log('------------------------'); - console.log('Master Public Key: %s', mpk); - console.log(''); - - // skip first public key - var b = Armory.fromMasterPublicKey(mpk).next(); - - for (var i = 0; i < 5; i++) { - console.log(Address.fromPubKey(b.pubkey).as('base58')); - b = b.next(); - } - -#ConnectionTor.js - var Peer = require('../lib/Peer'); - var Connection = require('../lib/Connection'); - var dns = require('dns'); - - // get a peer from dns seed - dns.resolve('dnsseed.bluematt.me', function(err, seeds) { - // use the first peer - var peer = new Peer(seeds[0], 8333); - - //Custom peer: - //var peer = new Peer('180.153.139.246', '8888'); - - // create a connection without an existing socket - // but specify a socks5 proxy to create a socket - // that's bound to that proxy in it's place - var connection = new Connection(null, peer, { - proxy: { - host: '127.0.0.1', - port: 9050 - } - }); - - connection.open(); - - connection.on('connect', function(data) { - console.log('connected through socks5!'); - }); - - connection.on('error', function(err) { - console.log('There was an error running this example.'); - console.log('Are you running Tor? Tor must running for this example to work.'); - console.log('If you still get an error, you may need to use a different proxy from here:'); - console.log('http://sockslist.net/'); - //console.log(err); - }); - - }); - -#CreateAndSignTx-Multisig.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - var networks = require('../networks'); - var WalletKey = bitcore.WalletKey; - var Builder = bitcore.TransactionBuilder; - var opts = { - network: networks.testnet - }; - - console.log('## Network: ' + opts.network.name); - - var input = {}; - input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp"; - input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V"; - - // Complete with the corresponding UTXO you want to use - var utxos = [{ - address: input.addr, - txid: "39c71ebda371f75f4b854a720eaf9898b237facf3c2b101b58cd4383a44a6adc", - vout: 1, - scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac", - amount: 0.4296, - confirmations: 2 - }]; - - var privs = [ - "cP6JBHuQf7yqeqtdKRd22ibF3VehDv7G6BdzxSNABgrv3jFJUGoN", - "cQfRwF7XLSM5xGUpF8PZvob2MZyULvZPA2j5cat2RKDJrja7FtCZ", - "cUkYub4jtFVYymHh38yMMW36nJB4pXG5Pzd5QjResq79kAndkJcg", - "cMyBgowsyrJRufoKWob73rMQB1PBqDdwFt8z4TJ6APN2HkmX1Ttm", - "cN9yZCom6hAZpHtCp8ovE1zFa7RqDf3Cr4W6AwH2tp59Jjh9JcXu", - ]; - - var pubkeys = [] - privs.forEach(function(p) { - var wk = new WalletKey(opts); - wk.fromObj({ - priv: p - }); - pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public)); - }); - - - var outs = [{ - nreq: 3, - pubkeys: pubkeys, - amount: 0.05 - }]; - var tx = new Builder(opts) - .setUnspent(utxos) - .setOutputs(outs) - .sign([input.priv]) - .build(); - var txHex = tx.serialize().toString('hex'); - console.log('1) SEND TO MULSISIG TX: ', txHex); - console.log('[this example originally generated TXID: e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5 on testnet]\n\n\thttp://test.bitcore.io/tx/e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5\n\n'); - - - //save scriptPubKey - var scriptPubKey = tx.outs[0].s.toString('hex'); - - /* - * - * REDDEEM TX - */ - var utxos2 = [{ - address: input.addr, - txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5", - vout: 0, - scriptPubKey: scriptPubKey, - amount: 0.05, - confirmations: 2 - }]; - - outs = [{ - address: input.addr, - amount: 0.04 - }]; - var b = new Builder(opts) - .setUnspent(utxos2) - .setOutputs(outs) - .sign(privs); - - - tx = b.build(); - - - var txHex = tx.serialize().toString('hex'); - console.log('2) REDEEM SCRIPT: ', txHex); - console.log('=> Is signed status:', b.isFullySigned(), tx.countInputMissingSignatures(0)); - - console.log('[this example originally generated TXID: 1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83 on testnet]\n\n\thttp://test.bitcore.io/tx/1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83'); - - }; - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - - //// - -#CreateAndSignTx-PayToPubkeyHash.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - - var priv = 'cTgGUrcro89yUtKeG6gHBAS14r3qp25KwTTxG9d4kEzcFxecuZDm'; - var amt = '0.005'; - var toAddress = 'myuAQcCc1REUgXGsCTiYhZvPPc3XxZ36G1'; - var changeAddressString = 'moDz3jEo9q7CxjBDjmb13sL4SKkgo2AACE'; - - var utxos = [{ - address: "mqSjTad2TKbPcKQ3Jq4kgCkKatyN44UMgZ", - txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", - vout: 1, - scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac", - amount: 0.01, - confirmations: 2 - }]; - - console.log('TX Data: BTC:' + amt + ' => ' + toAddress + ', change To:' + changeAddressString); - console.log('Unspends Outputs:', utxos); - - - var outs = [{ - address: toAddress, - amount: amt - }]; - var keys = [priv]; - var opts = { - remainderOut: { - address: changeAddressString - } - }; - var Builder = bitcore.TransactionBuilder; - - var tx = new Builder(opts) - .setUnspent(utxos) - .setOutputs(outs) - .sign(keys) - .build(); - - /* create and signing can be done in multiple steps using: - * - * var builder = new bitcore.TransactionBuilder(opts) - * .setUnspent(utxos) - * .setOutputs(outs); - * - * builder.sign(key1); - * builder.sign(key2); - * ... - * if (builder.isFullySigned()){ - * var tx = builder.build(); - * } - * - * The selected Unspent Outputs for the transaction can be retrieved with: - * - * var selectedUnspent = build.getSelectedUnspent(); - */ - - var txHex = tx.serialize().toString('hex'); - console.log('TX HEX IS: ', txHex); - }; - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - - //// - -#CreateAndSignTx-PayToScriptHash.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - var networks = require('../networks'); - var WalletKey = bitcore.WalletKey; - var Script = bitcore.Script; - var Builder = bitcore.TransactionBuilder; - var opts = { - network: networks.testnet - }; - - console.log('## Network: ' + opts.network.name); - - var input = {}; - input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp"; - input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V"; - - // Complete with the corresponding UTXO you want to use - var utxos = [{ - address: "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp", - txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5", - vout: 1, - scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac", - amount: 0.3795, - confirmations: 7 - }]; - - var privs = [ - "cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA", - "cVf32m9MR4vxcPwKNJuPepUe8XrHD2z63eCk76d6njRGyCkXpkSM", - "cQ2sVRFX4jQYMLhWyzz6jTQ2xju51P36968ecXnPhRLKLH677eKR", - "cSw7x9ERcmeWCU3yVBT6Nz7b9JiZ5yjUB7JMhBUv9UM7rSaDpwX9", - "cRQBM8qM4ZXJGP1De4D5RtJm7Q6FNWQSMx7YExxzgn2ehjM3haxW", - ]; - - var pubkeys = [] - privs.forEach(function(p) { - var wk = new WalletKey(opts); - wk.fromObj({ - priv: p - }); - pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public)); - }); - - // multisig p2sh - var opts = { - nreq: 3, - pubkeys: pubkeys - }; - - // p2scriphash p2sh - //var opts = [{address: an_address}]; - - var info = Builder.infoForP2sh(opts, 'testnet'); - var p2shScript = info.scriptBufHex; - var p2shAddress = info.address; - - - var outs = [{ - address: p2shAddress, - amount: 0.05 - }]; - var tx = new Builder(opts) - .setUnspent(utxos) - .setOutputs(outs) - .sign([input.priv]) - .build(); - - var txHex = tx.serialize().toString('hex'); - - - console.log('## p2sh address: ' + p2shAddress); //TODO - console.log('\n1) SEND TO P2SH TX: ', txHex); - console.log('[this example originally generated TXID: c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7 on testnet]\n\n\thttp://test.bitcore.io/tx/c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7\n\n'); - - //save scriptPubKey - var scriptPubKey = tx.outs[0].s.toString('hex'); - - /* - * - * REDDEEM TX - */ - var utxos2 = [{ - address: p2shAddress, - txid: "c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7", - vout: 0, - scriptPubKey: scriptPubKey, - amount: 0.05, - confirmations: 1 - }]; - - outs = [{ - address: input.addr, - amount: 0.04 - }]; - - var hashMap = {}; - hashMap[p2shAddress] = p2shScript; - - var b = new Builder(opts) - .setUnspent(utxos2) - .setHashToScriptMap(hashMap) - .setOutputs(outs) - .sign(privs); - - tx = b.build(); - - - console.log('Builder:'); - console.log('\tSignatures:' + tx.countInputMissingSignatures(0)); - console.log('\t#isFullySigned:' + b.isFullySigned()); - - console.log('TX:'); - console.log('\t #isComplete:' + tx.isComplete()); - - var txHex = tx.serialize().toString('hex'); - console.log('2) REDEEM SCRIPT: ', txHex); - console.log('[this example originally generated TXID: 8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7 on testnet]\n\n\thttp://test.bitcore.io/tx/8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7\n\n'); - - /* - // To send TX with RPC: - var RpcClient = bitcore.RpcClient; - var config = { - protocol: 'http', - user: 'user', - pass: 'pass', - host: '127.0.0.1', - port: '18332', - }; - var rpc = new RpcClient(config); - rpc.sendRawTransaction(txHex, function(err, ret) { - console.log('err', err); //TODO - console.log('ret', ret); //TODO - process.exit(-1); - }); - }; - */ - - }; - - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - -#CreateKey.js - 'use strict'; - - - - var run = function() { - // replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var networks = require('../networks'); - var WalletKey = bitcore.WalletKey; - - var opts = { - network: networks.testnet - }; - - function print(wk) { - - console.log('\n## Network: ' + wk.network.name); - console.log('\t * Hex Representation'); - console.log('\tPrivate: ' + bitcore.buffertools.toHex(wk.privKey.private)); - console.log('\tPublic : ' + bitcore.buffertools.toHex(wk.privKey.public)); - console.log('\tPublic Compressed : ' + (wk.privKey.compressed ? 'Yes' : 'No')); - - var wkObj = wk.storeObj(); - console.log('\n\t * WalletKey Store Object'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - }; - - //Generate a new one (compressed public key, compressed WIF flag) - var wk = new WalletKey(opts); - wk.generate(); - print(wk); - - //Generate from private Key WIF. Compressed status taken from WIF. - var wk2 = new WalletKey(opts); - wk2.fromObj({ - priv: 'cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA' - }); - print(wk2); - - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#CreateScript.js - 'use strict'; - - var run = function() { - // replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var networks = require('../networks'); - var Script = bitcore.Script; - var WalletKey = bitcore.WalletKey; - var buffertools = bitcore.buffertools; - var Address = bitcore.Address; - var util = bitcore.util; - var opts = { - network: networks.testnet - }; - - var p = console.log; - - var wk = new WalletKey(opts); - wk.generate(); - var wkObj = wk.storeObj(); - - var s = Script.createPubKeyOut(wk.privKey.public); - p('\nScript PubKey:'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - p('\tKey -------------------------------'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - - s = Script.createPubKeyHashOut(wk.privKey.public); - p('\nScript PubKeyHash:'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - p('\tKey -------------------------------'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - - var wks = []; - var pubs = []; - for (var i = 0; i < 5; i++) { - wks[i] = new WalletKey(opts); - wks[i].generate(); - pubs.push(wks[i].privKey.public); - } - - s = Script.createMultisig(3, pubs); - p('\nScript MultiSig (3 out of 5 required signatures):'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - - for (i = 0; i < 5; i++) { - wkObj = wks[i].storeObj(); - p('\tKey [' + i + '] -------------------------------'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - } - - var hash = util.sha256ripe160(s.buffer); - - s = Script.createP2SH(hash); - p('\nScript P2SH:'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - p('\tScript Hash: ' + buffertools.toHex(hash)); - var a = new Address(networks.livenet.P2SHVersion, hash); - p('\tp2sh Addr: ' + a.toString()); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#ECIES.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - - console.log('ECIES: Elliptic Curve Integrated Encryption Scheme'); - console.log('A way of encrypting with a public key and decrypting with a private key.'); - - var key = bitcore.Key.generateSync(); - console.log('Private key: ' + key.private.toString('hex')); - console.log('Public key: ' + key.public.toString('hex')); - - var message = new Buffer('This is a message to be encrypted'); - console.log('Message: "' + message.toString() + '"'); - - var encrypted = bitcore.ECIES.encrypt(key.public, message); - console.log('Encrypted (with public key): ' + encrypted.toString('hex')); - - var decrypted = bitcore.ECIES.decrypt(key.private, encrypted); - console.log('Decrypted (with private key): "' + decrypted.toString() + '"'); - }; - - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - -#ElectrumMPK.js - var Electrum = require('../lib/Electrum'); - var Address = require('../lib/Address'); - - var mpk = '92eea4d2f5263651db9e3222caded1fd4c89772f79a7c03fb6afc00e9d2c9d2ed9b86c2c95fc1171e49163079dacb7f048b3c509a27a490e1df9e7128362d468'; - - mpk = new Electrum(mpk); - - var key0 = mpk.generatePubKey(0); - var addr0 = Address.fromPubKey(key0); - - console.log(addr0.as('base58')); - -#HierarchicalKey.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - var HierarchicalKey = bitcore.HierarchicalKey; - var Address = bitcore.Address; - var networks = bitcore.networks; - var coinUtil = bitcore.util; - var crypto = require('crypto'); - - console.log('HierarchicalKey: Hierarchical Deterministic Wallets (BIP32)'); - console.log('https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n'); - console.log('1) Make new hkey from randomly generated new seed'); - - var randomBytes = crypto.randomBytes(32); - var hkey = HierarchicalKey.seed(randomBytes); - console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('2) Make new hkey from known seed'); - var knownBytes = coinUtil.sha256('do not use this password as a brain wallet'); - var hkey = HierarchicalKey.seed(knownBytes); - console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('3) Make new hkey from known master private key'); - var knownMasterPrivateKey = 'xprv9s21ZrQH143K2LvayFZWVVTomiDKheKWvnupDB8fmjKwxkKG47uvzmFa3vCXoy9fxPJhRYsU19apVfexvMeLpJQuF2XtX1zRF3eao9GqqaQ'; - var hkey = new HierarchicalKey(knownMasterPrivateKey); - console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('4) Make new hkey from known master public key'); - var knownMasterPublicKey = 'xpub661MyMwAqRbcGpiFufipqsKKBG1NHNwfJKishAEFNqJ6ryLcKeKyFNEZces7gMWd4XGg4uUhXy8DS64o1oPGUECVHeLq957Txjwagxt475H'; - var hkey = new HierarchicalKey(knownMasterPublicKey); - console.log('master extended private key: cannot derive'); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: cannot derive'); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('5) Make new hkey from known derived public key'); - var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; - var hkey = new HierarchicalKey(knownPublicKey); - console.log('master extended private key: cannot derive'); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: cannot derive'); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('6) Make a bunch of new addresses from known public key'); - var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; - var hkey = new HierarchicalKey(knownPublicKey); - console.log('m/0 address: ' + Address.fromPubKey(hkey.derive('m/0').eckey.public).toString()); - //console.log('m/1 extended public key: ' + hkey.derive('m/1').extendedPublicKeyString()); - console.log('m/1 address: ' + Address.fromPubKey(hkey.derive('m/1').eckey.public).toString()); - //console.log('m/2 extended public key: ' + hkey.derive('m/2').extendedPublicKeyString()); - console.log('m/2 address: ' + Address.fromPubKey(hkey.derive('m/2').eckey.public).toString()); - //console.log('m/3 extended public key: ' + hkey.derive('m/3').extendedPublicKeyString()); - console.log('m/3 address: ' + Address.fromPubKey(hkey.derive('m/3').eckey.public).toString()); - console.log('...'); - //console.log('m/100 extended public key: ' + hkey.derive('m/100').extendedPublicKeyString()); - console.log('m/100 address: ' + Address.fromPubKey(hkey.derive('m/100').eckey.public).toString()); - console.log(); - - }; - - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - -#PayToScriptHashAddress.js - var bitcore = require('../bitcore'); - var Address = bitcore.Address; - var bitcoreUtil = bitcore.util; - var Script = bitcore.Script; - var network = bitcore.networks.livenet; - - - var script = ''; // write down your script here - var s = Script.fromHumanReadable(script); - var hash = bitcoreUtil.sha256ripe160(s.getBuffer()); - var version = network.addressScript; - - var addr = new Address(version, hash); - var addrStr = addr.as('base58'); - - // This outputs the "address" of thescript - console.log(addrStr); - -#PeerDiscovery.js - var PeerManager = require('../lib/PeerManager'); - var peerman = new PeerManager(); - - peerman.discover({ - limit: 12 - }).start(); - -#PeerManager.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Peer = bitcore.Peer; - var PeerManager = bitcore.PeerManager; - - var handleBlock = function(info) { - console.log('** Block Received **'); - console.log(info.message); - }; - - var handleTx = function(info) { - var tx = info.message.tx.getStandardizedObject(); - - console.log('** TX Received **'); - console.log(tx); - }; - - var handleInv = function(info) { - console.log('** Inv **'); - console.log(info.message); - - var invs = info.message.invs; - info.conn.sendGetData(invs); - }; - - var peerman = new PeerManager({ - network: 'testnet' - }); - - peerman.addPeer(new Peer('127.0.0.1', 18333)); - - peerman.on('connection', function(conn) { - conn.on('inv', handleInv); - conn.on('block', handleBlock); - conn.on('tx', handleTx); - }); - - peerman.start(); - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#Rpc.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var RpcClient = bitcore.RpcClient; - var hash = '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; - - var config = { - protocol: 'http', - user: 'user', - pass: 'pass', - host: '127.0.0.1', - port: '18332', - }; - - var rpc = new RpcClient(config); - - rpc.getBlock(hash, function(err, ret) { - if (err) { - console.error('An error occured fetching block', hash); - console.error(err); - return; - } - console.log(ret); - }); - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#Script.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Address = bitcore.Address; - var coinUtil = bitcore.util; - var Script = bitcore.Script; - var network = bitcore.networks.testnet; - - var getAddrStr = function(s) { - var addrStrs = []; - var type = s.classify(); - var addr; - - switch (type) { - case Script.TX_PUBKEY: - var chunk = s.captureOne(); - addr = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk)); - addrStrs.push(addr.toString()); - break; - case Script.TX_PUBKEYHASH: - addr = new Address(network.addressVersion, s.captureOne()); - addrStrs.push(addr.toString()); - break; - case Script.TX_SCRIPTHASH: - addr = new Address(network.P2SHVersion, s.captureOne()); - addrStrs.push(addr.toString()); - break; - case Script.TX_MULTISIG: - var chunks = s.capture(); - chunks.forEach(function(chunk) { - var a = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk)); - addrStrs.push(a.toString()); - }); - break; - case Script.TX_UNKNOWN: - console.log('tx type unkown'); - break; - } - return addrStrs; - }; - - var script = 'DUP HASH160 0x14 0x3744841e13b90b4aca16fe793a7f88da3a23cc71 EQUALVERIFY CHECKSIG'; - var s = Script.fromHumanReadable(script); - console.log(getAddrStr(s)[0]); // mkZBYBiq6DNoQEKakpMJegyDbw2YiNQnHT - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#SendTx.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Peer = bitcore.Peer; - - var TransactionBuilder = bitcore.TransactionBuilder; - var PeerManager = bitcore.PeerManager; - - // Unspent transactions can be found via the insight.bitcore.io or blockchain.info APIs - var unspent = [{ - 'txid': '707108b5ba4f78dc951df4647a03365bf36432ea57fb641676045c5044daaea7', - 'vout': 0, - 'address': 'n3QDC7DzsMmN4mcyp3k7XGPX7zFXXHG387', - 'scriptPubKey': '76a914f00c4a92ee2314ab08ac0283dc8d07d9bf2be32388ac', - 'amount': 0.12345600, - 'confirmations': 43537 - }, { - 'txid': '87a158d32833cb555aea27b6a21af569ccaeb8f9b19691e05f1e6c2b3440bdb3', - 'vout': 1, - 'address': 'mxdrp9s4mVxS9X4RBYiLe99v59V81XA5C3', - 'scriptPubKey': '76a914bbc87986da6b17c7876db4efacf59a95e14f6cf588ac', - 'amount': 0.05749800, - 'confirmations': 43536 - } - - ]; - - // Private keys in WIF format (see TransactionBuilder.js for other options) - var keys = [ - 'cQA75LXhV5JkMT8wkkqjR87SnHK4doh3c21p7PAd5tp8tc1tRBAY', - 'cRz85dz9AiDieRpEwoucfXXQa1jdHHghcv6YnnVVGZ3MQyR1X4u2', - 'cSq7yo4fvsbMyWVN945VUGUWMaSazZPWqBVJZyoGsHmNq6W4HVBV', - 'cPa87VgwZfowGZYaEenoQeJgRfKW6PhZ1R65EHTkN1K19cSvc92G', - 'cPQ9DSbBRLva9av5nqeF5AGrh3dsdW8p2E5jS4P8bDWZAoQTeeKB' - ]; - - var peerman = new PeerManager({ - network: 'testnet' - }); - peerman.addPeer(new Peer('127.0.0.1', 18333)); - - peerman.on('connect', function() { - var conn = peerman.getActiveConnection(); - if (conn) { - // define transaction output - var outs = [{ - address: 'mhNCT9TwZAGF1tLPpZdqfkTmtBkY282YDW', - amount: 0.1337 - }]; - // set change address - var opts = { - remainderOut: { - address: 'n4g2TFaQo8UgedwpkYdcQFF6xE2Ei9Czvy' - } - }; - var tx = new TransactionBuilder(opts) - .setUnspent(unspent) - .setOutputs(outs) - .sign(keys) - .build(); - - /* Create and signing can be done in multiple steps: - * - * var builder = new bitcore.TransactionBuilder(opts) - * .setUnspent(utxos) - * .setOutputs(outs); - * - * // Sign with the first key - * builder.sign(key1); - * var tx = builder.build(); // Partially signed transaction - * - * // Sign with the second key - * builder.sign(key2); - * if (builder.isFullySigned()){ - * var tx = builder.build(); - * } - * - * var selectedUnspent = build.getSelectedUnspent(); // Retrieve selected unspent outputs from the transaction - */ - - var txid = tx.getHash().toString('hex'); - console.log('Created transaction with txid ' + txid); - var raw_tx = tx.serialize().toString('hex'); - console.log('Transaction raw hex dump:'); - console.log('-------------------------------------'); - console.log(raw_tx); - console.log('-------------------------------------'); - // finally, send transaction to the bitcoin network - conn.sendTx(tx); - - // for now, the network won't respond in any case - // (transaction accepted, transaction rejected) - // in the future, we may listen to 'reject' message - // see https://gist.github.com/gavinandresen/7079034 - } - }); - - peerman.start(); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - -#SimpleP2Pmonitor.js - /** - * This is a simple script that will display network messages. - * It users the Peer / Connection classes directly instead of - * relying on PeerManager. - */ - - // replace by require('bitcore') if you use somewhere else - var bitcore = require('../'); - - //bitcore.config.logger = 'debug'; - - var Peer = bitcore.Peer, - Connection = bitcore.Connection; - - var peer = new Peer('127.0.0.1', 8333); - - var socket = peer.createConnection(); - - var con = new Connection(socket, peer); - - con.on('error', function(msg) { - var peer = msg.peer, - err = msg.err; - console.error('Error connecting to peer', peer.host + ':' + peer.port, '(' + err.message + ')'); - }); - - con.on('disconnect', function(msg) { - console.log('disconnect: ', msg); - }); - - con.on('connect', function(msg) { - console.log('Connected to %s', msg.peer.host + ':' + msg.peer.port); - }); - - /* Listen P2P messages */ - - // Make a log function available to all listeners - // The log function is just like console.log except it prefixes - // messages with [host:port] - function listen(event_name, fn) { - con.on(event_name, function(event) { - fn(event, function() { - var args = Array.prototype.slice.call(arguments); - var str = args.shift(); - str = '[%s:%s] ' + str; - args = [str, event.peer.host, event.peer.port].concat(args); - console.log.apply(console, args); - }); - }); - } - - listen('getaddr', function(event, log) { - log('Received message getaddr'); - log(event); - }); - - listen('verack', function(event, log) { - log('Received message verack'); - }); - - listen('version', function(event, log) { - log('Received message version (%s)', event.message.version); - }); - - listen('addr', function(event, log) { - log('Received message addr (%s addresses)', event.message.addrs.length); - }); - - listen('inv', function(event, log) { - log('Received message inv (%s invs)', event.message.count); - console.log(event.message.invs); - }); - -#VanityAddress.js - 'use strict'; - - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Key = bitcore.Key; - var Address = bitcore.Address; - - // config your regular expression - var re = /[0-9]{6}$/; // ends in 6 digits - - var a, k, m; - while (true) { - k = Key.generateSync(); - a = Address.fromKey(k); - m = a.toString().match(re); - if (m) break; - } - console.log('Address: ' + a.toString()); - console.log('Private Key: ' + k.private.toString('hex')); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - diff --git a/index.js b/index.js index 144b8cd..efd44c6 100644 --- a/index.js +++ b/index.js @@ -29,17 +29,6 @@ bitcore.Txin = require('./lib/txin'); bitcore.Txout = require('./lib/txout'); bitcore.Varint = require('./lib/varint'); -//experimental, nonstandard, or unstable features -bitcore.expmt = {}; -bitcore.expmt.AES = require('./lib/expmt/aes'); -bitcore.expmt.AESCBC = require('./lib/expmt/aescbc'); -bitcore.expmt.CBC = require('./lib/expmt/cbc'); -bitcore.expmt.ECIES = require('./lib/expmt/ecies'); -bitcore.expmt.StealthAddress = require('./lib/expmt/stealthaddress'); -bitcore.expmt.Stealthkey = require('./lib/expmt/stealthkey'); -bitcore.expmt.StealthMessage = require('./lib/expmt/stealthmessage'); -bitcore.expmt.StealthTx = require('./lib/expmt/stealthtx'); - //dependencies, subject to change bitcore.deps = {}; bitcore.deps.aes = require('aes'); diff --git a/lib/expmt/aes.js b/lib/expmt/aes.js deleted file mode 100644 index 4117ed4..0000000 --- a/lib/expmt/aes.js +++ /dev/null @@ -1,47 +0,0 @@ -var aes = require('aes'); - -var AES = function AES() { -}; - -AES.encrypt = function(messagebuf, keybuf) { - var key = AES.buf2words(keybuf); - var message = AES.buf2words(messagebuf); - var a = new aes(key); - var enc = a.encrypt(message); - var encbuf = AES.words2buf(enc); - return encbuf; -}; - -AES.decrypt = function(encbuf, keybuf) { - var enc = AES.buf2words(encbuf); - var key = AES.buf2words(keybuf); - var a = new aes(key); - var message = a.decrypt(enc); - var messagebuf = AES.words2buf(message); - return messagebuf; -}; - -AES.buf2words = function(buf) { - if (buf.length % 4) - throw new Error('buf length must be a multiple of 4'); - - var words = []; - - for (var i = 0; i < buf.length / 4; i++) { - words.push(buf.readUInt32BE(i * 4)); - }; - - return words; -}; - -AES.words2buf = function(words) { - var buf = new Buffer(words.length * 4); - - for (var i = 0; i < words.length; i++) { - buf.writeUInt32BE(words[i], i * 4); - }; - - return buf; -}; - -module.exports = AES; diff --git a/lib/expmt/aescbc.js b/lib/expmt/aescbc.js deleted file mode 100644 index 401cb78..0000000 --- a/lib/expmt/aescbc.js +++ /dev/null @@ -1,34 +0,0 @@ -var AES = require('./aes'); -var CBC = require('./cbc'); -var Random = require('../random'); -var Hash = require('../hash'); - -// Symmetric encryption with AES and CBC convenience class -var AESCBC = function AESCBC() { -}; - -AESCBC.encrypt = function(messagebuf, passwordstr) { - var cipherkeybuf = Hash.sha256(new Buffer(passwordstr)); - return AESCBC.encryptCipherkey(messagebuf, cipherkeybuf); -}; - -AESCBC.decrypt = function(encbuf, passwordstr) { - var cipherkeybuf = Hash.sha256(new Buffer(passwordstr)); - return AESCBC.decryptCipherkey(encbuf, cipherkeybuf); -}; - -AESCBC.encryptCipherkey = function(messagebuf, cipherkeybuf, ivbuf) { - ivbuf = ivbuf || Random.getRandomBuffer(128 / 8); - var ctbuf = CBC.encrypt(messagebuf, ivbuf, AES, cipherkeybuf); - var encbuf = Buffer.concat([ivbuf, ctbuf]); - return encbuf; -}; - -AESCBC.decryptCipherkey = function(encbuf, cipherkeybuf) { - var ivbuf = encbuf.slice(0, 128 / 8); - var ctbuf = encbuf.slice(128 / 8); - var messagebuf = CBC.decrypt(ctbuf, ivbuf, AES, cipherkeybuf); - return messagebuf; -}; - -module.exports = AESCBC; diff --git a/lib/expmt/cbc.js b/lib/expmt/cbc.js deleted file mode 100644 index f509ba8..0000000 --- a/lib/expmt/cbc.js +++ /dev/null @@ -1,138 +0,0 @@ -var Random = require('../random'); - -// Cipher Block Chaining -// http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29 -var CBC = function CBC(blockcipher, cipherkeybuf, ivbuf) { - if (!(this instanceof CBC)) - return new CBC(blockcipher, cipherkeybuf, ivbuf); - - this.blockcipher = blockcipher; - this.cipherkeybuf = cipherkeybuf; - this.ivbuf = ivbuf; -}; - -CBC.buf2blockbufs = function(buf, blocksize) { - var bytesize = blocksize / 8; - var blockbufs = []; - - for (var i = 0; i <= buf.length / bytesize; i++) { - var blockbuf = buf.slice(i * bytesize, i * bytesize + bytesize); - - if (blockbuf.length < blocksize) - blockbuf = CBC.pkcs7pad(blockbuf, blocksize); - - blockbufs.push(blockbuf); - } - - return blockbufs; -}; - -CBC.blockbufs2buf = function(blockbufs, blocksize) { - var bytesize = blocksize / 8; - - var last = blockbufs[blockbufs.length - 1]; - last = CBC.pkcs7unpad(last); - blockbufs[blockbufs.length - 1] = last; - - var buf = Buffer.concat(blockbufs); - - return buf; -}; - -CBC.encrypt = function(messagebuf, ivbuf, blockcipher, cipherkeybuf) { - var blocksize = ivbuf.length * 8; - var blockbufs = CBC.buf2blockbufs(messagebuf, blocksize); - var encbufs = CBC.encryptblocks(blockbufs, ivbuf, blockcipher, cipherkeybuf); - var encbuf = Buffer.concat(encbufs); - return encbuf; -}; - -CBC.decrypt = function(encbuf, ivbuf, blockcipher, cipherkeybuf) { - var blocksize = ivbuf.length * 8; - var bytesize = ivbuf.length; - var encbufs = []; - for (var i = 0; i < encbuf.length / bytesize; i++) { - encbufs.push(encbuf.slice(i * bytesize, i * bytesize + bytesize)); - } - var blockbufs = CBC.decryptblocks(encbufs, ivbuf, blockcipher, cipherkeybuf); - var buf = CBC.blockbufs2buf(blockbufs, blocksize); - return buf; -}; - -CBC.encryptblock = function(blockbuf, ivbuf, blockcipher, cipherkeybuf) { - var xorbuf = CBC.xorbufs(blockbuf, ivbuf); - var encbuf = blockcipher.encrypt(xorbuf, cipherkeybuf); - return encbuf; -}; - -CBC.decryptblock = function(encbuf, ivbuf, blockcipher, cipherkeybuf) { - var xorbuf = blockcipher.decrypt(encbuf, cipherkeybuf); - var blockbuf = CBC.xorbufs(xorbuf, ivbuf); - return blockbuf; -}; - -CBC.encryptblocks = function(blockbufs, ivbuf, blockcipher, cipherkeybuf) { - var encbufs = []; - - for (var i = 0; i < blockbufs.length; i++) { - var blockbuf = blockbufs[i]; - var encbuf = CBC.encryptblock(blockbuf, ivbuf, blockcipher, cipherkeybuf); - - encbufs.push(encbuf); - - ivbuf = encbuf; - } - - return encbufs; -}; - -CBC.decryptblocks = function(encbufs, ivbuf, blockcipher, cipherkeybuf) { - var blockbufs = []; - - for (var i = 0; i < encbufs.length; i++) { - var encbuf = encbufs[i]; - var blockbuf = CBC.decryptblock(encbuf, ivbuf, blockcipher, cipherkeybuf); - - blockbufs.push(blockbuf); - - ivbuf = encbuf; - } - - return blockbufs; -}; - -CBC.pkcs7pad = function(buf, blocksize) { - var bytesize = blocksize / 8; - var padbytesize = bytesize - buf.length; - var pad = new Buffer(padbytesize); - pad.fill(padbytesize); - var paddedbuf = Buffer.concat([buf, pad]); - return paddedbuf; -}; - -CBC.pkcs7unpad = function(paddedbuf, blocksize) { - var bytesize = blocksize / 8; - var padbytesize = bytesize - paddedbuf.length; - var padlength = paddedbuf[paddedbuf.length - 1]; - var padbuf = paddedbuf.slice(paddedbuf.length - padlength, paddedbuf.length); - var padbuf2 = new Buffer(padlength); - padbuf2.fill(padlength); - if (padbuf.toString('hex') !== padbuf2.toString('hex')) - throw new Error('invalid padding'); - return paddedbuf.slice(0, paddedbuf.length - padlength); -}; - -CBC.xorbufs = function(buf1, buf2) { - if (buf1.length !== buf2.length) - throw new Error('bufs must have the same length'); - - var buf = new Buffer(buf1.length); - - for (var i = 0; i < buf1.length; i++) { - buf[i] = buf1[i] ^ buf2[i]; - } - - return buf; -}; - -module.exports = CBC; diff --git a/lib/expmt/ecies.js b/lib/expmt/ecies.js deleted file mode 100644 index 4eb4bff..0000000 --- a/lib/expmt/ecies.js +++ /dev/null @@ -1,55 +0,0 @@ -var AESCBC = require('./aescbc'); -var Keypair = require('../keypair'); -var Point = require('../point'); -var Hash = require('../hash'); -var Pubkey = require('../pubkey'); -var Privkey = require('../privkey'); - -// http://en.wikipedia.org/wiki/Integrated_Encryption_Scheme -var ECIES = function ECIES() { - if (!(this instanceof ECIES)) - return new ECIES(); -}; - -ECIES.encrypt = function(messagebuf, topubkey, fromkeypair, ivbuf) { - if (!fromkeypair) - fromkeypair = Keypair().fromRandom(); - var r = fromkeypair.privkey.bn; - var R = fromkeypair.pubkey.point; - var Rpubkey = fromkeypair.pubkey; - var Rbuf = Rpubkey.toDER(true); - var KB = topubkey.point; - var P = KB.mul(r); - var S = P.getX(); - var Sbuf = S.toBuffer({size: 32}); - var kEkM = Hash.sha512(Sbuf); - var kE = kEkM.slice(0, 32); - var kM = kEkM.slice(32, 64); - var c = AESCBC.encryptCipherkey(messagebuf, kE, ivbuf); - var d = Hash.sha256hmac(c, kM); - var encbuf = Buffer.concat([Rbuf, c, d]); - return encbuf; -}; - -ECIES.decrypt = function(encbuf, toprivkey) { - var kB = toprivkey.bn; - var frompubkey = Pubkey().fromDER(encbuf.slice(0, 33)); - var R = frompubkey.point; - var P = R.mul(kB); - if (P.eq(new Point())) - throw new Error('P equals 0'); - var S = P.getX(); - var Sbuf = S.toBuffer({size: 32}); - var kEkM = Hash.sha512(Sbuf); - var kE = kEkM.slice(0, 32); - var kM = kEkM.slice(32, 64); - var c = encbuf.slice(33, encbuf.length - 32); - var d = encbuf.slice(encbuf.length - 32, encbuf.length); - var d2 = Hash.sha256hmac(c, kM); - if (d.toString('hex') !== d2.toString('hex')) - throw new Error('Invalid checksum'); - var messagebuf = AESCBC.decryptCipherkey(c, kE); - return messagebuf; -}; - -module.exports = ECIES; diff --git a/lib/expmt/stealthaddress.js b/lib/expmt/stealthaddress.js deleted file mode 100644 index 6635167..0000000 --- a/lib/expmt/stealthaddress.js +++ /dev/null @@ -1,127 +0,0 @@ -var Stealthkey = require('./stealthkey'); -var Base58check = require('../base58check'); -var Pubkey = require('../pubkey'); -var KDF = require('../kdf'); -var BufferWriter = require('../bufferwriter'); -var BufferReader = require('../bufferreader'); - -var StealthAddress = function StealthAddress(addrstr) { - if (!(this instanceof StealthAddress)) - return new StealthAddress(addrstr); - - if (typeof addrstr === 'string') { - this.fromString(addrstr) - } - else if (Buffer.isBuffer(addrstr)) { - var buf = addrstr; - this.fromBuffer(buf); - } - else if (addrstr) { - var obj = addrstr; - this.set(obj); - } -}; - -StealthAddress.mainver = 42; -StealthAddress.testver = 43; - -StealthAddress.prototype.set = function(obj) { - this.payloadPubkey = obj.payloadPubkey || this.payloadPubkey; - this.scanPubkey = obj.scanPubkey || this.scanPubkey; - return this; -}; - -StealthAddress.prototype.fromJSON = function(json) { - this.fromString(json); - return this; -}; - -StealthAddress.prototype.toJSON = function() { - return this.toString(); -}; - -StealthAddress.prototype.fromStealthkey = function(stealthkey) { - this.set({ - payloadPubkey: stealthkey.payloadKeypair.pubkey, - scanPubkey: stealthkey.scanKeypair.pubkey - }); - return this; -}; - -StealthAddress.prototype.fromBuffer = function(buf) { - var parsed = StealthAddress.parseDWBuffer(buf); - if ((parsed.version !== StealthAddress.mainver) && (parsed.version !== StealthAddress.testver)) - throw new Error('Invalid version'); - if (parsed.options !== 0) - throw new Error('Invalid options'); - if (!parsed.scanPubkey) - throw new Error('Invalid scanPubkey'); - if (parsed.payloadPubkeys.length !== 1) - throw new Error('Must have exactly one payloadPubkey'); - if (parsed.nSigs !== 1) - throw new Error('Must require exactly one signature'); - if (parsed.prefix.toString() !== "") - throw new Error('Only blank prefixes supported'); - this.scanPubkey = parsed.scanPubkey; - this.payloadPubkey = parsed.payloadPubkeys[0]; - return this; -}; - -StealthAddress.prototype.fromString = function(str) { - return this.fromBuffer(Base58check(str).toBuffer()); -}; - -StealthAddress.prototype.getSharedKeypair = function(senderKeypair) { - var sharedSecretPoint = this.scanPubkey.point.mul(senderKeypair.privkey.bn); - var sharedSecretPubkey = Pubkey(sharedSecretPoint); - var buf = sharedSecretPubkey.toDER(true); - var sharedKeypair = KDF.sha256hmac2keypair(buf); - - return sharedKeypair; -}; - -StealthAddress.prototype.getReceivePubkey = function(senderKeypair) { - var sharedKeypair = this.getSharedKeypair(senderKeypair); - var pubkey = Pubkey(this.payloadPubkey.point.add(sharedKeypair.pubkey.point)); - - return pubkey; -}; - -StealthAddress.prototype.toBuffer = function(networkstr) { - if (networkstr === 'testnet') - var version = StealthAddress.testver; - else - var version = StealthAddress.mainver; - var bw = new BufferWriter(); - bw.writeUInt8(version); - bw.writeUInt8(0); //options - bw.write(this.scanPubkey.toDER(true)); - bw.writeUInt8(1); //number of payload keys - we only support 1 (not multisig) - bw.write(this.payloadPubkey.toDER(true)); - bw.writeUInt8(1); //number of signatures - we only support 1 (not multisig) - bw.writeUInt8(0); //prefix length - we do not support prefix yet - var buf = bw.concat(); - return buf; -}; - -StealthAddress.prototype.toString = function(networkstr) { - return Base58check(this.toBuffer(networkstr)).toString(); -}; - -StealthAddress.parseDWBuffer = function(buf) { - var br = new BufferReader(buf); - var parsed = {}; - parsed.version = br.readUInt8(); - parsed.options = br.readUInt8(); - parsed.scanPubkey = Pubkey().fromBuffer(br.read(33)); - parsed.nPayloadPubkeys = br.readUInt8(); - parsed.payloadPubkeys = []; - for (var i = 0; i < parsed.nPayloadPubkeys; i++) - parsed.payloadPubkeys.push(Pubkey().fromBuffer(br.read(33))); - parsed.nSigs = br.readUInt8(); - parsed.nPrefix = br.readUInt8(); - parsed.prefix = br.read(parsed.nPrefix / 8); - return parsed; -}; - -module.exports = StealthAddress; diff --git a/lib/expmt/stealthkey.js b/lib/expmt/stealthkey.js deleted file mode 100644 index 7cf4d0f..0000000 --- a/lib/expmt/stealthkey.js +++ /dev/null @@ -1,88 +0,0 @@ -var Keypair = require('../keypair'); -var Privkey = require('../privkey'); -var Pubkey = require('../pubkey'); -var Point = require('../point'); -var Hash = require('../hash'); -var KDF = require('../kdf'); - -var Stealthkey = function Stealthkey(payloadKeypair, scanKeypair) { - if (!(this instanceof Stealthkey)) - return new Stealthkey(payloadKeypair, scanKeypair); - - if (payloadKeypair instanceof Keypair) { - this.set({ - payloadKeypair: payloadKeypair, - scanKeypair: scanKeypair - }); - } - else if (payloadKeypair) { - var obj = payloadKeypair; - this.set(obj); - } -}; - -Stealthkey.prototype.set = function(obj) { - this.payloadKeypair = obj.payloadKeypair || this.payloadKeypair; - this.scanKeypair = obj.scanKeypair || this.scanKeypair; - return this; -}; - -Stealthkey.prototype.fromJSON = function(json) { - this.set({ - payloadKeypair: Keypair().fromJSON(json.payloadKeypair), - scanKeypair: Keypair().fromJSON(json.scanKeypair) - }); - return this; -}; - -Stealthkey.prototype.toJSON = function() { - return { - payloadKeypair: this.payloadKeypair.toJSON(), - scanKeypair: this.scanKeypair.toJSON() - }; -}; - -Stealthkey.prototype.fromRandom = function() { - this.payloadKeypair = Keypair().fromRandom(); - this.scanKeypair = Keypair().fromRandom(); - - return this; -}; - -Stealthkey.prototype.getSharedKeypair = function(senderPubkey) { - var sharedSecretPoint = senderPubkey.point.mul(this.scanKeypair.privkey.bn); - var sharedSecretPubkey = Pubkey({point: sharedSecretPoint}); - var buf = sharedSecretPubkey.toDER(true); - var sharedKeypair = KDF.sha256hmac2keypair(buf); - - return sharedKeypair; -}; - -Stealthkey.prototype.getReceivePubkey = function(senderPubkey) { - var sharedKeypair = this.getSharedKeypair(senderPubkey); - var pubkey = Pubkey({point: this.payloadKeypair.pubkey.point.add(sharedKeypair.pubkey.point)}); - - return pubkey; -}; - -Stealthkey.prototype.getReceiveKeypair = function(senderPubkey) { - var sharedKeypair = this.getSharedKeypair(senderPubkey); - var privkey = Privkey({bn: this.payloadKeypair.privkey.bn.add(sharedKeypair.privkey.bn).mod(Point.getN())}); - var key = Keypair({privkey: privkey}); - key.privkey2pubkey(); - - return key; -}; - -Stealthkey.prototype.isForMe = function(senderPubkey, myPossiblePubkeyhashbuf) { - var pubkey = this.getReceivePubkey(senderPubkey); - var pubkeybuf = pubkey.toDER(true); - var pubkeyhash = Hash.sha256ripemd160(pubkeybuf); - - if (pubkeyhash.toString('hex') === myPossiblePubkeyhashbuf.toString('hex')) - return true; - else - return false; -}; - -module.exports = Stealthkey; diff --git a/lib/expmt/stealthmessage.js b/lib/expmt/stealthmessage.js deleted file mode 100644 index 71efd61..0000000 --- a/lib/expmt/stealthmessage.js +++ /dev/null @@ -1,85 +0,0 @@ -var Stealthkey = require('./stealthkey'); -var StealthAddress = require('./stealthaddress'); -var ECIES = require('./ecies'); -var Message = require('../message'); -var Keypair = require('../keypair'); -var Address = require('../address'); -var Pubkey = require('../pubkey'); - -var StealthMessage = function StealthMessage(obj) { - if (!(this instanceof StealthMessage)) - return new StealthMessage(obj); - if (obj) - this.set(obj); -}; - -StealthMessage.prototype.set = function(obj) { - this.messagebuf = obj.messagebuf || this.messagebuf; - this.encbuf = obj.encbuf || this.encbuf; - this.toStealthAddress = obj.toStealthAddress || this.toStealthAddress; - this.toStealthkey = obj.toStealthkey || this.toStealthkey; - this.fromKeypair = obj.fromKeypair || this.fromKeypair; - this.receiveAddress = obj.receiveAddress || this.receiveAddress; - return this; -}; - -StealthMessage.encrypt = function(messagebuf, toStealthAddress, fromKeypair, ivbuf) { - var sm = StealthMessage().set({ - messagebuf: messagebuf, - toStealthAddress: toStealthAddress, - fromKeypair: fromKeypair - }); - sm.encrypt(ivbuf); - var buf = Buffer.concat([ - sm.receiveAddress.hashbuf, - sm.fromKeypair.pubkey.toDER(true), - sm.encbuf - ]); - return buf; -}; - -StealthMessage.decrypt = function(buf, toStealthkey) { - var sm = StealthMessage().set({ - toStealthkey: toStealthkey, - receiveAddress: Address().set({hashbuf: buf.slice(0, 20)}), - fromKeypair: Keypair().set({pubkey: Pubkey().fromDER(buf.slice(20, 20 + 33))}), - encbuf: buf.slice(20 + 33) - }); - return sm.decrypt().messagebuf; -}; - -StealthMessage.isForMe = function(buf, toStealthkey) { - var sm = StealthMessage().set({ - toStealthkey: toStealthkey, - receiveAddress: Address().set({hashbuf: buf.slice(0, 20)}), - fromKeypair: Keypair().set({pubkey: Pubkey().fromDER(buf.slice(20, 20 + 33))}), - encbuf: buf.slice(20 + 33) - }); - return sm.isForMe(); -}; - -StealthMessage.prototype.encrypt = function(ivbuf) { - if (!this.fromKeypair) - this.fromKeypair = Keypair().fromRandom(); - var receivePubkey = this.toStealthAddress.getReceivePubkey(this.fromKeypair); - this.receiveAddress = Address().fromPubkey(receivePubkey); - this.encbuf = ECIES.encrypt(this.messagebuf, receivePubkey, this.fromKeypair, ivbuf); - return this; -}; - -StealthMessage.prototype.decrypt = function() { - var receiveKeypair = this.toStealthkey.getReceiveKeypair(this.fromKeypair.pubkey); - this.messagebuf = ECIES.decrypt(this.encbuf, receiveKeypair.privkey); - return this; -}; - -StealthMessage.prototype.isForMe = function() { - var receivePubkey = this.toStealthkey.getReceivePubkey(this.fromKeypair.pubkey); - var receiveAddress = Address().fromPubkey(receivePubkey); - if (receiveAddress.toString('hex') === this.receiveAddress.toString('hex')) - return true; - else - return false; -}; - -module.exports = StealthMessage; diff --git a/lib/expmt/stealthtx.js b/lib/expmt/stealthtx.js deleted file mode 100644 index 0133166..0000000 --- a/lib/expmt/stealthtx.js +++ /dev/null @@ -1,69 +0,0 @@ -var StealthAddress = require('./stealthaddress'); -var StealthKey = require('./stealthkey'); -var Transaction = require('../transaction'); -var Pubkey = require('../pubkey'); - -var StealthTx = function StealthTx(tx, sa, sk) { - if (!(this instanceof StealthTx)) - return new StealthTx(tx, sa, sk); - if (tx instanceof Transaction) { - this.tx = tx; - this.sa = sa; - this.sk = sk; - } else if (tx) { - var obj = tx; - this.set(obj); - } -}; - -StealthTx.prototype.set = function(obj) { - this.sk = obj.sk || this.sk; - this.sa = obj.sa || this.sa; - this.tx = obj.tx || this.tx; - return this; -}; - -StealthTx.prototype.isForMe = function() { - if (!this.notMine()) - return true; - else - return false; -}; - -StealthTx.prototype.notMine = function() { - var err; - if (err = this.notStealth()) - return "Not stealth: " + err; - var txopbuf = this.tx.txouts[0].script.chunks[1].buf; - var parsed = StealthTx.parseOpReturnData(txopbuf); - var pubkey = parsed.pubkey; - var pubkeyhashbuf = this.tx.txouts[1].script.chunks[2].buf; - var sk = this.sk; - if (sk.isForMe(pubkey, pubkeyhashbuf)) { - return false; - } else { - return "StealthTx not mine"; - } -}; - -//For now, we only support a very limited variety of stealth tx -StealthTx.prototype.notStealth = function() { - var txouts = this.tx.txouts; - if (!(txouts.length >= 2)) - return "Not enough txouts"; - if (!txouts[0].script.isOpReturn()) - return "First txout is not OP_RETURN"; - if (!txouts[1].script.isPubkeyhashOut()) - return "Second txout is not pubkeyhash"; - return false; -}; - -StealthTx.parseOpReturnData = function(buf) { - var parsed = {}; - parsed.version = buf[0]; - parsed.noncebuf = buf.slice(1, 5); - parsed.pubkey = Pubkey().fromBuffer(buf.slice(5, 5 + 33)); - return parsed; -}; - -module.exports = StealthTx; diff --git a/test/aes.js b/test/aes.js deleted file mode 100644 index be09a4c..0000000 --- a/test/aes.js +++ /dev/null @@ -1,85 +0,0 @@ -var should = require('chai').should(); -var Hash = require('../lib/hash'); -var AES = require('../lib/expmt/aes'); - -describe('AES', function() { - var m128 = Hash.sha256(new Buffer('test1')).slice(0, 128 / 8); - - var k128 = Hash.sha256(new Buffer('test2')).slice(0, 128 / 8); - var k192 = Hash.sha256(new Buffer('test2')).slice(0, 192 / 8); - var k256 = Hash.sha256(new Buffer('test2')).slice(0, 256 / 8); - - var e128 = new Buffer('3477e13884125038f4dc24e9d2cfbbc7', 'hex'); - var e192 = new Buffer('b670954c0e2da1aaa5f9063de04eb961', 'hex'); - var e256 = new Buffer('dd2ce24581183a4a7c0b1068f8bc79f0', 'hex'); - - - describe('@encrypt', function() { - - it('should encrypt with a 128 bit key', function() { - var encbuf = AES.encrypt(m128, k128); - encbuf.toString('hex').should.equal(e128.toString('hex')); - }); - - it('should encrypt with a 192 bit key', function() { - var encbuf = AES.encrypt(m128, k192); - encbuf.toString('hex').should.equal(e192.toString('hex')); - }); - - it('should encrypt with a 256 bit key', function() { - var encbuf = AES.encrypt(m128, k256); - encbuf.toString('hex').should.equal(e256.toString('hex')); - }); - - }); - - describe('@decrypt', function() { - - it('should encrypt/decrypt with a 128 bit key', function() { - var encbuf = AES.encrypt(m128, k128); - var m = AES.decrypt(encbuf, k128); - m.toString('hex').should.equal(m128.toString('hex')); - }); - - it('should encrypt/decrypt with a 192 bit key', function() { - var encbuf = AES.encrypt(m128, k192); - var m = AES.decrypt(encbuf, k192); - m.toString('hex').should.equal(m128.toString('hex')); - }); - - it('should encrypt/decrypt with a 256 bit key', function() { - var encbuf = AES.encrypt(m128, k256); - var m = AES.decrypt(encbuf, k256); - m.toString('hex').should.equal(m128.toString('hex')); - }); - - }); - - describe('@buf2words', function() { - - it('should convert this 4 length buffer into an array', function() { - var buf = new Buffer([0, 0, 0, 0]); - var words = AES.buf2words(buf); - words.length.should.equal(1); - }); - - it('should throw an error on this 5 length buffer', function() { - var buf = new Buffer([0, 0, 0, 0, 0]); - (function() { - var words = AES.buf2words(buf); - }).should.throw(); - }); - - }); - - describe('@words2buf', function() { - - it('should convert this array into a buffer', function() { - var a = [100, 0]; - var buf = AES.words2buf(a); - buf.length.should.equal(8); - }); - - }); - -}); diff --git a/test/aescbc.js b/test/aescbc.js deleted file mode 100644 index a1dca59..0000000 --- a/test/aescbc.js +++ /dev/null @@ -1,73 +0,0 @@ -var should = require('chai').should(); -var AESCBC = require('../lib/expmt/aescbc'); - -describe('AESCBC', function() { - - describe('@encrypt', function() { - - it('should return encrypt one block', function() { - var password = "password"; - var messagebuf = new Buffer(128 / 8 - 1); - messagebuf.fill(0); - var encbuf = AESCBC.encrypt(messagebuf, password); - encbuf.length.should.equal(128 / 8 + 128 / 8); - }); - - }); - - describe('@decrypt', function() { - - it('should decrypt that which was encrypted', function() { - var password = "password"; - var messagebuf = new Buffer(128 / 8 - 1); - messagebuf.fill(0); - var encbuf = AESCBC.encrypt(messagebuf, password); - var messagebuf2 = AESCBC.decrypt(encbuf, password); - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - - describe('@encryptCipherkey', function() { - - it('should return encrypt one block', function() { - var cipherkeybuf = new Buffer(256 / 8); - cipherkeybuf.fill(0x10); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0); - var messagebuf = new Buffer(128 / 8 - 1); - messagebuf.fill(0); - var encbuf = AESCBC.encryptCipherkey(messagebuf, cipherkeybuf, ivbuf); - encbuf.length.should.equal(128 / 8 + 128 / 8); - }); - - it('should return encrypt two blocks', function() { - var cipherkeybuf = new Buffer(256 / 8); - cipherkeybuf.fill(0x10); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0); - var messagebuf = new Buffer(128 / 8); - messagebuf.fill(0); - var encbuf = AESCBC.encryptCipherkey(messagebuf, cipherkeybuf, ivbuf); - encbuf.length.should.equal(128 / 8 + 128 / 8 + 128 / 8); - }); - - }); - - describe('@decryptCipherkey', function() { - - it('should decrypt that which was encrypted', function() { - var cipherkeybuf = new Buffer(256 / 8); - cipherkeybuf.fill(0x10); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0); - var messagebuf = new Buffer(128 / 8); - messagebuf.fill(0); - var encbuf = AESCBC.encryptCipherkey(messagebuf, cipherkeybuf, ivbuf); - var messagebuf2 = AESCBC.decryptCipherkey(encbuf, cipherkeybuf); - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - -}); diff --git a/test/cbc.js b/test/cbc.js deleted file mode 100644 index 1b163f5..0000000 --- a/test/cbc.js +++ /dev/null @@ -1,317 +0,0 @@ -var AES = require('../lib/expmt/aes'); -var should = require('chai').should(); -var CBC = require('../lib/expmt/cbc'); - -describe('CBC', function() { - - it('should return a new CBC', function() { - var cbc = new CBC(); - should.exist(cbc); - }) - - it('should return a new CBC when called without "new"', function() { - var cbc = new CBC(); - should.exist(cbc); - }); - - describe('@buf2blockbufs', function() { - - it('should convert this buffer into one block', function() { - var buf = new Buffer(16 - 1); - buf.fill(0); - var blockbufs = CBC.buf2blockbufs(buf, 16 * 8); - blockbufs.length.should.equal(1); - blockbufs[0].toString('hex').should.equal('00000000000000000000000000000001'); - }); - - it('should convert this buffer into two blocks', function() { - var buf = new Buffer(16); - buf.fill(0); - var blockbufs = CBC.buf2blockbufs(buf, 16 * 8); - blockbufs.length.should.equal(2); - blockbufs[0].toString('hex').should.equal('00000000000000000000000000000000'); - blockbufs[1].toString('hex').should.equal('10101010101010101010101010101010'); - }); - - }); - - describe('@buf2blockbufs', function() { - - it('should convert this buffer into one block and back into the same buffer', function() { - var buf = new Buffer(16 - 1); - buf.fill(0); - var blockbufs = CBC.buf2blockbufs(buf, 16 * 8); - var buf2 = CBC.blockbufs2buf(blockbufs, 16 * 8); - buf2.toString('hex').should.equal(buf.toString('hex')); - }); - - it('should convert this buffer into two blocks and back into the same buffer', function() { - var buf = new Buffer(16); - buf.fill(0); - var blockbufs = CBC.buf2blockbufs(buf, 16 * 8); - var buf2 = CBC.blockbufs2buf(blockbufs, 16 * 8); - buf2.toString('hex').should.equal(buf.toString('hex')); - }); - - }); - - describe('@encrypt', function() { - - it('should return this known value', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(128 / 8); - messagebuf2.fill(0x10); - var messagebuf = Buffer.concat([messagebuf1, messagebuf2]); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - blockcipher.decrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf); - var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf); - }); - - it('should return this shorter known value', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(120 / 8); - messagebuf2.fill(0x10); - var messagebuf = Buffer.concat([messagebuf1, messagebuf2]); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - blockcipher.decrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf); - var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf); - }); - - it('should return this shorter known value', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(136 / 8); - messagebuf2.fill(0x10); - var messagebuf = Buffer.concat([messagebuf1, messagebuf2]); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - blockcipher.decrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf); - var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf); - }); - - it('should encrypt something with AES', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(128 / 8); - messagebuf2.fill(0x10); - var messagebuf = Buffer.concat([messagebuf1, messagebuf2]); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = AES; - var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf); - var buf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf); - buf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - - describe('@decrypt', function() { - - it('should properly decrypt an encrypted message', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(128 / 8); - messagebuf2.fill(0x10); - var messagebuf = Buffer.concat([messagebuf1, messagebuf2]); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - blockcipher.decrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbuf = CBC.encrypt(messagebuf, ivbuf, blockcipher, cipherkeybuf); - var messagebuf2 = CBC.decrypt(encbuf, ivbuf, blockcipher, cipherkeybuf); - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - - describe('@encryptblock', function() { - - it('should return this known value', function() { - var messagebuf = new Buffer(128 / 8); - messagebuf.fill(0); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var enc = CBC.encryptblock(messagebuf, ivbuf, blockcipher, cipherkeybuf); - enc.toString('hex').should.equal(ivbuf.toString('hex')); - }); - - it('should return this other known value', function() { - var messagebuf = new Buffer(128 / 8); - messagebuf.fill(0x10); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var enc = CBC.encryptblock(messagebuf, ivbuf, blockcipher, cipherkeybuf); - enc.toString('hex').should.equal('00000000000000000000000000000000'); - }); - - }); - - describe('@decryptblock', function() { - - it('should decrypt an encrypted block', function() { - var messagebuf = new Buffer(128 / 8); - messagebuf.fill(0); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {}; - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - blockcipher.decrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbuf = CBC.encryptblock(messagebuf, ivbuf, blockcipher, cipherkeybuf); - var buf = CBC.decryptblock(encbuf, ivbuf, blockcipher, cipherkeybuf); - buf.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - - describe('@encryptblocks', function() { - - it('should return this known value', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(128 / 8); - messagebuf2.fill(0x10); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {} - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbufs = CBC.encryptblocks([messagebuf1, messagebuf2], ivbuf, blockcipher, cipherkeybuf); - encbufs[0].toString('hex').should.equal('10101010101010101010101010101010'); - encbufs[1].toString('hex').should.equal('00000000000000000000000000000000'); - }); - - }); - - describe('@decryptblocks', function() { - - it('should decrypt encrypted blocks', function() { - var messagebuf1 = new Buffer(128 / 8); - messagebuf1.fill(0); - var messagebuf2 = new Buffer(128 / 8); - messagebuf2.fill(0x10); - var ivbuf = new Buffer(128 / 8); - ivbuf.fill(0x10); - var cipherkeybuf = new Buffer(128 / 8); - cipherkeybuf.fill(0); - var blockcipher = {} - blockcipher.encrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - blockcipher.decrypt = function(messagebuf, cipherkeybuf) { - return messagebuf; - }; - var encbufs = CBC.encryptblocks([messagebuf1, messagebuf2], ivbuf, blockcipher, cipherkeybuf); - var bufs = CBC.decryptblocks(encbufs, ivbuf, blockcipher, cipherkeybuf); - bufs[0].toString('hex').should.equal(messagebuf1.toString('hex')); - bufs[1].toString('hex').should.equal(messagebuf2.toString('hex')); - }); - - }); - - describe('@pkcs7pad', function() { - - it('should pad this 32 bit buffer to 128 bits with the number 128/8 - 32/8', function() { - var buf = new Buffer(32 / 8); - buf.fill(0); - var padbuf = CBC.pkcs7pad(buf, 128); - padbuf.length.should.equal(128 / 8); - padbuf[32 / 8].should.equal(128 / 8 - 32 / 8); - padbuf[32 / 8 + 1].should.equal(128 / 8 - 32 / 8); - // ... - padbuf[32 / 8 + 128 / 8 - 32 / 8 - 1].should.equal(128 / 8 - 32 / 8); - }); - - }); - - describe('@pkcs7unpad', function() { - - it('should unpad this padded 32 bit buffer', function() { - var buf = new Buffer(32 / 8); - buf.fill(0); - var paddedbuf = CBC.pkcs7pad(buf, 128); - var unpaddedbuf = CBC.pkcs7unpad(paddedbuf, 128); - unpaddedbuf.toString('hex').should.equal(buf.toString('hex')); - }); - - }); - - describe('@xorbufs', function() { - - it('should xor 1 and 0', function() { - var buf1 = new Buffer([1]); - var buf2 = new Buffer([0]); - var buf = CBC.xorbufs(buf1, buf2); - buf[0].should.equal(1); - }); - - it('should xor 1 and 1', function() { - var buf1 = new Buffer([1]); - var buf2 = new Buffer([1]); - var buf = CBC.xorbufs(buf1, buf2); - buf[0].should.equal(0); - }); - - }); - -}); diff --git a/test/ecies.js b/test/ecies.js deleted file mode 100644 index 5e8078b..0000000 --- a/test/ecies.js +++ /dev/null @@ -1,52 +0,0 @@ -var ECIES = require('../lib/expmt/ecies'); -var should = require('chai').should(); -var Keypair = require('../lib/keypair'); -var Hash = require('../lib/hash'); - -describe('#ECIES', function() { - - it('should make a new ECIES object', function() { - var ecies = new ECIES(); - should.exist(ecies); - }); - - it('should make a new ECIES object when called without "new"', function() { - var ecies = ECIES(); - should.exist(ecies); - }); - - var fromkey = Keypair().fromRandom(); - var tokey = Keypair().fromRandom(); - var messagebuf = Hash.sha256(new Buffer('my message is the hash of this string')); - - describe('@encrypt', function() { - - it('should return a buffer', function() { - var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey, fromkey); - Buffer.isBuffer(encbuf).should.equal(true); - }); - - it('should return a buffer if fromkey is not present', function() { - var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey); - Buffer.isBuffer(encbuf).should.equal(true); - }); - - }); - - describe('@decrypt', function() { - - it('should decrypt that which was encrypted', function() { - var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey, fromkey); - var messagebuf2 = ECIES.decrypt(encbuf, tokey.privkey); - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - it('should decrypt that which was encrypted if fromkeypair was randomly generated', function() { - var encbuf = ECIES.encrypt(messagebuf, tokey.pubkey); - var messagebuf2 = ECIES.decrypt(encbuf, tokey.privkey); - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - -}); diff --git a/test/stealthaddress.js b/test/stealthaddress.js deleted file mode 100644 index 3b8e3e8..0000000 --- a/test/stealthaddress.js +++ /dev/null @@ -1,149 +0,0 @@ -var StealthAddress = require('../lib/expmt/stealthaddress'); -var should = require('chai').should(); -var Stealthkey = require('../lib/expmt/stealthkey'); -var Keypair = require('../lib/keypair'); -var Privkey = require('../lib/privkey'); -var Pubkey = require('../lib/pubkey'); -var BN = require('../lib/bn'); -var Hash = require('../lib/hash'); -var Base58check = require('../lib/base58check'); - -describe('StealthAddress', function() { - - var stealthkey = Stealthkey(); - stealthkey.payloadKeypair = Keypair(); - stealthkey.payloadKeypair.privkey = Privkey(); - stealthkey.payloadKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 1'))); - stealthkey.payloadKeypair.privkey2pubkey(); - stealthkey.scanKeypair = Keypair(); - stealthkey.scanKeypair.privkey = Privkey(); - stealthkey.scanKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 2'))); - stealthkey.scanKeypair.privkey2pubkey(); - - var senderKeypair = Keypair(); - senderKeypair.privkey = Privkey(); - senderKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 3'))); - senderKeypair.privkey2pubkey(); - - var addressString = 'vJmtuUb8ysKiM1HtHQF23FGfjGAKu5sM94UyyjknqhJHNdj5CZzwtpGzeyaATQ2HvuzomNVtiwsTJSWzzCBgCTtUZbRFpzKVq9MAUr'; - var dwhex = '2a0002697763d7e9becb0c180083738c32c05b0e2fee26d6278020c06bbb04d5f66b32010362408459041e0473298af3824dbabe4d2b7f846825ed4d1c2e2c670c07cb275d0100'; - var dwbuf = new Buffer(dwhex, 'hex'); - - it('should make a new stealth address', function() { - var sa = new StealthAddress(); - should.exist(sa); - sa = StealthAddress(); - should.exist(sa); - sa = StealthAddress(addressString); - should.exist(sa); - sa = StealthAddress(Base58check.decode(addressString)); - should.exist(sa); - }); - - describe('#fromJSON', function() { - - it('should give a stealthkey address with the right pubkeys', function() { - var sa = new StealthAddress(); - sa.fromJSON(addressString); - sa.payloadPubkey.toString().should.equal(stealthkey.payloadKeypair.pubkey.toString()); - sa.scanPubkey.toString().should.equal(stealthkey.scanKeypair.pubkey.toString()); - }); - - }); - - describe('#toJSON', function() { - - it('should return this known address string', function() { - StealthAddress().fromJSON(addressString).toJSON().should.equal(addressString); - }); - - }); - - describe('#fromBuffer', function() { - - it('should parse this DW buffer', function() { - StealthAddress().fromBuffer(new Buffer(dwhex, 'hex')).toBuffer().toString('hex').should.equal(dwhex); - }); - - }); - - describe('#fromString', function() { - - it('should parse this DW buffer', function() { - StealthAddress().fromString(Base58check(new Buffer(dwhex, 'hex')).toString()).toBuffer().toString('hex').should.equal(dwhex); - }); - - }); - - describe('#getSharedKeypair', function() { - - it('should return a key', function() { - var sa = new StealthAddress(); - sa.payloadPubkey = stealthkey.payloadKeypair.pubkey; - sa.scanPubkey = stealthkey.scanKeypair.pubkey; - var key = sa.getSharedKeypair(senderKeypair); - (key instanceof Keypair).should.equal(true); - }); - - it('should return the same key as Stealthkey.prototype.getSharedKeypair', function() { - var sa = new StealthAddress(); - sa.payloadPubkey = stealthkey.payloadKeypair.pubkey; - sa.scanPubkey = stealthkey.scanKeypair.pubkey; - var key = sa.getSharedKeypair(senderKeypair); - - var key2 = stealthkey.getSharedKeypair(senderKeypair.pubkey); - key.toString().should.equal(key2.toString()); - }); - - }); - - describe('#getReceivePubkey', function() { - - it('should return a pubkey', function() { - var pubkey = StealthAddress().fromStealthkey(stealthkey).getReceivePubkey(senderKeypair); - (pubkey instanceof Pubkey).should.equal(true); - }); - - it('should return the same pubkey as getReceivePubkey', function() { - var pubkey = StealthAddress().fromStealthkey(stealthkey).getReceivePubkey(senderKeypair); - var pubkey2 = stealthkey.getReceivePubkey(senderKeypair.pubkey); - pubkey2.toString().should.equal(pubkey.toString()); - }); - - }); - - describe('#toBuffer', function() { - - it('should return this known address buffer', function() { - var buf = Base58check.decode(addressString); - StealthAddress().fromBuffer(dwbuf).toBuffer().toString('hex').should.equal(dwhex); - }); - - }); - - describe('#toString', function() { - - it('should return this known address buffer', function() { - var buf = Base58check.decode(addressString); - StealthAddress().fromBuffer(buf).toString().should.equal(Base58check(new Buffer(dwhex, 'hex')).toString()); - }); - - }); - - describe('@parseDWBuffer', function() { - - it('should parse this known DW buffer', function() { - var buf = new Buffer(dwhex, 'hex'); - var parsed = StealthAddress.parseDWBuffer(buf); - parsed.version.should.equal(42); - parsed.options.should.equal(0); - parsed.scanPubkey.toString().should.equal('02697763d7e9becb0c180083738c32c05b0e2fee26d6278020c06bbb04d5f66b32'); - parsed.nPayloadPubkeys.should.equal(1); - parsed.payloadPubkeys[0].toString().should.equal('0362408459041e0473298af3824dbabe4d2b7f846825ed4d1c2e2c670c07cb275d'); - parsed.nSigs.should.equal(1); - parsed.prefix.toString().should.equal(''); - }); - - }); - -}); diff --git a/test/stealthkey.js b/test/stealthkey.js deleted file mode 100644 index 17eed96..0000000 --- a/test/stealthkey.js +++ /dev/null @@ -1,138 +0,0 @@ -var should = require('chai').should(); -var Stealthkey = require('../lib/expmt/stealthkey'); -var Keypair = require('../lib/keypair'); -var Privkey = require('../lib/privkey'); -var Pubkey = require('../lib/pubkey'); -var BN = require('../lib/bn'); -var Hash = require('../lib/hash'); - -describe('Stealthkey', function() { - - var stealthkey = Stealthkey(); - stealthkey.payloadKeypair = Keypair(); - stealthkey.payloadKeypair.privkey = Privkey(); - stealthkey.payloadKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 1'))); - stealthkey.payloadKeypair.privkey2pubkey(); - stealthkey.scanKeypair = Keypair(); - stealthkey.scanKeypair.privkey = Privkey(); - stealthkey.scanKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 2'))); - stealthkey.scanKeypair.privkey2pubkey(); - - var senderKeypair = Keypair(); - senderKeypair.privkey = Privkey(); - senderKeypair.privkey.bn = BN().fromBuffer(Hash.sha256(new Buffer('test 3'))); - senderKeypair.privkey2pubkey(); - - it('should create a new stealthkey', function() { - var stealthkey = new Stealthkey(); - should.exist(stealthkey); - }); - - it('should create a new stealthkey without using "new"', function() { - var stealthkey = Stealthkey(); - should.exist(stealthkey); - }); - - it('should create a new stealthkey with both keypairs in the constructor', function() { - var keypair1 = Keypair(); - var keypair2 = Keypair(); - var stealthkey = Stealthkey(keypair1, keypair2); - should.exist(stealthkey.payloadKeypair); - should.exist(stealthkey.scanKeypair); - }); - - describe('#set', function() { - - it('should set payload key', function() { - should.exist(Stealthkey().set({payloadKeypair: stealthkey.payloadKeypair}).payloadKeypair); - }); - - }); - - describe('#fromJSON', function() { - - it('should make a stealthkey from this JSON', function() { - var sk = Stealthkey().fromJSON({ - payloadKeypair: stealthkey.payloadKeypair.toJSON(), - scanKeypair: stealthkey.scanKeypair.toJSON() - }); - sk.payloadKeypair.toString().should.equal(stealthkey.payloadKeypair.toString()); - sk.scanKeypair.toString().should.equal(stealthkey.scanKeypair.toString()); - }); - - }); - - describe('#toJSON', function() { - - it('should convert this stealthkey to json', function() { - var json = stealthkey.toJSON() - var json2 = Stealthkey().fromJSON(json).toJSON(); - json.payloadKeypair.privkey.should.equal(json2.payloadKeypair.privkey); - json.scanKeypair.privkey.should.equal(json2.scanKeypair.privkey); - }); - - }); - - describe('#fromRandom', function() { - - it('should create a new stealthkey from random', function() { - var stealthkey = Stealthkey().fromRandom(); - should.exist(stealthkey.payloadKeypair.privkey.bn.gt(0)); - should.exist(stealthkey.scanKeypair.privkey.bn.gt(0)); - }); - - }); - - describe('#getSharedKeypair', function() { - - it('should return a key', function() { - var key = stealthkey.getSharedKeypair(senderKeypair.pubkey); - (key instanceof Keypair).should.equal(true); - }); - - }); - - describe('#getReceivePubkey', function() { - - it('should return a pubkey', function() { - var pubkey = stealthkey.getReceivePubkey(senderKeypair.pubkey); - (pubkey instanceof Pubkey).should.equal(true); - }); - - }); - - describe('#getReceiveKeypair', function() { - - it('should return a key', function() { - var key = stealthkey.getReceiveKeypair(senderKeypair.pubkey); - (key instanceof Keypair).should.equal(true); - }); - - it('should return a key with the same pubkey as getReceivePubkey', function() { - var key = stealthkey.getReceiveKeypair(senderKeypair.pubkey); - var pubkey = stealthkey.getReceivePubkey(senderKeypair.pubkey); - key.pubkey.toString().should.equal(pubkey.toString()); - }); - - it('should return private key with length 32 or less', function() { - var key = stealthkey.getReceiveKeypair(senderKeypair.pubkey); - key.privkey.bn.toBuffer().length.should.be.below(33); - }); - - }); - - describe('#isForMe', function() { - - it('should return true if it (the transaction or message) is for me', function() { - var pubkeyhash = new Buffer('3cb64fa6ee9b3e8754e3e2bd033bf61048604a99', 'hex'); - stealthkey.isForMe(senderKeypair.pubkey, pubkeyhash).should.equal(true); - }); - - it('should return false if it (the transaction or message) is not for me', function() { - var pubkeyhash = new Buffer('00b64fa6ee9b3e8754e3e2bd033bf61048604a99', 'hex'); - stealthkey.isForMe(senderKeypair.pubkey, pubkeyhash).should.equal(false); - }); - - }); - -}); diff --git a/test/stealthmessage.js b/test/stealthmessage.js deleted file mode 100644 index 16b2139..0000000 --- a/test/stealthmessage.js +++ /dev/null @@ -1,139 +0,0 @@ -var Keypair = require('../lib/keypair'); -var StealthMessage = require('../lib/expmt/stealthmessage'); -var Stealthkey = require('../lib/expmt/stealthkey'); -var StealthAddress = require('../lib/expmt/stealthaddress'); -var KDF = require('../lib/kdf'); -var Hash = require('../lib/hash'); -var should = require('chai').should(); -var Address = require('../lib/address'); - -describe('StealthMessage', function() { - - var payloadKeypair = KDF.buf2keypair(new Buffer('key1')); - var scanKeypair = KDF.buf2keypair(new Buffer('key2')); - var fromKeypair = KDF.buf2keypair(new Buffer('key3')); - var enchex = 'f557994f16d0d628fa4fdb4ab3d7e0bc5f2754f20381c7831a20c7c9ec88dcf092ea3683261798ccda991ed65a3a54a036d8125dec0381c7831a20c7c9ec88dcf092ea3683261798ccda991ed65a3a54a036d8125dec9f86d081884c7d659a2feaa0c55ad01560ba2904d3bc8395b6c4a6f87648edb33db6a22170e5e26f340c7ba943169210234cd6a753ad13919b0ab7d678b47b5e7d63e452382de2c2590fb57ef048f7b3'; - var encbuf = new Buffer(enchex, 'hex'); - var ivbuf = Hash.sha256(new Buffer('test')).slice(0, 128 / 8); - var sk = Stealthkey().set({payloadKeypair: payloadKeypair, scanKeypair: scanKeypair}); - var sa = StealthAddress().fromStealthkey(sk); - var messagebuf = new Buffer('this is my message'); - - it('should make a new stealthmessage', function() { - var sm = new StealthMessage(); - should.exist(sm); - sm = StealthMessage() - should.exist(sm); - }); - - it('should allow "set" style syntax', function() { - var encbuf = StealthMessage().set({ - messagebuf: messagebuf, - toStealthAddress: sa - }).encrypt().encbuf; - should.exist(encbuf); - encbuf.length.should.equal(113); - }); - - describe('#set', function() { - - it('should set the messagebuf', function() { - var sm = StealthMessage().set({messagebuf: messagebuf}); - should.exist(sm.messagebuf); - }); - - }); - - describe('@encrypt', function() { - - it('should encrypt a message', function() { - var encbuf = StealthMessage.encrypt(messagebuf, sa); - encbuf.length.should.equal(166); - }); - - it('should encrypt a message with this fromKeypair and ivbuf the same each time', function() { - var encbuf = StealthMessage.encrypt(messagebuf, sa, fromKeypair, ivbuf); - encbuf.length.should.equal(166); - encbuf.toString('hex').should.equal(enchex); - }); - - }); - - describe('@decrypt', function() { - - it('should decrypt this known message correctly', function() { - var messagebuf2 = StealthMessage.decrypt(encbuf, sk); - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - - describe('@isForMe', function() { - - it('should know that this message is for me', function() { - StealthMessage.isForMe(encbuf, sk).should.equal(true); - }); - - it('should know that this message is for me even if my payloadPrivkey is not present', function() { - var sk2 = new Stealthkey(); - sk2.scanKeypair = sk.scanKeypair; - sk2.payloadKeypair = Keypair().set({pubkey: sk.payloadKeypair.pubkey}); - should.not.exist(sk2.payloadKeypair.privkey); - StealthMessage.isForMe(encbuf, sk2).should.equal(true); - }); - - }); - - describe('#encrypt', function() { - - it('should encrypt this message', function() { - var sm = StealthMessage().set({ - messagebuf: messagebuf, - toStealthAddress: sa, - fromKeypair: fromKeypair - }); - sm.encrypt().encbuf.length.should.equal(113); - }); - - }); - - describe('#decrypt', function() { - - it('should decrypt that which was encrypted', function() { - var sm = StealthMessage().set({ - messagebuf: messagebuf, - toStealthAddress: sa - }).encrypt(); - var messagebuf2 = StealthMessage().set({ - encbuf: sm.encbuf, - fromKeypair: sm.fromKeypair, - toStealthkey: sk - }).decrypt().messagebuf; - messagebuf2.toString('hex').should.equal(messagebuf.toString('hex')); - }); - - }); - - describe('#isForMe', function() { - - it('should know that this message is for me', function() { - StealthMessage().set({ - encbuf: encbuf, - toStealthkey: sk, - fromKeypair: fromKeypair, - receiveAddress: Address().set({hashbuf: encbuf.slice(0, 20)}) - }).isForMe().should.equal(true); - }); - - it('should know that this message is not for me', function() { - StealthMessage().set({ - encbuf: encbuf, - toStealthkey: sk, - fromKeypair: fromKeypair, - receiveAddress: Address().set({hashbuf: encbuf.slice(0, 20)}) - }).isForMe().should.equal(true); - }); - - }); - -}); diff --git a/test/stealthtx.js b/test/stealthtx.js deleted file mode 100644 index f00d73e..0000000 --- a/test/stealthtx.js +++ /dev/null @@ -1,68 +0,0 @@ -var should = require('chai').should(); -var Txout = require('../lib/txout'); -var Stealthkey = require('../lib/expmt/stealthkey'); -var StealthTx = require('../lib/expmt/stealthtx'); -var Transaction = require('../lib/transaction'); -var Varint = require('../lib/varint'); - -describe('StealthTx', function() { - - var txhex = '0100000001c828ccce36eca04f96321ad488528af86c7598e67157c4f8e2f462a9e0e3af5f010000006a47304402204525eef6a56cc57fb184e53efdfdc1086d5265da21480d55c2184536440a64f70220349cdc6c66a8507dde0d172fe64aeb57ae56e014b50315f615086a6b85c5424e012102c0633ddb6bf2a8686e2ba4ce8026c94e1e27ef12e73f8fed6d6d2b97199f9b74ffffffff020000000000000000286a2606deadbeef0365b5a5b0ba059666e907b0b5e07b37fdb162d1399ed829315491fe1f30c87b3f905f0100000000001976a9142042d5e7ef9e82346419fbfe7df5ae52fe4bea3c88ac00000000'; - var txbuf = new Buffer(txhex, 'hex'); - var txidhex = '66da969fff214c329e27062beaf3baf20ed035801559b31f3e868c2de4cdfc5b'; - var tx = Transaction(txbuf); - - it('should make a new StealthTx', function() { - var stx = new StealthTx(); - should.exist(stx); - stx = StealthTx(); - should.exist(stx); - }); - - describe('#isForMe', function() { - - it('should return false for this known tx and random stealthkey', function() { - var sk = Stealthkey().fromRandom(); - var stx = StealthTx().set({sk: sk, tx: tx}); - stx.isForMe().should.equal(false); - }); - - }); - - describe('#notMine', function() { - - it('should return true for this known tx and random stealthkey', function() { - var sk = Stealthkey().fromRandom(); - var stx = StealthTx().set({sk: sk, tx: tx}); - stx.notMine().should.equal("StealthTx not mine"); - }); - - }); - - describe('#notStealth', function() { - - it('should know this is a stealth tx', function() { - var stx = StealthTx().set({tx: tx}); - stx.notStealth().should.equal(false); - }); - - it('should know this is not a stealth tx', function() { - var tx2 = Transaction(tx); - tx2.txouts.pop(); - tx2.txoutsvi = Varint(1); - var stx = StealthTx().set({tx: tx2}); - stx.notStealth().should.equal("Not enough txouts"); - }); - - }); - - describe('@parseOpReturnData', function() { - var txout = tx.txouts[0]; - var buf = txout.script.chunks[1].buf; - var parsed = StealthTx.parseOpReturnData(buf); - (typeof parsed.version).should.equal('number'); - parsed.noncebuf.length.should.be.above(0); - parsed.pubkey.toBuffer().length.should.equal(33); - }); - -});