Move key generation to Key class
This commit is contained in:
parent
7e711510cc
commit
f6176ed484
File diff suppressed because one or more lines are too long
87
src/key.js
87
src/key.js
|
@ -142,21 +142,26 @@ Key.prototype.isPrivate = function() {
|
|||
* @return {key} public key
|
||||
*/
|
||||
Key.prototype.toPublic = function() {
|
||||
var packetlist = new packet.list();
|
||||
for (var i = 0; i < this.packets.length; i++) {
|
||||
if (this.packets[i].tag == enums.packet.secret_key) {
|
||||
switch (this.packets[i].tag) {
|
||||
case enums.packet.secret_key:
|
||||
var bytes = this.packets[i].writePublicKey();
|
||||
var pubKeyPacket = new packet.public_key();
|
||||
pubKeyPacket.read(bytes);
|
||||
this.packets[i] = pubKeyPacket;
|
||||
}
|
||||
if (this.packets[i].tag == enums.packet.secret_subkey) {
|
||||
packetlist.push(pubKeyPacket);
|
||||
break;
|
||||
case enums.packet.secret_subkey:
|
||||
var bytes = this.packets[i].writePublicKey();
|
||||
var pubSubkeyPacket = new packet.public_subkey();
|
||||
pubSubkeyPacket.read(bytes);
|
||||
this.packets[i] = pubSubkeyPacket;
|
||||
packetlist.push(pubSubkeyPacket);
|
||||
break;
|
||||
default:
|
||||
packetlist.push(this.packets[i]);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
return new Key(packetlist);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -275,21 +280,79 @@ Key.prototype.revoke = function() {
|
|||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* reads an OpenPGP armored text and returns a key object
|
||||
* Reads an OpenPGP armored text and returns a key object
|
||||
* @param {String} armoredText text to be parsed
|
||||
* @return {key} new key object
|
||||
*/
|
||||
function readArmored(armoredText) {
|
||||
//TODO how do we want to handle bad text? Exception throwing
|
||||
//TODO don't accept non-key armored texts
|
||||
var input = armor.decode(armoredText).data;
|
||||
var input = armor.decode(armoredText);
|
||||
if (!(input.type == enums.armor.public_key || input.type == enums.armor.private_key)) {
|
||||
throw new Error('Armored text not of type key');
|
||||
}
|
||||
var packetlist = new packet.list();
|
||||
packetlist.read(input);
|
||||
packetlist.read(input.data);
|
||||
var newKey = new Key(packetlist);
|
||||
return newKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a new OpenPGP key. Currently only supports RSA keys.
|
||||
* Primary and subkey will be of same type.
|
||||
* @param {Integer} keyType to indicate what type of key to make.
|
||||
* RSA is 1. See http://tools.ietf.org/html/rfc4880#section-9.1
|
||||
* @param {Integer} numBits number of bits for the key creation.
|
||||
* @param {String} userId assumes already in form of "User Name <username@email.com>"
|
||||
* @param {String} passphrase The passphrase used to encrypt the resulting private key
|
||||
* @return {Key}
|
||||
*/
|
||||
function generate(keyType, numBits, userId, passphrase) {
|
||||
var packetlist = new packet.list();
|
||||
|
||||
var secretKeyPacket = new packet.secret_key();
|
||||
secretKeyPacket.algorithm = enums.read(enums.publicKey, keyType);
|
||||
secretKeyPacket.generate(numBits);
|
||||
secretKeyPacket.encrypt(passphrase);
|
||||
|
||||
var userIdPacket = new packet.userid();
|
||||
userIdPacket.read(userId);
|
||||
|
||||
var dataToSign = {};
|
||||
dataToSign.userid = userIdPacket;
|
||||
dataToSign.key = secretKeyPacket;
|
||||
var signaturePacket = new packet.signature();
|
||||
signaturePacket.signatureType = enums.signature.cert_generic;
|
||||
signaturePacket.publicKeyAlgorithm = keyType;
|
||||
//TODO we should load preferred hash from config, or as input to this function
|
||||
signaturePacket.hashAlgorithm = enums.hash.sha256;
|
||||
signaturePacket.keyFlags = [enums.keyFlags.certify_keys | enums.keyFlags.sign_data];
|
||||
signaturePacket.sign(secretKeyPacket, dataToSign);
|
||||
|
||||
var secretSubkeyPacket = new packet.secret_subkey();
|
||||
secretSubkeyPacket.algorithm = enums.read(enums.publicKey, keyType);
|
||||
secretSubkeyPacket.generate(numBits);
|
||||
secretSubkeyPacket.encrypt(passphrase);
|
||||
|
||||
dataToSign = {};
|
||||
dataToSign.key = secretKeyPacket;
|
||||
dataToSign.bind = secretSubkeyPacket;
|
||||
var subkeySignaturePacket = new packet.signature();
|
||||
subkeySignaturePacket.signatureType = enums.signature.subkey_binding;
|
||||
subkeySignaturePacket.publicKeyAlgorithm = keyType;
|
||||
//TODO we should load preferred hash from config, or as input to this function
|
||||
subkeySignaturePacket.hashAlgorithm = enums.hash.sha256;
|
||||
subkeySignaturePacket.keyFlags = [enums.keyFlags.encrypt_communication | enums.keyFlags.encrypt_storage];
|
||||
subkeySignaturePacket.sign(secretKeyPacket, dataToSign);
|
||||
|
||||
packetlist.push(secretKeyPacket);
|
||||
packetlist.push(userIdPacket);
|
||||
packetlist.push(signaturePacket);
|
||||
packetlist.push(secretSubkeyPacket);
|
||||
packetlist.push(subkeySignaturePacket);
|
||||
|
||||
return new Key(packetlist);
|
||||
}
|
||||
|
||||
exports.Key = Key;
|
||||
exports.readArmored = readArmored;
|
||||
exports.generate = generate;
|
||||
|
|
|
@ -27,6 +27,7 @@ var enums = require('./enums.js');
|
|||
var config = require('./config');
|
||||
var message = require('./message.js');
|
||||
var cleartext = require('./cleartext.js');
|
||||
var key = require('./key.js');
|
||||
|
||||
|
||||
/**
|
||||
|
@ -119,91 +120,24 @@ function verifyClearSignedMessage(publicKeys, message) {
|
|||
}
|
||||
|
||||
/**
|
||||
* TODO: update this doc
|
||||
* generates a new key pair for openpgp. Beta stage. Currently only
|
||||
* supports RSA keys, and no subkeys.
|
||||
* Generates a new OpenPGP key pair. Currently only supports RSA keys.
|
||||
* Primary and subkey will be of same type.
|
||||
* @param {Integer} keyType to indicate what type of key to make.
|
||||
* RSA is 1. Follows algorithms outlined in OpenPGP.
|
||||
* @param {Integer} numBits number of bits for the key creation. (should
|
||||
* be 1024+, generally)
|
||||
* @param {String} userId assumes already in form of "User Name
|
||||
* <username@email.com>"
|
||||
* RSA is 1. See http://tools.ietf.org/html/rfc4880#section-9.1
|
||||
* @param {Integer} numBits number of bits for the key creation. (should be 1024+, generally)
|
||||
* @param {String} userId assumes already in form of "User Name <username@email.com>"
|
||||
* @param {String} passphrase The passphrase used to encrypt the resulting private key
|
||||
* @return {Object} {privateKey: [openpgp_msg_privatekey],
|
||||
* privateKeyArmored: [string], publicKeyArmored: [string]}
|
||||
* @return {Object} {key: [Key], privateKeyArmored: [String], publicKeyArmored: [String]}
|
||||
*/
|
||||
function generateKeyPair(keyType, numBits, userId, passphrase) {
|
||||
var packetlist = new packet.list();
|
||||
|
||||
var secretKeyPacket = new packet.secret_key();
|
||||
secretKeyPacket.algorithm = enums.read(enums.publicKey, keyType);
|
||||
secretKeyPacket.generate(numBits);
|
||||
secretKeyPacket.encrypt(passphrase);
|
||||
|
||||
var userIdPacket = new packet.userid();
|
||||
userIdPacket.read(userId);
|
||||
|
||||
var dataToSign = {};
|
||||
dataToSign.userid = userIdPacket;
|
||||
dataToSign.key = secretKeyPacket;
|
||||
var signaturePacket = new packet.signature();
|
||||
signaturePacket.signatureType = enums.signature.cert_generic;
|
||||
signaturePacket.publicKeyAlgorithm = keyType;
|
||||
//TODO we should load preferred hash from config, or as input to this function
|
||||
signaturePacket.hashAlgorithm = enums.hash.sha256;
|
||||
signaturePacket.keyFlags = [enums.keyFlags.certify_keys | enums.keyFlags.sign_data];
|
||||
signaturePacket.sign(secretKeyPacket, dataToSign);
|
||||
|
||||
var secretSubkeyPacket = new packet.secret_subkey();
|
||||
secretSubkeyPacket.algorithm = enums.read(enums.publicKey, keyType);
|
||||
secretSubkeyPacket.generate(numBits);
|
||||
secretSubkeyPacket.encrypt(passphrase);
|
||||
|
||||
dataToSign = {};
|
||||
dataToSign.key = secretKeyPacket;
|
||||
dataToSign.bind = secretSubkeyPacket;
|
||||
var subkeySignaturePacket = new packet.signature();
|
||||
subkeySignaturePacket.signatureType = enums.signature.subkey_binding;
|
||||
subkeySignaturePacket.publicKeyAlgorithm = keyType;
|
||||
//TODO we should load preferred hash from config, or as input to this function
|
||||
subkeySignaturePacket.hashAlgorithm = enums.hash.sha256;
|
||||
subkeySignaturePacket.keyFlags = [enums.keyFlags.encrypt_communication | enums.keyFlags.encrypt_storage];
|
||||
subkeySignaturePacket.sign(secretKeyPacket, dataToSign);
|
||||
|
||||
packetlist.push(secretKeyPacket);
|
||||
packetlist.push(userIdPacket);
|
||||
packetlist.push(signaturePacket);
|
||||
packetlist.push(secretSubkeyPacket);
|
||||
packetlist.push(subkeySignaturePacket);
|
||||
|
||||
var armored = armor.encode(enums.armor.private_key, packetlist.write());
|
||||
return armored;
|
||||
var result = {};
|
||||
var newKey = key.generate(keyType, numBits, userId, passphrase);
|
||||
result.key = newKey;
|
||||
result.privateKeyArmored = newKey.armor();
|
||||
result.publicKeyArmored = newKey.toPublic().armor();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* creates a binary string representation a signed message.
|
||||
* The message will be signed with the specified private key.
|
||||
* @param {Object} privatekey {obj: [openpgp_msg_privatekey]}
|
||||
* - the private key to be used to sign the message
|
||||
* @param {String} messagetext message text to sign
|
||||
* @return {Object} {Object: text [String]}, openpgp: {String} a binary
|
||||
* string representation of the message which can be OpenPGP
|
||||
* armored(openpgp) and a text representation of the message (text).
|
||||
* This can be directly used to OpenPGP armor the message
|
||||
*/
|
||||
/*
|
||||
function write_signed_message(privatekey, messagetext) {
|
||||
var sig = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g, "\n").replace(/\n/,
|
||||
"\r\n"), privatekey);
|
||||
var result = {
|
||||
text: messagetext.replace(/\r\n/g, "\n").replace(/\n/, "\r\n"),
|
||||
openpgp: sig.openpgp,
|
||||
hash: sig.hash
|
||||
};
|
||||
return armor.encode(2, result, null, null);
|
||||
}
|
||||
*/
|
||||
|
||||
exports.encryptMessage = encryptMessage;
|
||||
exports.signAndEncryptMessage = signAndEncryptMessage;
|
||||
exports.decryptMessage = decryptMessage;
|
||||
|
|
|
@ -11,7 +11,7 @@ unit.register("Key generation/encryption/decryption", function() {
|
|||
+ 'userid: ' + userid + '\n'
|
||||
+ 'message: ' + message;
|
||||
|
||||
var privKey = openpgp.key.readArmored(key);
|
||||
var privKey = openpgp.key.readArmored(key.privateKeyArmored);
|
||||
|
||||
var encrypted = openpgp.encryptMessage([privKey], message);
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user