Merge remote-tracking branch 'origin/devel' into integration-tests
This commit is contained in:
commit
30332003f8
File diff suppressed because one or more lines are too long
|
@ -33,6 +33,7 @@ function CleartextMessage(text, packetlist) {
|
||||||
if (!(this instanceof CleartextMessage)) {
|
if (!(this instanceof CleartextMessage)) {
|
||||||
return new CleartextMessage(packetlist);
|
return new CleartextMessage(packetlist);
|
||||||
}
|
}
|
||||||
|
// normalize EOL to canonical form <CR><LF>
|
||||||
this.text = text.replace(/\r/g, '').replace(/[\t ]+\n/g, "\n").replace(/\n/g,"\r\n");
|
this.text = text.replace(/\r/g, '').replace(/[\t ]+\n/g, "\n").replace(/\n/g,"\r\n");
|
||||||
this.packets = packetlist || new packet.list();
|
this.packets = packetlist || new packet.list();
|
||||||
}
|
}
|
||||||
|
@ -57,7 +58,7 @@ CleartextMessage.prototype.getSigningKeyIds = function() {
|
||||||
CleartextMessage.prototype.sign = function(privateKeys) {
|
CleartextMessage.prototype.sign = function(privateKeys) {
|
||||||
var packetlist = new packet.list();
|
var packetlist = new packet.list();
|
||||||
var literalDataPacket = new packet.literal();
|
var literalDataPacket = new packet.literal();
|
||||||
literalDataPacket.setBytes(this.text, enums.read(enums.literal, enums.literal.utf8));
|
literalDataPacket.setText(this.text);
|
||||||
for (var i = 0; i < privateKeys.length; i++) {
|
for (var i = 0; i < privateKeys.length; i++) {
|
||||||
var signaturePacket = new packet.signature();
|
var signaturePacket = new packet.signature();
|
||||||
signaturePacket.signatureType = enums.signature.text;
|
signaturePacket.signatureType = enums.signature.text;
|
||||||
|
@ -79,9 +80,10 @@ CleartextMessage.prototype.sign = function(privateKeys) {
|
||||||
CleartextMessage.prototype.verify = function(publicKeys) {
|
CleartextMessage.prototype.verify = function(publicKeys) {
|
||||||
var result = [];
|
var result = [];
|
||||||
var signatureList = this.packets.filterByTag(enums.packet.signature);
|
var signatureList = this.packets.filterByTag(enums.packet.signature);
|
||||||
var that = this;
|
|
||||||
var literalDataPacket = new packet.literal();
|
var literalDataPacket = new packet.literal();
|
||||||
literalDataPacket.setBytes(that.text, enums.read(enums.literal, enums.literal.utf8));
|
// we assume that cleartext signature is generated based on UTF8 cleartext,
|
||||||
|
// fails for other encodings, see CP-1252 test case in test/signature.js
|
||||||
|
literalDataPacket.setText(this.text);
|
||||||
publicKeys.forEach(function(pubKey) {
|
publicKeys.forEach(function(pubKey) {
|
||||||
for (var i = 0; i < signatureList.length; i++) {
|
for (var i = 0; i < signatureList.length; i++) {
|
||||||
var publicKeyPacket = pubKey.getPublicKeyPacket([signatureList[i].issuerKeyId]);
|
var publicKeyPacket = pubKey.getPublicKeyPacket([signatureList[i].issuerKeyId]);
|
||||||
|
@ -102,7 +104,8 @@ CleartextMessage.prototype.verify = function(publicKeys) {
|
||||||
* @return {String} cleartext of message
|
* @return {String} cleartext of message
|
||||||
*/
|
*/
|
||||||
CleartextMessage.prototype.getText = function() {
|
CleartextMessage.prototype.getText = function() {
|
||||||
return this.text;
|
// normalize end of line to \n
|
||||||
|
return this.text.replace(/\r\n/g,"\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -265,7 +265,7 @@ function dearmor(text) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type != 2) {
|
if (type != 2) {
|
||||||
var msg = split_headers(splittext[indexBase].replace(/^- /mg, ''));
|
var msg = split_headers(splittext[indexBase]);
|
||||||
var msg_sum = split_checksum(msg.body);
|
var msg_sum = split_checksum(msg.body);
|
||||||
|
|
||||||
result = {
|
result = {
|
||||||
|
@ -275,6 +275,7 @@ function dearmor(text) {
|
||||||
|
|
||||||
checksum = msg_sum.checksum;
|
checksum = msg_sum.checksum;
|
||||||
} else {
|
} else {
|
||||||
|
// Reverse dash-escaping for msg and remove trailing whitespace at end of line
|
||||||
var msg = split_headers(splittext[indexBase].replace(/^- /mg, '').replace(/[\t ]+\n/g, "\n"));
|
var msg = split_headers(splittext[indexBase].replace(/^- /mg, '').replace(/[\t ]+\n/g, "\n"));
|
||||||
var sig = split_headers(splittext[indexBase + 1].replace(/^- /mg, ''));
|
var sig = split_headers(splittext[indexBase + 1].replace(/^- /mg, ''));
|
||||||
var sig_sum = split_checksum(sig.body);
|
var sig_sum = split_checksum(sig.body);
|
||||||
|
|
|
@ -120,13 +120,7 @@ Message.prototype.getLiteralData = function() {
|
||||||
Message.prototype.getText = function() {
|
Message.prototype.getText = function() {
|
||||||
var literal = this.packets.findPacket(enums.packet.literal);
|
var literal = this.packets.findPacket(enums.packet.literal);
|
||||||
if (literal) {
|
if (literal) {
|
||||||
var data = literal.data;
|
return literal.getText();
|
||||||
if (literal.format == enums.read(enums.literal, enums.literal.binary)
|
|
||||||
|| literal.format == enums.read(enums.literal, enums.literal.text)) {
|
|
||||||
// text in a literal packet with format 'binary' or 'text' could be utf8, therefore decode
|
|
||||||
data = util.decode_utf8(data);
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -279,7 +273,21 @@ function readArmored(armoredText) {
|
||||||
function fromText(text) {
|
function fromText(text) {
|
||||||
var literalDataPacket = new packet.literal();
|
var literalDataPacket = new packet.literal();
|
||||||
// text will be converted to UTF8
|
// text will be converted to UTF8
|
||||||
literalDataPacket.set(text);
|
literalDataPacket.setText(text);
|
||||||
|
var literalDataPacketlist = new packet.list();
|
||||||
|
literalDataPacketlist.push(literalDataPacket);
|
||||||
|
var newMessage = new Message(literalDataPacketlist);
|
||||||
|
return newMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* creates new message object from binary data
|
||||||
|
* @param {String} bytes
|
||||||
|
* @return {message} new message object
|
||||||
|
*/
|
||||||
|
function fromBinary(bytes) {
|
||||||
|
var literalDataPacket = new packet.literal();
|
||||||
|
literalDataPacket.setBytes(bytes, enums.read(enums.literal, enums.literal.binary));
|
||||||
var literalDataPacketlist = new packet.list();
|
var literalDataPacketlist = new packet.list();
|
||||||
literalDataPacketlist.push(literalDataPacket);
|
literalDataPacketlist.push(literalDataPacket);
|
||||||
var newMessage = new Message(literalDataPacketlist);
|
var newMessage = new Message(literalDataPacketlist);
|
||||||
|
|
|
@ -32,16 +32,27 @@ module.exports = function packet_literal() {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the packet data to a javascript native string or a squence of
|
* Set the packet data to a javascript native string, end of line
|
||||||
* bytes. Conversion to the provided format takes place when the
|
* will be normalized to \r\n and by default text is converted to UTF8
|
||||||
* packet is written.
|
* @param {String} text Any native javascript string
|
||||||
* @param {String} str Any native javascript string
|
|
||||||
* @param {'utf8|'binary'|'text'} format The format the packet data will be written to,
|
|
||||||
* defaults to 'utf8'
|
|
||||||
*/
|
*/
|
||||||
this.set = function(str, format) {
|
this.setText = function(text) {
|
||||||
this.format = format || this.format;
|
// normalize EOL to \r\n
|
||||||
this.data = str;
|
text = text.replace(/\r/g, '').replace(/\n/g, '\r\n');
|
||||||
|
// encode UTF8
|
||||||
|
this.data = this.format == 'utf8' ? util.encode_utf8(text) : text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns literal data packets as native JavaScript string
|
||||||
|
* with normalized end of line to \n
|
||||||
|
* @return {String} literal data as text
|
||||||
|
*/
|
||||||
|
this.getText = function() {
|
||||||
|
// decode UTF8
|
||||||
|
var text = util.decode_utf8(this.data);
|
||||||
|
// normalize EOL to \n
|
||||||
|
return text.replace(/\r\n/g, '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,7 +62,7 @@ module.exports = function packet_literal() {
|
||||||
*/
|
*/
|
||||||
this.setBytes = function(bytes, format) {
|
this.setBytes = function(bytes, format) {
|
||||||
this.format = format;
|
this.format = format;
|
||||||
this.data = format == 'utf8' ? util.decode_utf8(bytes) : bytes;
|
this.data = bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,7 +71,7 @@ module.exports = function packet_literal() {
|
||||||
* @returns {String} A sequence of bytes
|
* @returns {String} A sequence of bytes
|
||||||
*/
|
*/
|
||||||
this.getBytes = function() {
|
this.getBytes = function() {
|
||||||
return this.format == 'utf8' ? util.encode_utf8(this.data) : this.data;
|
return this.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -506,10 +506,8 @@ module.exports = function packet_signature() {
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case t.binary:
|
case t.binary:
|
||||||
return data.getBytes();
|
|
||||||
|
|
||||||
case t.text:
|
case t.text:
|
||||||
return data.getBytes().replace(/\r/g, '').replace(/\n/g, "\r\n");
|
return data.getBytes();
|
||||||
|
|
||||||
case t.standalone:
|
case t.standalone:
|
||||||
return '';
|
return '';
|
||||||
|
|
|
@ -46,7 +46,7 @@ unit.register("Packet testing", function() {
|
||||||
var message = new openpgp.packet.list();
|
var message = new openpgp.packet.list();
|
||||||
|
|
||||||
var literal = new openpgp.packet.literal();
|
var literal = new openpgp.packet.literal();
|
||||||
literal.set('Hello world', 'utf8');
|
literal.setText('Hello world');
|
||||||
|
|
||||||
var enc = new openpgp.packet.symmetrically_encrypted();
|
var enc = new openpgp.packet.symmetrically_encrypted();
|
||||||
message.push(enc);
|
message.push(enc);
|
||||||
|
@ -76,7 +76,7 @@ unit.register("Packet testing", function() {
|
||||||
msg = new openpgp.packet.list();
|
msg = new openpgp.packet.list();
|
||||||
|
|
||||||
msg.push(enc);
|
msg.push(enc);
|
||||||
literal.set('Hello world!', 'utf8');
|
literal.setText('Hello world!');
|
||||||
enc.packets.push(literal);
|
enc.packets.push(literal);
|
||||||
enc.encrypt(algo, key);
|
enc.encrypt(algo, key);
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ unit.register("Packet testing", function() {
|
||||||
|
|
||||||
var key = key_enc.sessionKey;
|
var key = key_enc.sessionKey;
|
||||||
|
|
||||||
literal.set('Hello world!', 'utf8');
|
literal.setText('Hello world!');
|
||||||
enc.packets.push(literal);
|
enc.packets.push(literal);
|
||||||
enc.encrypt(algo, key);
|
enc.encrypt(algo, key);
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ unit.register("Packet testing", function() {
|
||||||
literal = new openpgp.packet.literal(),
|
literal = new openpgp.packet.literal(),
|
||||||
signature = new openpgp.packet.signature();
|
signature = new openpgp.packet.signature();
|
||||||
|
|
||||||
literal.set('Hello world', 'utf8');
|
literal.setText('Hello world');
|
||||||
|
|
||||||
signature.hashAlgorithm = 'sha256';
|
signature.hashAlgorithm = 'sha256';
|
||||||
signature.publicKeyAlgorithm = 'rsa_sign';
|
signature.publicKeyAlgorithm = 'rsa_sign';
|
||||||
|
|
|
@ -310,7 +310,7 @@ var pub_key_arm3 =
|
||||||
'=nx90',
|
'=nx90',
|
||||||
'-----END PGP MESSAGE-----'].join('\n');
|
'-----END PGP MESSAGE-----'].join('\n');
|
||||||
|
|
||||||
var plaintext = 'short message\r\nnext line\r\n한국어/조선말\r\n\r\n';
|
var plaintext = 'short message\nnext line\n한국어/조선말\n\n';
|
||||||
var esMsg = openpgp.message.readArmored(msg_armor);
|
var esMsg = openpgp.message.readArmored(msg_armor);
|
||||||
var pubKey = openpgp.key.readArmored(pub_key_arm2);
|
var pubKey = openpgp.key.readArmored(pub_key_arm2);
|
||||||
var privKey = openpgp.key.readArmored(priv_key_arm2);
|
var privKey = openpgp.key.readArmored(priv_key_arm2);
|
||||||
|
@ -394,7 +394,7 @@ var pub_key_arm3 =
|
||||||
|
|
||||||
var cleartextSig = openpgp.verifyClearSignedMessage([pubKey2, pubKey3], csMsg);
|
var cleartextSig = openpgp.verifyClearSignedMessage([pubKey2, pubKey3], csMsg);
|
||||||
|
|
||||||
verified = verified && cleartextSig.text == plaintext.replace(/\r/g,'').replace(/[\t ]+\n/g,"\n").replace(/\n/g,"\r\n");
|
verified = verified && cleartextSig.text == plaintext;
|
||||||
|
|
||||||
verified = verified && cleartextSig.signatures[0].status && cleartextSig.signatures[1].status;
|
verified = verified && cleartextSig.signatures[0].status && cleartextSig.signatures[1].status;
|
||||||
|
|
||||||
|
@ -412,11 +412,43 @@ var pub_key_arm3 =
|
||||||
|
|
||||||
var cleartextSig = openpgp.verifyClearSignedMessage([pubKey], csMsg);
|
var cleartextSig = openpgp.verifyClearSignedMessage([pubKey], csMsg);
|
||||||
|
|
||||||
var verified = cleartextSig.text == plaintext.replace(/\r/g,'').replace(/[\t ]+\n/g,"\n").replace(/\n/g,"\r\n");
|
var verified = cleartextSig.text == plaintext.replace(/\r/g,'');
|
||||||
|
|
||||||
verified = verified && cleartextSig.signatures[0].status;
|
verified = verified && cleartextSig.signatures[0].status;
|
||||||
|
|
||||||
return new unit.result("Sign text with openpgp.signClearMessage and verify with openpgp.verifyClearSignedMessage leads to same cleartext and valid signatures", verified);
|
return new unit.result("Sign text with openpgp.signClearMessage and verify with openpgp.verifyClearSignedMessage leads to same cleartext and valid signatures", verified);
|
||||||
|
}, function() {
|
||||||
|
|
||||||
|
var msg_armor =
|
||||||
|
['-----BEGIN PGP SIGNED MESSAGE-----',
|
||||||
|
'Hash: SHA256',
|
||||||
|
'',
|
||||||
|
'äöü',
|
||||||
|
'some',
|
||||||
|
'more',
|
||||||
|
'-----BEGIN PGP SIGNATURE-----',
|
||||||
|
'Version: GnuPG v2.0.19 (GNU/Linux)',
|
||||||
|
'',
|
||||||
|
'iJwEAQEIAAYFAlKkbS8ACgkQ4IT3RGwgLJf/4wQAiG8s4CwL+YcvVaY/UVEuVCN+',
|
||||||
|
'7Z/y9kNIU3MuPQy/7kiAV/f3mE488363LelrLuppZRpAmbYFmFCklK/xgXF1MfRQ',
|
||||||
|
'J7ZGW0PrxQPi8KR8kSPzaUjkzUk86sARB0LeIxcG+5T/qh7fDXCRRyXPom5Ebqsf',
|
||||||
|
'XCEfvvdJ60zitnlFiIY=',
|
||||||
|
'=dm/N',
|
||||||
|
'-----END PGP SIGNATURE-----'].join('\n');
|
||||||
|
|
||||||
|
var plaintext = 'äöü\nsome\nmore';
|
||||||
|
var csMsg = openpgp.cleartext.readArmored(msg_armor);
|
||||||
|
var pubKey2 = openpgp.key.readArmored(pub_key_arm2);
|
||||||
|
|
||||||
|
var keyids = csMsg.getSigningKeyIds();
|
||||||
|
|
||||||
|
var cleartextSig = openpgp.verifyClearSignedMessage([pubKey2], csMsg);
|
||||||
|
|
||||||
|
var verified = cleartextSig.text == plaintext;
|
||||||
|
|
||||||
|
verified = verified && cleartextSig.signatures[0].status;
|
||||||
|
|
||||||
|
return new unit.result("Verify cleartext signed message with CP-1252 character encoding", verified);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
var results = [];
|
var results = [];
|
||||||
|
@ -427,4 +459,4 @@ var pub_key_arm3 =
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
|
|
||||||
});
|
});
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user