You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
// Process with: |
|
// browserify twister-crypto.js -o twister-crypto-bundle.js |
|
|
|
var Bitcoin = require('bitcoinjs-lib'); |
|
var Crypto = require('crypto'); |
|
window.Buffer = require('buffer').Buffer; |
|
window.Bencode = require('bencode'); |
|
|
|
var twister_network = { |
|
magicPrefix: '\x18twister Signed Message:\n', |
|
pubKeyHash: 0x00, |
|
} |
|
|
|
window.TwisterCrypto = {} |
|
|
|
TwisterCrypto.PubKey = Bitcoin.ECPubKey; |
|
TwisterCrypto.PrivKey = Bitcoin.ECKey; |
|
|
|
TwisterCrypto.PubKey.prototype.encrypt = function ( message, enc ) |
|
{ |
|
var sec = { orig: message.length } |
|
var ephemeral = Bitcoin.ECKey.makeRandom() |
|
sec["key"] = enc ? ephemeral.pub.toBuffer().toString(enc) : ephemeral.pub.toBuffer() |
|
|
|
var secret = this.Q.multiply(ephemeral.d).getEncoded().slice(1,33) |
|
|
|
var hash_secret = Crypto.createHash('sha512').update(secret).digest() |
|
var aes_key = hash_secret.slice(0,32) |
|
var hmac_key = hash_secret.slice(32,64) |
|
|
|
var crypter = Crypto.createCipheriv("aes-256-cbc",aes_key.slice(0,32),new Buffer(16)) |
|
var out = [] |
|
out.push(crypter.update(message)) |
|
out.push(crypter.final()) |
|
var sec_body = Buffer.concat(out) |
|
sec["body"] = enc ? sec_body.toString(enc) : sec_body |
|
|
|
hmac=Crypto.createHmac("sha512",hmac_key) |
|
hmac.update(sec_body) |
|
sec["mac"] = enc ? hmac.digest().toString(enc) : hmac.digest() |
|
|
|
return sec; |
|
} |
|
|
|
TwisterCrypto.PrivKey.prototype.decrypt = function ( sec ) |
|
{ |
|
var sec_key = sec["key"]; |
|
var sec_body = sec["body"]; |
|
var sec_mac = sec["mac"]; |
|
var sec_orig = sec["orig"]; |
|
if (!Buffer.isBuffer(sec_key)) { |
|
sec_key = new Buffer(sec_key, "hex"); |
|
} |
|
if (!Buffer.isBuffer(sec_body)) { |
|
sec_body = new Buffer(sec_body, "hex"); |
|
} |
|
if (!Buffer.isBuffer(sec_mac)) { |
|
sec_mac = new Buffer(sec_mac, "hex"); |
|
} |
|
|
|
var pubkey = Bitcoin.ECPubKey.fromBuffer(sec_key) |
|
var secret = pubkey.Q.multiply(this.d).getEncoded().slice(1,33) |
|
|
|
var hash_secret = Crypto.createHash('sha512').update(secret).digest() |
|
var aes_key = hash_secret.slice(0,32) |
|
var hmac_key = hash_secret.slice(32,64) |
|
|
|
var hmac=Crypto.createHmac("sha512",hmac_key) |
|
hmac.update(sec_body) |
|
var hmac_val = hmac.digest() |
|
if( hmac_val.compare(sec_mac) != 0 ) { |
|
return undefined; |
|
} |
|
|
|
var decrypter = Crypto.createDecipheriv("aes-256-cbc",aes_key.slice(0,32),new Buffer(16)) |
|
var out = [] |
|
out.push(decrypter.update(sec_body)) |
|
out.push(decrypter.final()) |
|
var decrypted = Buffer.concat(out).slice(0,sec_orig) |
|
|
|
return decrypted; |
|
} |
|
|
|
TwisterCrypto.PrivKey.prototype.messageSign = function ( message, enc ) |
|
{ |
|
var signature = Bitcoin.Message.sign(this, message, twister_network); |
|
return enc ? signature.toString(enc) : signature; |
|
} |
|
|
|
TwisterCrypto.PubKey.prototype.messageVerify = function ( message, signature ) |
|
{ |
|
if (!Buffer.isBuffer(signature)) { |
|
signature = new Buffer(signature, 'hex') |
|
} |
|
return Bitcoin.Message.verify(this.getAddress(), signature, message, twister_network) |
|
}
|
|
|