kbpgp
Version:
Keybase's PGP Implementation
336 lines (280 loc) • 10.1 kB
JavaScript
// Generated by IcedCoffeeScript 108.0.11
(function() {
var BaseKey, BaseKeyPair, K, NaclEddsa, Pair, Priv, Pub, SRF, TYPE, b2u, box, bufeq_fast, genseed, iced, konst, u2b, __iced_k, __iced_k_noop, _ref,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
iced = require('iced-runtime');
__iced_k = __iced_k_noop = function() {};
box = require('tweetnacl').box;
SRF = require('../rand').SRF;
konst = require('../const');
K = konst.kb;
_ref = require('../util'), genseed = _ref.genseed, bufeq_fast = _ref.bufeq_fast;
BaseKey = require('../basekeypair').BaseKey;
BaseKeyPair = require('./base').BaseKeyPair;
NaclEddsa = require('./eddsa');
TYPE = K.public_key_algorithms.NACL_DH;
b2u = function(b) {
return new Uint8Array(b);
};
u2b = function(u) {
return Buffer.from(u);
};
Pub = (function() {
Pub.HEADER = Buffer.from([K.kid.version, TYPE]);
Pub.TRAILER = Buffer.from([K.kid.trailer]);
Pub.LEN = Pub.HEADER.length + Pub.TRAILER.length + box.publicKeyLength;
function Pub(key) {
this.key = key;
}
Pub.alloc_kb = function(kid) {
var err, key;
err = key = null;
err = kid.length !== Pub.LEN ? new Error("bad key length") : !bufeq_fast(kid.slice(-1), Pub.TRAILER) ? new Error("bad trailing byte") : !bufeq_fast(kid.slice(0, 2), Pub.HEADER) ? new Error("bad header") : (key = new Pub(kid.slice(2, -1)), null);
return [err, key];
};
Pub.prototype.serialize = function() {
return this.key;
};
Pub.prototype.nbits = function() {
return 255;
};
Pub.prototype.read_params = function(sb) {};
Pub.prototype.encrypt = function(_arg, cb) {
var ciphertext, err, nonce, plaintext, res, ret, sender, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
plaintext = _arg.plaintext, sender = _arg.sender, nonce = _arg.nonce;
err = ret = null;
(function(_this) {
return (function(__iced_k) {
if (nonce == null) {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/chris/go/src/github.com/keybase/kbpgp/src/nacl/dh.iced",
funcname: "Pub.encrypt"
});
SRF().random_bytes(box.nonceLength, __iced_deferrals.defer({
assign_fn: (function() {
return function() {
return nonce = arguments[0];
};
})(),
lineno: 51
}));
__iced_deferrals._fulfill();
})(__iced_k);
} else {
return __iced_k(nonce.length !== box.nonceLength ? err = new Error("bad nonce; wrong length (wanted " + box.nonceLength + ")") : void 0);
}
});
})(this)((function(_this) {
return function() {
if (err == null) {
res = box(b2u(plaintext), b2u(nonce), b2u(_this.key), b2u(sender.priv.key));
ciphertext = u2b(res);
ret = {
ciphertext: ciphertext,
nonce: nonce
};
}
return cb(err, ret);
};
})(this));
};
return Pub;
})();
Priv = (function() {
function Priv(key) {
this.key = key;
}
Priv.prototype.alloc = function(raw) {
var err, key;
err = key = null;
if (raw.length !== box.secretKeyLength) {
err = new Error("Bad secret key length");
} else {
key = new Priv(raw);
}
return [err, key];
};
Priv.prototype.decrypt = function(_arg, cb) {
var ciphertext, err, nonce, res, sender;
ciphertext = _arg.ciphertext, nonce = _arg.nonce, sender = _arg.sender;
err = res = null;
res = box.open(b2u(ciphertext), b2u(nonce), b2u(sender.pub.key), b2u(this.key));
if (res === false) {
err = new Error("decryption failed");
res = null;
} else {
res = u2b(res);
}
return cb(err, res);
};
return Priv;
})();
Pair = (function(_super) {
__extends(Pair, _super);
Pair.Pub = Pub;
Pair.prototype.Pub = Pub;
Pair.Priv = Priv;
Pair.prototype.Priv = Priv;
function Pair(_arg) {
var priv, pub;
pub = _arg.pub, priv = _arg.priv;
Pair.__super__.constructor.call(this, {
pub: pub,
priv: priv
});
}
Pair.type = K.public_key_algorithms.NACL_DH;
Pair.prototype.type = Pair.type;
Pair.prototype.get_type = function() {
return this.type;
};
Pair.klass_name = "DH";
Pair.prototype.can_encrypt = function() {
return true;
};
Pair.prototype.can_sign = function() {
return false;
};
Pair.prototype.hash = function() {
return this.serialize();
};
Pair.prototype.encrypt_kb = function(_arg, cb) {
var nonce, plaintext, sender;
plaintext = _arg.plaintext, sender = _arg.sender, nonce = _arg.nonce;
return this.pub.encrypt({
plaintext: plaintext,
sender: sender,
nonce: nonce
}, cb);
};
Pair.prototype.decrypt_kb = function(_arg, cb) {
var ciphertext, err, nonce, plaintex, plaintext, sender, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
ciphertext = _arg.ciphertext, nonce = _arg.nonce, sender = _arg.sender;
err = plaintex = null;
(function(_this) {
return (function(__iced_k) {
if (_this.priv != null) {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/chris/go/src/github.com/keybase/kbpgp/src/nacl/dh.iced",
funcname: "Pair.decrypt_kb"
});
_this.priv.decrypt({
ciphertext: ciphertext,
nonce: nonce,
sender: sender
}, __iced_deferrals.defer({
assign_fn: (function() {
return function() {
err = arguments[0];
return plaintext = arguments[1];
};
})(),
lineno: 124
}));
__iced_deferrals._fulfill();
})(__iced_k);
} else {
return __iced_k(err = new Error("no secret key available"));
}
});
})(this)((function(_this) {
return function() {
return cb(err, plaintext);
};
})(this));
};
Pair.subkey_algo = function(flags) {
if (flags & (C.key_flags.encrypt_comm | C.key_flags.encrypt_storage)) {
return Pair;
} else {
return NaclEddsa.Pair;
}
};
Pair.prototype.fulfills_flags = function(flags) {
var good_for;
good_for = C.key_flags.encrypt_comm | C.key_flags.encrypt_storage;
return (flags & good_for) === flags;
};
Pair.prototype.verify_unpad_and_check_hash = function(_arg, cb) {
var data, hash, hasher, sig;
sig = _arg.sig, data = _arg.data, hasher = _arg.hasher, hash = _arg.hash;
return cb(new Error("verify_unpad_and_check_hash unsupported"));
};
Pair.prototype.pad_and_sign = function(data, _arg, cb) {
var hasher;
hasher = _arg.hasher;
return cb(new Error("pad_and_sign unsupported"));
};
Pair.parse_kb = function(pub_raw) {
return BaseKeyPair.parse_kb(Pair, pub_raw);
};
Pair.parse_sig = function(slice) {
var err;
err = new Error("@parse_sig unsupported");
throw err;
};
Pair.read_sig_from_buf = function(buf) {
var err;
err = new Error("@read_sig_from_buf unsupported");
return [err];
};
Pair.generate = function(_arg, cb) {
var arg, err, priv, pub, publicKey, ret, secretKey, seed, server_half, split, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
server_half = _arg.server_half, seed = _arg.seed, split = _arg.split;
arg = {
seed: seed,
split: split,
len: box.secretKeyLength,
server_half: server_half
};
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/chris/go/src/github.com/keybase/kbpgp/src/nacl/dh.iced",
funcname: "Pair.generate"
});
genseed(arg, __iced_deferrals.defer({
assign_fn: (function() {
return function() {
err = arguments[0];
server_half = arguments[1].server_half;
return seed = arguments[1].seed;
};
})(),
lineno: 185
}));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
var _ref1;
ret = null;
if (typeof err === "undefined" || err === null) {
_ref1 = box.keyPair.fromSecretKey(b2u(seed)), secretKey = _ref1.secretKey, publicKey = _ref1.publicKey;
pub = new Pub(u2b(publicKey));
priv = new Priv(u2b(secretKey));
ret = new Pair({
pub: pub,
priv: priv
});
}
return cb(err, ret, server_half);
};
})(this));
};
return Pair;
})(BaseKeyPair);
exports.DH = exports.Pair = Pair;
}).call(this);