Merge remote-tracking branch 'origin/devel' into integration-tests

This commit is contained in:
Robert Nelson 2013-12-08 11:02:26 -08:00
commit 30332003f8
9 changed files with 354 additions and 228 deletions

File diff suppressed because one or more lines are too long

View File

@ -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");
}; };
/** /**

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }

View File

@ -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 '';

View File

@ -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';

View File

@ -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