From 86537fb48c4c6d29bcdefb934914704813eb8eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Obernd=C3=B6rfer?= Date: Thu, 3 Apr 2014 21:21:56 +0200 Subject: [PATCH] Add support to write V3 signatures --- src/packet/signature.js | 24 ++++++++++++++++++------ test/general/signature.js | 14 ++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/packet/signature.js b/src/packet/signature.js index 50e7ca89..19666e80 100644 --- a/src/packet/signature.js +++ b/src/packet/signature.js @@ -175,7 +175,7 @@ Signature.prototype.read = function (bytes) { break; default: - throw new Error('Version ' + version + ' of the signature is unsupported.'); + throw new Error('Version ' + this.version + ' of the signature is unsupported.'); } // Two-octet field holding left 16 bits of signed hash value. @@ -186,11 +186,23 @@ Signature.prototype.read = function (bytes) { }; Signature.prototype.write = function () { - return this.signatureData + - // unhashed subpackets or two octets for zero - (this.unhashedSubpackets ? this.unhashedSubpackets : util.writeNumber(0, 2)) + - this.signedHashValue + - this.signature; + var result = ''; + switch (this.version) { + case 3: + result += String.fromCharCode(3); // version + result += String.fromCharCode(5); // One-octet length of following hashed material. MUST be 5 + result += this.signatureData; + result += this.issuerKeyId.write(); + result += String.fromCharCode(this.publicKeyAlgorithm); + result += String.fromCharCode(this.hashAlgorithm); + break; + case 4: + result += this.signatureData; + result += this.unhashedSubpackets ? this.unhashedSubpackets : util.writeNumber(0, 2); + break; + } + result += this.signedHashValue + this.signature; + return result; }; /** diff --git a/test/general/signature.js b/test/general/signature.js index 85a9809a..96cf0a45 100644 --- a/test/general/signature.js +++ b/test/general/signature.js @@ -576,4 +576,18 @@ describe("Signature", function() { expect(pubKey.users[0].selfCertifications).to.exist; }); + it('Write V3 signatures', function() { + var pubKey = openpgp.key.readArmored(pub_v3).keys[0]; + var pubKey2 = openpgp.key.readArmored(pubKey.armor()).keys[0]; + expect(pubKey2).to.exist; + expect(pubKey.users[0].selfCertifications).to.eql(pubKey2.users[0].selfCertifications); + }); + + it('Write V4 signatures', function() { + var pubKey = openpgp.key.readArmored(pub_key_arm2).keys[0]; + var pubKey2 = openpgp.key.readArmored(pubKey.armor()).keys[0]; + expect(pubKey2).to.exist; + expect(pubKey.users[0].selfCertifications).to.eql(pubKey2.users[0].selfCertifications); + }); + });