"+v+" i:"+l+" decode: "+h+" bits "+aa+"
"),16>h)r[l++]=h;else if(16==h){var x;h=3+d(2);if(l+h>p)return t=0,1;for(x=l?r[l-1]:0;h--;)r[l++]=x}else{h=17==h?3+d(3):11+d(7);if(l+h>p)return t=0,1;for(;h--;)r[l++]=0}p=ba.length;for(l=0;l
literalTree");;)if(h=
-j(ba),256<=h){h-=256;if(0==h)break;h--;p=d(K[h])+M[h];h=j(P);8 "+v+" i:"+l+" decode: "+h+" bits "+aa+" literalTree");
+a:for(;;)if(h=j(ba),256<=h){h-=256;if(0==h)break;h--;p=d(K[h])+M[h];h=j(P);8
");l
"),16>h)r[l++]=h;else if(16==h){var x;h=3+d(2);if(l+h>p)return t=0,1;for(x=l?r[l-1]:0;h--;)r[l++]=x}else{h=17==h?3+d(3):11+d(7);if(l+h>p)return t=0,1;for(;h--;)r[l++]=0}p=ba.length;for(l=0;l
literalTree");
+ outer:
while(1) {
j = DecodeValue(literalTree);
if(j >= 256) { // In C64: if carry set
@@ -596,6 +597,9 @@ JXG.Util.Unzip = function (barray){
}
dist += cpdist[j];
while(len--) {
+ if(bIdx - dist < 0) {
+ break outer;
+ }
var c = buf32k[(bIdx - dist) & 0x7fff];
addBuffer(c);
}
diff --git a/src/openpgp.js b/src/openpgp.js
index 40d5ad90..52f62538 100644
--- a/src/openpgp.js
+++ b/src/openpgp.js
@@ -137,13 +137,20 @@ function _openpgp () {
util.print_error('no message found!');
return null;
}
- var input = dearmored.openpgp;
+ return read_messages_dearmored(dearmored);
+ }
+
+ function read_messages_dearmored(input){
+ var messageString = input.openpgp;
var messages = new Array();
var messageCount = 0;
var mypos = 0;
- var l = input.length;
- while (mypos < input.length) {
- var first_packet = openpgp_packet.read_packet(input, mypos, l);
+ var l = messageString.length;
+ while (mypos < messageString.length) {
+ var first_packet = openpgp_packet.read_packet(messageString, mypos, l);
+ if (!first_packet) {
+ break;
+ }
// public key parser (definition from the standard:)
// OpenPGP Message :- Encrypted Message | Signed Message |
// Compressed Message | Literal Message.
@@ -169,6 +176,7 @@ function _openpgp () {
if (first_packet.tagType == 1 ||
(first_packet.tagType == 2 && first_packet.signatureType < 16) ||
first_packet.tagType == 3 ||
+ first_packet.tagType == 4 ||
first_packet.tagType == 8 ||
first_packet.tagType == 9 ||
first_packet.tagType == 10 ||
@@ -177,7 +185,7 @@ function _openpgp () {
first_packet.tagType == 19) {
messages[messages.length] = new openpgp_msg_message();
messages[messageCount].messagePacket = first_packet;
- messages[messageCount].type = dearmored.type;
+ messages[messageCount].type = input.type;
// Encrypted Message
if (first_packet.tagType == 9 ||
first_packet.tagType == 1 ||
@@ -195,7 +203,7 @@ function _openpgp () {
messages[messageCount].sessionKeys[sessionKeyCount] = first_packet;
mypos += first_packet.packetLength + first_packet.headerLength;
l -= (first_packet.packetLength + first_packet.headerLength);
- first_packet = openpgp_packet.read_packet(input, mypos, l);
+ first_packet = openpgp_packet.read_packet(messageString, mypos, l);
if (first_packet.tagType != 1 && first_packet.tagType != 3)
issessionkey = false;
@@ -219,12 +227,19 @@ function _openpgp () {
} else
// Signed Message
if (first_packet.tagType == 2 && first_packet.signatureType < 3) {
- messages[messageCount].text = dearmored.text;
+ messages[messageCount].text = input.text;
messages[messageCount].signature = first_packet;
break;
+ } else
+ // Signed Message
+ if (first_packet.tagType == 4) {
+ //TODO: Implement check
+ mypos += first_packet.packetLength + first_packet.headerLength;
+ l -= (first_packet.packetLength + first_packet.headerLength);
} else
// Compressed Message
// TODO: needs to be implemented. From a security perspective: this message is plaintext anyway.
+ // This has been implemented as part of processing. Check openpgp.packet.
if (first_packet.tagType == 8) {
util.print_error("A directly compressed message is currently not supported");
break;
@@ -237,12 +252,13 @@ function _openpgp () {
// continue with next packet
mypos += first_packet.packetLength + first_packet.headerLength;
l -= (first_packet.packetLength + first_packet.headerLength);
- } else
- // Literal Message
- // TODO: needs to be implemented. From a security perspective: this message is plaintext anyway.
+ } else
if (first_packet.tagType == 11) {
- util.print_error("A direct literal message is currently not supported.");
- break;
+ // Literal Message -- work is already done in read_packet
+ mypos += first_packet.packetLength + first_packet.headerLength;
+ l -= (first_packet.packetLength + first_packet.headerLength);
+ messages[messageCount].data = first_packet.data;
+ messageCount++;
}
} else {
util.print_error('no message found!');
@@ -407,6 +423,7 @@ function _openpgp () {
this.write_signed_and_encrypted_message = write_signed_and_encrypted_message;
this.write_encrypted_message = write_encrypted_message;
this.read_message = read_message;
+ this.read_messages_dearmored = read_messages_dearmored;
this.read_publicKey = read_publicKey;
this.read_privateKey = read_privateKey;
this.init = init;
diff --git a/src/packet/openpgp.packet.compressed.js b/src/packet/openpgp.packet.compressed.js
index 2a5e0d76..b611ecfd 100644
--- a/src/packet/openpgp.packet.compressed.js
+++ b/src/packet/openpgp.packet.compressed.js
@@ -80,9 +80,13 @@ function openpgp_packet_compressed() {
var radix = s2r(compData).replace(/\n/g,"");
var outputString = JXG.decompress(radix);
//TODO check ADLER32 checksum
- var packet = openpgp_packet.read_packet(outputString, 0, outputString.length);
- util.print_info('Decompressed packet [Type 2-ZLIB]: ' + packet);
- this.decompressedData = packet.data;
+ var dearmored = {type: 3, text: outputString, openpgp: outputString};
+ var messages = openpgp.read_messages_dearmored(dearmored);
+ for(var m in messages){
+ if(messages[m].data){
+ this.decompressedData = messages[m].data;
+ }
+ }
} else {
util.print_error("Compression algorithm ZLIB only supports DEFLATE compression method.");
}
diff --git a/src/packet/openpgp.packet.js b/src/packet/openpgp.packet.js
index 5f5646e2..28efe50f 100644
--- a/src/packet/openpgp.packet.js
+++ b/src/packet/openpgp.packet.js
@@ -134,7 +134,6 @@ function _openpgp_packet() {
mypos++;
// parsed length from length field
- var len = 0;
var bodydata = null;
// used for partial body lengths
@@ -169,6 +168,8 @@ function _openpgp_packet() {
// definite length, or a new format header. The new format
// headers described below have a mechanism for precisely
// encoding data of indeterminate length.
+ packet_length = len;
+ break;
}
} else // 4.2.2. New Format Packet Lengths