bip151: authenticate payload before decryption.
This commit is contained in:
parent
f837317ffd
commit
2bd90910b4
@ -203,7 +203,6 @@ BIP151Stream.prototype.encryptSize = function encryptSize(size) {
|
|||||||
var data = new Buffer(4);
|
var data = new Buffer(4);
|
||||||
data.writeUInt32LE(size, 0, true);
|
data.writeUInt32LE(size, 0, true);
|
||||||
this.chacha.encrypt(data);
|
this.chacha.encrypt(data);
|
||||||
this.aead.aad(data);
|
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -215,7 +214,6 @@ BIP151Stream.prototype.encryptSize = function encryptSize(size) {
|
|||||||
|
|
||||||
BIP151Stream.prototype.decryptSize = function decryptSize(data) {
|
BIP151Stream.prototype.decryptSize = function decryptSize(data) {
|
||||||
data = data.slice(0, 4);
|
data = data.slice(0, 4);
|
||||||
this.aead.aad(data);
|
|
||||||
this.chacha.encrypt(data);
|
this.chacha.encrypt(data);
|
||||||
return data.readUInt32LE(0, true);
|
return data.readUInt32LE(0, true);
|
||||||
};
|
};
|
||||||
@ -231,13 +229,23 @@ BIP151Stream.prototype.encrypt = function encrypt(data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decrypt payload with AEAD (update cipher and mac).
|
* Decrypt payload with AEAD (update cipher only).
|
||||||
* @param {Buffer} data
|
* @param {Buffer} data
|
||||||
* @returns {Buffer} data
|
* @returns {Buffer} data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BIP151Stream.prototype.decrypt = function decrypt(data) {
|
BIP151Stream.prototype.decrypt = function decrypt(data) {
|
||||||
return this.aead.decrypt(data);
|
return this.aead.chacha20.encrypt(data);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticate payload with AEAD (update mac only).
|
||||||
|
* @param {Buffer} data
|
||||||
|
* @returns {Buffer} data
|
||||||
|
*/
|
||||||
|
|
||||||
|
BIP151Stream.prototype.auth = function auth(data) {
|
||||||
|
return this.aead.auth(data);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -318,20 +326,25 @@ BIP151Stream.prototype.feed = function feed(data) {
|
|||||||
if (data.length === 0)
|
if (data.length === 0)
|
||||||
data = null;
|
data = null;
|
||||||
|
|
||||||
this.decrypt(payload);
|
|
||||||
this.finish();
|
|
||||||
this.sequence();
|
|
||||||
|
|
||||||
this.pendingTotal = 0;
|
this.pendingTotal = 0;
|
||||||
this.pending.length = 0;
|
this.pending.length = 0;
|
||||||
this.hasHeader = false;
|
this.hasHeader = false;
|
||||||
this.waiting = 0;
|
this.waiting = 0;
|
||||||
|
|
||||||
|
// Authenticate payload before decrypting.
|
||||||
|
// This ensures the cipher state isn't altered
|
||||||
|
// if the payload integrity has been compromised.
|
||||||
|
this.auth(payload);
|
||||||
|
this.finish();
|
||||||
|
|
||||||
if (!this.verify(tag)) {
|
if (!this.verify(tag)) {
|
||||||
this.emit('error', new Error('Bad tag.'));
|
this.emit('error', new Error('Bad tag.'));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.decrypt(payload);
|
||||||
|
this.sequence();
|
||||||
|
|
||||||
p = bcoin.reader(payload, true);
|
p = bcoin.reader(payload, true);
|
||||||
|
|
||||||
while (p.left()) {
|
while (p.left()) {
|
||||||
|
|||||||
@ -573,6 +573,21 @@ AEAD.prototype.decrypt = function decrypt(data) {
|
|||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticate data without decrypting.
|
||||||
|
* @param {Buffer} data
|
||||||
|
*/
|
||||||
|
|
||||||
|
AEAD.prototype.auth = function auth(data) {
|
||||||
|
if (this.cipherLen === 0)
|
||||||
|
this.pad16(this.aadLen);
|
||||||
|
|
||||||
|
this.cipherLen += data.length;
|
||||||
|
this.poly1305.update(data);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalize the aead and generate a MAC.
|
* Finalize the aead and generate a MAC.
|
||||||
* @returns {Buffer} MAC
|
* @returns {Buffer} MAC
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user