text: // Generated by IcedCoffeeScript 108.0.8
  (function() {
    var AES, Base, Concat, Decryptor, SHA512, Salsa20, TwoFish, V, WordArray, ctr, decrypt, iced, make_esc, salsa20, __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() {};
  
    WordArray = require('./wordarray').WordArray;
  
    salsa20 = require('./salsa20');
  
    AES = require('./aes').AES;
  
    TwoFish = require('./twofish').TwoFish;
  
    ctr = require('./ctr');
  
    Concat = require('./combine').Concat;
  
    SHA512 = require('./sha512').SHA512;
  
    Salsa20 = require('./salsa20').Salsa20;
  
    _ref = require('./enc'), Base = _ref.Base, V = _ref.V;
  
    make_esc = require('iced-error').make_esc;
  
    Decryptor = (function(_super) {
      __extends(Decryptor, _super);
  
      function Decryptor(_arg) {
        var enc, key;
        key = _arg.key, enc = _arg.enc;
        Decryptor.__super__.constructor.call(this, {
          key: key
        });
        if (enc != null) {
          this.key = enc.key;
          this.derived_keys = enc.derived_keys;
        }
      }
  
      Decryptor.prototype.read_header = function(cb) {
        var err, wa;
        err = (wa = this.ct.unshift(2)) == null ? new Error("Ciphertext underrun in header") : (this.version = V[wa.words[1]]) == null ? new Error("bad header; couldn't find a good version (got " + wa.words[1] + ")") : wa.words[0] !== this.version.header[0] ? new Error("Bad header: unrecognized magic value") : null;
        return cb(err);
      };
  
      Decryptor.prototype.verify_sig = function(key, cb) {
        var computed, err, received, ___iced_passed_deferral, __iced_deferrals, __iced_k;
        __iced_k = __iced_k_noop;
        ___iced_passed_deferral = iced.findDeferral(arguments);
        (function(_this) {
          return (function(__iced_k) {
            if ((received = _this.ct.unshift(Concat.get_output_size() / 4)) == null) {
              return __iced_k(err = new Error("Ciphertext underrun in signature"));
            } else {
              (function(__iced_k) {
                __iced_deferrals = new iced.Deferrals(__iced_k, {
                  parent: ___iced_passed_deferral,
                  filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                  funcname: "Decryptor.verify_sig"
                });
                _this.sign({
                  input: _this.ct,
                  key: key,
                  salt: _this.salt
                }, __iced_deferrals.defer({
                  assign_fn: (function() {
                    return function() {
                      err = arguments[0];
                      return computed = arguments[1];
                    };
                  })(),
                  lineno: 63
                }));
                __iced_deferrals._fulfill();
              })(function() {
                return __iced_k(err = err != null ? err : received.equal(computed) ? null : new Error('Signature mismatch or bad decryption key'));
              });
            }
          });
        })(this)((function(_this) {
          return function() {
            return cb(err);
          };
        })(this));
      };
  
      Decryptor.prototype.unshift_iv = function(n_bytes, which, cb) {
        var err, iv;
        err = (iv = this.ct.unshift(n_bytes / 4)) != null ? null : new Error("Ciphertext underrun in " + which);
        return cb(err, iv);
      };
  
      Decryptor.prototype.read_salt = function(cb) {
        var err;
        err = (this.salt = this.ct.unshift(this.version.salt_size / 4)) == null ? new Error("Ciphertext underrrun in read_salt") : null;
        return cb(err);
      };
  
      Decryptor.prototype.generate_keys = function(_arg, cb) {
        var err, keys, progress_hook, ___iced_passed_deferral, __iced_deferrals, __iced_k;
        __iced_k = __iced_k_noop;
        ___iced_passed_deferral = iced.findDeferral(arguments);
        progress_hook = _arg.progress_hook;
        (function(_this) {
          return (function(__iced_k) {
            __iced_deferrals = new iced.Deferrals(__iced_k, {
              parent: ___iced_passed_deferral,
              filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
              funcname: "Decryptor.generate_keys"
            });
            _this.kdf({
              salt: _this.salt,
              progress_hook: progress_hook
            }, __iced_deferrals.defer({
              assign_fn: (function() {
                return function() {
                  err = arguments[0];
                  return keys = arguments[1];
                };
              })(),
              lineno: 114
            }));
            __iced_deferrals._fulfill();
          });
        })(this)((function(_this) {
          return function() {
            return cb(err, keys);
          };
        })(this));
      };
  
      Decryptor.prototype.run = function(_arg, cb) {
        var data, esc, iv, progress_hook, pt, ___iced_passed_deferral, __iced_deferrals, __iced_k;
        __iced_k = __iced_k_noop;
        ___iced_passed_deferral = iced.findDeferral(arguments);
        data = _arg.data, progress_hook = _arg.progress_hook;
        esc = make_esc(cb, "Decryptor::run");
        this.ct = WordArray.from_buffer(data);
        (function(_this) {
          return (function(__iced_k) {
            __iced_deferrals = new iced.Deferrals(__iced_k, {
              parent: ___iced_passed_deferral,
              filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
              funcname: "Decryptor.run"
            });
            _this.read_header(esc(__iced_deferrals.defer({
              lineno: 141
            })));
            __iced_deferrals._fulfill();
          });
        })(this)((function(_this) {
          return function() {
            (function(__iced_k) {
              __iced_deferrals = new iced.Deferrals(__iced_k, {
                parent: ___iced_passed_deferral,
                filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                funcname: "Decryptor.run"
              });
              _this.read_salt(esc(__iced_deferrals.defer({
                lineno: 142
              })));
              __iced_deferrals._fulfill();
            })(function() {
              (function(__iced_k) {
                __iced_deferrals = new iced.Deferrals(__iced_k, {
                  parent: ___iced_passed_deferral,
                  filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                  funcname: "Decryptor.run"
                });
                _this.generate_keys({
                  progress_hook: progress_hook
                }, esc(__iced_deferrals.defer({
                  assign_fn: (function(__slot_1) {
                    return function() {
                      return __slot_1.keys = arguments[0];
                    };
                  })(_this),
                  lineno: 143
                })));
                __iced_deferrals._fulfill();
              })(function() {
                (function(__iced_k) {
                  __iced_deferrals = new iced.Deferrals(__iced_k, {
                    parent: ___iced_passed_deferral,
                    filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                    funcname: "Decryptor.run"
                  });
                  _this.verify_sig(_this.keys.hmac, esc(__iced_deferrals.defer({
                    lineno: 144
                  })));
                  __iced_deferrals._fulfill();
                })(function() {
                  (function(__iced_k) {
                    __iced_deferrals = new iced.Deferrals(__iced_k, {
                      parent: ___iced_passed_deferral,
                      filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                      funcname: "Decryptor.run"
                    });
                    _this.unshift_iv(AES.ivSize, "AES", esc(__iced_deferrals.defer({
                      assign_fn: (function() {
                        return function() {
                          return iv = arguments[0];
                        };
                      })(),
                      lineno: 145
                    })));
                    __iced_deferrals._fulfill();
                  })(function() {
                    (function(__iced_k) {
                      __iced_deferrals = new iced.Deferrals(__iced_k, {
                        parent: ___iced_passed_deferral,
                        filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                        funcname: "Decryptor.run"
                      });
                      _this.run_aes({
                        iv: iv,
                        input: _this.ct,
                        key: _this.keys.aes,
                        progress_hook: progress_hook
                      }, esc(__iced_deferrals.defer({
                        assign_fn: (function() {
                          return function() {
                            return __iced_deferrals.ret = arguments[0];
                          };
                        })(),
                        lineno: 146
                      })));
                      __iced_deferrals._fulfill();
                    })(function() {
                      (function(__iced_k) {
                        if (_this.version.use_twofish) {
                          (function(__iced_k) {
                            __iced_deferrals = new iced.Deferrals(__iced_k, {
                              parent: ___iced_passed_deferral,
                              filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                              funcname: "Decryptor.run"
                            });
                            _this.unshift_iv(TwoFish.ivSize, "2fish", esc(__iced_deferrals.defer({
                              assign_fn: (function() {
                                return function() {
                                  return iv = arguments[0];
                                };
                              })(),
                              lineno: 148
                            })));
                            __iced_deferrals._fulfill();
                          })(function() {
                            (function(__iced_k) {
                              __iced_deferrals = new iced.Deferrals(__iced_k, {
                                parent: ___iced_passed_deferral,
                                filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                                funcname: "Decryptor.run"
                              });
                              _this.run_twofish({
                                iv: iv,
                                input: _this.ct,
                                key: _this.keys.twofish,
                                progress_hook: progress_hook
                              }, esc(__iced_deferrals.defer({
                                assign_fn: (function() {
                                  return function() {
                                    return __iced_deferrals.ret = arguments[0];
                                  };
                                })(),
                                lineno: 149
                              })));
                              __iced_deferrals._fulfill();
                            })(__iced_k);
                          });
                        } else {
                          return __iced_k();
                        }
                      })(function() {
                        (function(__iced_k) {
                          __iced_deferrals = new iced.Deferrals(__iced_k, {
                            parent: ___iced_passed_deferral,
                            filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                            funcname: "Decryptor.run"
                          });
                          _this.unshift_iv(Salsa20.ivSize, "Salsa", esc(__iced_deferrals.defer({
                            assign_fn: (function() {
                              return function() {
                                return iv = arguments[0];
                              };
                            })(),
                            lineno: 150
                          })));
                          __iced_deferrals._fulfill();
                        })(function() {
                          (function(__iced_k) {
                            __iced_deferrals = new iced.Deferrals(__iced_k, {
                              parent: ___iced_passed_deferral,
                              filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced",
                              funcname: "Decryptor.run"
                            });
                            _this.run_salsa20({
                              iv: iv,
                              input: _this.ct,
                              key: _this.keys.salsa20,
                              output_iv: false,
                              progress_hook: progress_hook
                            }, esc(__iced_deferrals.defer({
                              assign_fn: (function() {
                                return function() {
                                  return pt = arguments[0];
                                };
                              })(),
                              lineno: 151
                            })));
                            __iced_deferrals._fulfill();
                          })(function() {
                            return cb(null, pt.to_buffer());
                          });
                        });
                      });
                    });
                  });
                });
              });
            });
          };
        })(this));
      };
  
      Decryptor.prototype.clone = function() {
        var ret, _ref1;
        ret = new Decryptor({
          key: (_ref1 = this.key) != null ? _ref1.to_buffer() : void 0,
          rng: this.rng,
          version: this.version
        });
        ret.derived_keys = this.clone_derived_keys();
        return ret;
      };
  
      return Decryptor;
  
    })(Base);
  
    decrypt = function(_arg, cb) {
      var data, dec, err, key, progress_hook, pt, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      key = _arg.key, data = _arg.data, progress_hook = _arg.progress_hook;
      dec = new Decryptor({
        key: key
      });
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/md/go/src/github.com/keybase/triplesec/src/dec.iced"
          });
          dec.run({
            data: data,
            progress_hook: progress_hook
          }, __iced_deferrals.defer({
            assign_fn: (function() {
              return function() {
                err = arguments[0];
                return pt = arguments[1];
              };
            })(),
            lineno: 181
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          dec.scrub();
          return cb(err, pt);
        };
      })(this));
    };
  
    exports.Decryptor = Decryptor;
  
    exports.decrypt = decrypt;
  
  }).call(this);
  