kbpgp
Version:
Keybase's PGP Implementation
514 lines (466 loc) • 17.3 kB
JavaScript
// Generated by IcedCoffeeScript 108.0.11
(function() {
var C, Ch, ClearSigner, CreationTime, Issuer, Literal, SHA512, SRF, Signature, Verifier, VerifierBase, WordArray, bufferify, clearsign_header, clearsign_to_sign, dash_escape, dash_unescape_line, dash_unescape_lines, encode, export_key_pgp, get_cipher, hashmod, iced, input_to_cleartext, input_to_cleartext_display, input_to_cleartext_sign, konst, make_esc, scrub_buffer, triplesec, unix_time, whitespace_strip, __iced_k, __iced_k_noop, _ref, _ref1, _ref2,
__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() {};
make_esc = require('iced-error').make_esc;
_ref = require('./packet/signature'), Signature = _ref.Signature, CreationTime = _ref.CreationTime, Issuer = _ref.Issuer;
_ref1 = require('../util'), bufferify = _ref1.bufferify, unix_time = _ref1.unix_time;
SRF = require('../rand').SRF;
triplesec = require('triplesec');
_ref2 = require('../symmetric'), export_key_pgp = _ref2.export_key_pgp, get_cipher = _ref2.get_cipher;
scrub_buffer = triplesec.util.scrub_buffer;
WordArray = triplesec.WordArray;
konst = require('../const');
C = konst.openpgp;
Ch = require('../header');
hashmod = require('../hash');
SHA512 = hashmod.SHA512;
encode = require('./armor').encode;
clearsign_header = require('pgp-utils').armor.clearsign_header;
Literal = require("./packet/literal").Literal;
VerifierBase = require('./verifier').Base;
exports.input_to_cleartext = input_to_cleartext = function(raw) {
var lines, ret;
lines = raw.split(/\n/);
ret = {
show: bufferify(input_to_cleartext_display(lines)),
sign: bufferify(input_to_cleartext_sign(lines))
};
return ret;
};
exports.dash_escape = dash_escape = function(line) {
if (line.length >= 1 && line[0] === '-') {
return "- " + line;
} else {
return line;
}
};
exports.dash_unescape_line = dash_unescape_line = function(line) {
var m, out, warn, _ref3;
warn = false;
out = (m = line.match(/^-( )?(.*?)$/)) != null ? (((_ref3 = m[1]) != null ? _ref3.length : void 0) !== 1 ? warn = true : void 0, m[2]) : line;
return [out, warn];
};
exports.dash_unescape_lines = dash_unescape_lines = function(lines, warnings) {
var i, l, line, ret, warn;
if (warnings == null) {
warnings = null;
}
ret = (function() {
var _i, _len, _ref3, _results;
_results = [];
for (i = _i = 0, _len = lines.length; _i < _len; i = ++_i) {
line = lines[i];
_ref3 = dash_unescape_line(line), l = _ref3[0], warn = _ref3[1];
if (warn) {
if (warnings != null) {
warnings.push("Bad dash-encoding on line " + (i + 1));
}
}
_results.push(l);
}
return _results;
})();
return ret;
};
exports.input_to_cleartext_display = input_to_cleartext_display = function(lines) {
var line, out;
out = (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = lines.length; _i < _len; _i++) {
line = lines[_i];
_results.push(dash_escape(line));
}
return _results;
})();
if (lines.length === 0 || lines.slice(-1)[0] !== '') {
out.push('');
}
return out.join("\n");
};
exports.clearsign_to_sign = clearsign_to_sign = function(lines, warnings) {
lines = dash_unescape_lines(lines, warnings);
return input_to_cleartext_sign(lines);
};
exports.input_to_cleartext_sign = input_to_cleartext_sign = function(lines) {
var line, num_trailing_newlines, t, tmp, _i;
tmp = (function() {
var _i, _len, _results;
_results = [];
for (_i = 0, _len = lines.length; _i < _len; _i++) {
line = lines[_i];
_results.push(whitespace_strip(line));
}
return _results;
})();
num_trailing_newlines = 0;
for (_i = tmp.length - 1; _i >= 0; _i += -1) {
t = tmp[_i];
if (t === '') {
num_trailing_newlines++;
} else {
break;
}
}
if (num_trailing_newlines > 0) {
tmp.pop();
}
return tmp.join("\r\n");
};
exports.whitespace_strip = whitespace_strip = function(line) {
var m;
line = line.replace(/\r/g, '');
if ((m = line.match(/^(.*?)([ \t]*)$/))) {
return m[1];
} else {
return line;
}
};
ClearSigner = (function() {
function ClearSigner(_arg) {
this.msg = _arg.msg, this.signing_key = _arg.signing_key, this.now = _arg.now, this.hasher = _arg.hasher;
}
ClearSigner.prototype._fix_msg = function(cb) {
this._cleartext = input_to_cleartext(this.msg.toString('utf8'));
return cb(null);
};
ClearSigner.prototype._sign_msg = function(cb) {
var err, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
this.sig = new Signature({
hasher: this.hasher,
sig_type: C.sig_types.canonical_text,
key: this.signing_key.key,
hashed_subpackets: [new CreationTime(this.now || unix_time())],
unhashed_subpackets: [new Issuer(this.signing_key.get_key_id())]
});
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "ClearSigner._sign_msg"
});
_this.sig.write(_this._cleartext.sign, __iced_deferrals.defer({
assign_fn: (function(__slot_1) {
return function() {
err = arguments[0];
return __slot_1._sig_output = arguments[1];
};
})(_this),
lineno: 118
}));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
return cb(err, _this._sig_output);
};
})(this));
};
ClearSigner.prototype.scrub = function() {};
ClearSigner.prototype.hasher_name = function() {
return this.sig.hasher.algname;
};
ClearSigner.prototype._encode = function(cb) {
var body, hdr;
hdr = clearsign_header(Ch, this._cleartext.show, this.hasher_name());
body = encode(C.message_types.signature, this._sig_output);
return cb(null, hdr + body);
};
ClearSigner.prototype.run = function(cb) {
var encoded, esc, signature, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
esc = make_esc(cb, "ClearSigner::run");
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "ClearSigner.run"
});
_this._fix_msg(esc(__iced_deferrals.defer({
lineno: 140
})));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "ClearSigner.run"
});
_this._sign_msg(esc(__iced_deferrals.defer({
assign_fn: (function() {
return function() {
return signature = arguments[0];
};
})(),
lineno: 141
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "ClearSigner.run"
});
_this._encode(esc(__iced_deferrals.defer({
assign_fn: (function() {
return function() {
return encoded = arguments[0];
};
})(),
lineno: 142
})));
__iced_deferrals._fulfill();
})(function() {
return cb(null, encoded, signature);
});
});
};
})(this));
};
return ClearSigner;
})();
Verifier = (function(_super) {
__extends(Verifier, _super);
function Verifier(_arg) {
var keyfetch, packets;
packets = _arg.packets, this.clearsign = _arg.clearsign, keyfetch = _arg.keyfetch, this.now = _arg.now, this.assert_pgp_hash = _arg.assert_pgp_hash;
Verifier.__super__.constructor.call(this, {
packets: packets,
keyfetch: keyfetch
});
}
Verifier.prototype._reformat_text = function(cb) {
var data;
data = bufferify(clearsign_to_sign(this.clearsign.lines));
this._literal = new Literal({
data: data,
format: C.literal_formats.utf8,
date: this.now || unix_time()
});
return cb(null);
};
Verifier.prototype._make_hasher = function(cb) {
var err, h;
err = null;
h = (this.clearsign.headers.hash || 'MD5').trim();
if ((this._sig.hasher = hashmod[h]) == null) {
err = new Error("Unknown hash algorithm: " + h);
}
return cb(err);
};
Verifier.prototype._verify = function(cb) {
var err, opts, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
opts = {
now: this.now,
assert_pgp_hash: this.assert_pgp_hash
};
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier._verify"
});
_this._sig.verify([_this._literal], __iced_deferrals.defer({
assign_fn: (function() {
return function() {
return err = arguments[0];
};
})(),
lineno: 184
}), opts);
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
return cb(err);
};
})(this));
};
Verifier.prototype._check_headers = function(cb) {
var err, k, v, _ref3;
err = null;
_ref3 = this.clearsign.headers;
for (k in _ref3) {
v = _ref3[k];
if (k !== 'hash') {
err = new Error("Unallowed header: " + k);
break;
}
}
return cb(err);
};
Verifier.prototype.run = function(cb) {
var esc, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
esc = make_esc(cb, "Verifier::run");
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier.run"
});
_this._check_headers(esc(__iced_deferrals.defer({
lineno: 201
})));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier.run"
});
_this._find_signature(esc(__iced_deferrals.defer({
lineno: 202
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier.run"
});
_this._reformat_text(esc(__iced_deferrals.defer({
lineno: 203
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier.run"
});
_this._fetch_key(esc(__iced_deferrals.defer({
lineno: 204
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier.run"
});
_this._make_hasher(esc(__iced_deferrals.defer({
lineno: 205
})));
__iced_deferrals._fulfill();
})(function() {
(function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "Verifier.run"
});
_this._verify(esc(__iced_deferrals.defer({
lineno: 206
})));
__iced_deferrals._fulfill();
})(function() {
return cb(null, _this._literal);
});
});
});
});
});
};
})(this));
};
return Verifier;
})(VerifierBase);
exports.sign = function(_arg, cb) {
var b, encoded, err, hasher, msg, now, signature, signing_key, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
msg = _arg.msg, signing_key = _arg.signing_key, now = _arg.now, hasher = _arg.hasher;
b = new ClearSigner({
msg: msg,
signing_key: signing_key,
now: now,
hasher: hasher
});
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "sign"
});
b.run(__iced_deferrals.defer({
assign_fn: (function() {
return function() {
err = arguments[0];
encoded = arguments[1];
return signature = arguments[2];
};
})(),
lineno: 217
}));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
b.scrub();
return cb(err, encoded, signature);
};
})(this));
};
exports.verify = function(_arg, cb) {
var assert_pgp_hash, clearsign, err, keyfetch, literal, now, packets, v, ___iced_passed_deferral, __iced_deferrals, __iced_k;
__iced_k = __iced_k_noop;
___iced_passed_deferral = iced.findDeferral(arguments);
packets = _arg.packets, clearsign = _arg.clearsign, keyfetch = _arg.keyfetch, now = _arg.now, assert_pgp_hash = _arg.assert_pgp_hash;
v = new Verifier({
packets: packets,
clearsign: clearsign,
keyfetch: keyfetch,
now: now,
assert_pgp_hash: assert_pgp_hash
});
(function(_this) {
return (function(__iced_k) {
__iced_deferrals = new iced.Deferrals(__iced_k, {
parent: ___iced_passed_deferral,
filename: "/Users/max/src/keybase/kbpgp/src/openpgp/clearsign.iced",
funcname: "verify"
});
v.run(__iced_deferrals.defer({
assign_fn: (function() {
return function() {
err = arguments[0];
return literal = arguments[1];
};
})(),
lineno: 225
}));
__iced_deferrals._fulfill();
});
})(this)((function(_this) {
return function() {
return cb(err, literal);
};
})(this));
};
}).call(this);