modif comtabilite
This commit is contained in:
+89
-1
@@ -507,6 +507,24 @@ is valid for. The possible strings at the moment are:
|
||||
Authority)
|
||||
* `'crl'` -- key can be used to sign Certificate Revocation Lists (CRLs)
|
||||
|
||||
### `Certificate#getExtension(nameOrOid)`
|
||||
|
||||
Retrieves information about a certificate extension, if present, or returns
|
||||
`undefined` if not. The string argument `nameOrOid` should be either the OID
|
||||
(for X509 extensions) or the name (for OpenSSH extensions) of the extension
|
||||
to retrieve.
|
||||
|
||||
The object returned will have the following properties:
|
||||
|
||||
* `format` -- String, set to either `'x509'` or `'openssh'`
|
||||
* `name` or `oid` -- String, only one set based on value of `format`
|
||||
* `data` -- Buffer, the raw data inside the extension
|
||||
|
||||
### `Certificate#getExtensions()`
|
||||
|
||||
Returns an Array of all present certificate extensions, in the same manner and
|
||||
format as `getExtension()`.
|
||||
|
||||
### `Certificate#isExpired([when])`
|
||||
|
||||
Tests whether the Certificate is currently expired (i.e. the `validFrom` and
|
||||
@@ -614,6 +632,44 @@ Parameters
|
||||
|
||||
Returns an Identity instance.
|
||||
|
||||
### `identityFromArray(arr)`
|
||||
|
||||
Constructs an Identity from an array of DN components (see `Identity#toArray()`
|
||||
for the format).
|
||||
|
||||
Parameters
|
||||
|
||||
- `arr` -- an Array of Objects, DN components with `name` and `value`
|
||||
|
||||
Returns an Identity instance.
|
||||
|
||||
|
||||
Supported attributes in DNs:
|
||||
|
||||
| Attribute name | OID |
|
||||
| -------------- | --- |
|
||||
| `cn` | `2.5.4.3` |
|
||||
| `o` | `2.5.4.10` |
|
||||
| `ou` | `2.5.4.11` |
|
||||
| `l` | `2.5.4.7` |
|
||||
| `s` | `2.5.4.8` |
|
||||
| `c` | `2.5.4.6` |
|
||||
| `sn` | `2.5.4.4` |
|
||||
| `postalCode` | `2.5.4.17` |
|
||||
| `serialNumber` | `2.5.4.5` |
|
||||
| `street` | `2.5.4.9` |
|
||||
| `x500UniqueIdentifier` | `2.5.4.45` |
|
||||
| `role` | `2.5.4.72` |
|
||||
| `telephoneNumber` | `2.5.4.20` |
|
||||
| `description` | `2.5.4.13` |
|
||||
| `dc` | `0.9.2342.19200300.100.1.25` |
|
||||
| `uid` | `0.9.2342.19200300.100.1.1` |
|
||||
| `mail` | `0.9.2342.19200300.100.1.3` |
|
||||
| `title` | `2.5.4.12` |
|
||||
| `gn` | `2.5.4.42` |
|
||||
| `initials` | `2.5.4.43` |
|
||||
| `pseudonym` | `2.5.4.65` |
|
||||
|
||||
### `Identity#toString()`
|
||||
|
||||
Returns the identity as an LDAP-style DN string.
|
||||
@@ -631,7 +687,39 @@ Set when `type` is `'host'`, `'user'`, or `'email'`, respectively. Strings.
|
||||
|
||||
### `Identity#cn`
|
||||
|
||||
The value of the first `CN=` in the DN, if any.
|
||||
The value of the first `CN=` in the DN, if any. It's probably better to use
|
||||
the `#get()` method instead of this property.
|
||||
|
||||
### `Identity#get(name[, asArray])`
|
||||
|
||||
Returns the value of a named attribute in the Identity DN. If there is no
|
||||
attribute of the given name, returns `undefined`. If multiple components
|
||||
of the DN contain an attribute of this name, an exception is thrown unless
|
||||
the `asArray` argument is given as `true` -- then they will be returned as
|
||||
an Array in the same order they appear in the DN.
|
||||
|
||||
Parameters
|
||||
|
||||
- `name` -- a String
|
||||
- `asArray` -- an optional Boolean
|
||||
|
||||
### `Identity#toArray()`
|
||||
|
||||
Returns the Identity as an Array of DN component objects. This looks like:
|
||||
|
||||
```js
|
||||
[ {
|
||||
"name": "cn",
|
||||
"value": "Joe Bloggs"
|
||||
},
|
||||
{
|
||||
"name": "o",
|
||||
"value": "Organisation Ltd"
|
||||
} ]
|
||||
```
|
||||
|
||||
Each object has a `name` and a `value` property. The returned objects may be
|
||||
safely modified.
|
||||
|
||||
Errors
|
||||
------
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@ var dashdash = require('dashdash');
|
||||
var sshpk = require('../lib/index');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
|
||||
var options = [
|
||||
{
|
||||
@@ -93,7 +94,7 @@ if (require.main === module) {
|
||||
}
|
||||
|
||||
var fmt = opts.format || 'asn1';
|
||||
var sigData = new Buffer(opts.signature, 'base64');
|
||||
var sigData = Buffer.from(opts.signature, 'base64');
|
||||
|
||||
var sig;
|
||||
try {
|
||||
|
||||
+20
-18
@@ -1,5 +1,7 @@
|
||||
// Copyright 2015 Joyent, Inc.
|
||||
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
|
||||
var algInfo = {
|
||||
'dsa': {
|
||||
parts: ['p', 'q', 'g', 'y'],
|
||||
@@ -52,27 +54,27 @@ var curves = {
|
||||
'nistp256': {
|
||||
size: 256,
|
||||
pkcs8oid: '1.2.840.10045.3.1.7',
|
||||
p: new Buffer(('00' +
|
||||
p: Buffer.from(('00' +
|
||||
'ffffffff 00000001 00000000 00000000' +
|
||||
'00000000 ffffffff ffffffff ffffffff').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
a: new Buffer(('00' +
|
||||
a: Buffer.from(('00' +
|
||||
'FFFFFFFF 00000001 00000000 00000000' +
|
||||
'00000000 FFFFFFFF FFFFFFFF FFFFFFFC').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
b: new Buffer((
|
||||
b: Buffer.from((
|
||||
'5ac635d8 aa3a93e7 b3ebbd55 769886bc' +
|
||||
'651d06b0 cc53b0f6 3bce3c3e 27d2604b').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
s: new Buffer(('00' +
|
||||
s: Buffer.from(('00' +
|
||||
'c49d3608 86e70493 6a6678e1 139d26b7' +
|
||||
'819f7e90').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
n: new Buffer(('00' +
|
||||
n: Buffer.from(('00' +
|
||||
'ffffffff 00000000 ffffffff ffffffff' +
|
||||
'bce6faad a7179e84 f3b9cac2 fc632551').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
G: new Buffer(('04' +
|
||||
G: Buffer.from(('04' +
|
||||
'6b17d1f2 e12c4247 f8bce6e5 63a440f2' +
|
||||
'77037d81 2deb33a0 f4a13945 d898c296' +
|
||||
'4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' +
|
||||
@@ -82,31 +84,31 @@ var curves = {
|
||||
'nistp384': {
|
||||
size: 384,
|
||||
pkcs8oid: '1.3.132.0.34',
|
||||
p: new Buffer(('00' +
|
||||
p: Buffer.from(('00' +
|
||||
'ffffffff ffffffff ffffffff ffffffff' +
|
||||
'ffffffff ffffffff ffffffff fffffffe' +
|
||||
'ffffffff 00000000 00000000 ffffffff').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
a: new Buffer(('00' +
|
||||
a: Buffer.from(('00' +
|
||||
'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
|
||||
'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' +
|
||||
'FFFFFFFF 00000000 00000000 FFFFFFFC').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
b: new Buffer((
|
||||
b: Buffer.from((
|
||||
'b3312fa7 e23ee7e4 988e056b e3f82d19' +
|
||||
'181d9c6e fe814112 0314088f 5013875a' +
|
||||
'c656398d 8a2ed19d 2a85c8ed d3ec2aef').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
s: new Buffer(('00' +
|
||||
s: Buffer.from(('00' +
|
||||
'a335926a a319a27a 1d00896a 6773a482' +
|
||||
'7acdac73').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
n: new Buffer(('00' +
|
||||
n: Buffer.from(('00' +
|
||||
'ffffffff ffffffff ffffffff ffffffff' +
|
||||
'ffffffff ffffffff c7634d81 f4372ddf' +
|
||||
'581a0db2 48b0a77a ecec196a ccc52973').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
G: new Buffer(('04' +
|
||||
G: Buffer.from(('04' +
|
||||
'aa87ca22 be8b0537 8eb1c71e f320ad74' +
|
||||
'6e1d3b62 8ba79b98 59f741e0 82542a38' +
|
||||
'5502f25d bf55296c 3a545e38 72760ab7' +
|
||||
@@ -118,34 +120,34 @@ var curves = {
|
||||
'nistp521': {
|
||||
size: 521,
|
||||
pkcs8oid: '1.3.132.0.35',
|
||||
p: new Buffer((
|
||||
p: Buffer.from((
|
||||
'01ffffff ffffffff ffffffff ffffffff' +
|
||||
'ffffffff ffffffff ffffffff ffffffff' +
|
||||
'ffffffff ffffffff ffffffff ffffffff' +
|
||||
'ffffffff ffffffff ffffffff ffffffff' +
|
||||
'ffff').replace(/ /g, ''), 'hex'),
|
||||
a: new Buffer(('01FF' +
|
||||
a: Buffer.from(('01FF' +
|
||||
'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
|
||||
'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
|
||||
'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
|
||||
'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
b: new Buffer(('51' +
|
||||
b: Buffer.from(('51' +
|
||||
'953eb961 8e1c9a1f 929a21a0 b68540ee' +
|
||||
'a2da725b 99b315f3 b8b48991 8ef109e1' +
|
||||
'56193951 ec7e937b 1652c0bd 3bb1bf07' +
|
||||
'3573df88 3d2c34f1 ef451fd4 6b503f00').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
s: new Buffer(('00' +
|
||||
s: Buffer.from(('00' +
|
||||
'd09e8800 291cb853 96cc6717 393284aa' +
|
||||
'a0da64ba').replace(/ /g, ''), 'hex'),
|
||||
n: new Buffer(('01ff' +
|
||||
n: Buffer.from(('01ff' +
|
||||
'ffffffff ffffffff ffffffff ffffffff' +
|
||||
'ffffffff ffffffff ffffffff fffffffa' +
|
||||
'51868783 bf2f966b 7fcc0148 f709a5d0' +
|
||||
'3bb5c9b8 899c47ae bb6fb71e 91386409').
|
||||
replace(/ /g, ''), 'hex'),
|
||||
G: new Buffer(('04' +
|
||||
G: Buffer.from(('04' +
|
||||
'00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' +
|
||||
'9c648139 053fb521 f828af60 6b4d3dba' +
|
||||
'a14b5e77 efe75928 fe1dc127 a2ffa8de' +
|
||||
|
||||
+36
-3
@@ -3,6 +3,7 @@
|
||||
module.exports = Certificate;
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('./algs');
|
||||
var crypto = require('crypto');
|
||||
var Fingerprint = require('./fingerprint');
|
||||
@@ -119,6 +120,37 @@ Certificate.prototype.isSignedBy = function (issuerCert) {
|
||||
return (this.isSignedByKey(issuerCert.subjectKey));
|
||||
};
|
||||
|
||||
Certificate.prototype.getExtension = function (keyOrOid) {
|
||||
assert.string(keyOrOid, 'keyOrOid');
|
||||
var ext = this.getExtensions().filter(function (maybeExt) {
|
||||
if (maybeExt.format === 'x509')
|
||||
return (maybeExt.oid === keyOrOid);
|
||||
if (maybeExt.format === 'openssh')
|
||||
return (maybeExt.name === keyOrOid);
|
||||
return (false);
|
||||
})[0];
|
||||
return (ext);
|
||||
};
|
||||
|
||||
Certificate.prototype.getExtensions = function () {
|
||||
var exts = [];
|
||||
var x509 = this.signatures.x509;
|
||||
if (x509 && x509.extras && x509.extras.exts) {
|
||||
x509.extras.exts.forEach(function (ext) {
|
||||
ext.format = 'x509';
|
||||
exts.push(ext);
|
||||
});
|
||||
}
|
||||
var openssh = this.signatures.openssh;
|
||||
if (openssh && openssh.exts) {
|
||||
openssh.exts.forEach(function (ext) {
|
||||
ext.format = 'openssh';
|
||||
exts.push(ext);
|
||||
});
|
||||
}
|
||||
return (exts);
|
||||
};
|
||||
|
||||
Certificate.prototype.isSignedByKey = function (issuerKey) {
|
||||
utils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey');
|
||||
|
||||
@@ -185,7 +217,7 @@ Certificate.createSelfSigned = function (subjectOrSubjects, key, options) {
|
||||
assert.optionalBuffer(options.serial, 'options.serial');
|
||||
var serial = options.serial;
|
||||
if (serial === undefined)
|
||||
serial = new Buffer('0000000000000001', 'hex');
|
||||
serial = Buffer.from('0000000000000001', 'hex');
|
||||
|
||||
var purposes = options.purposes;
|
||||
if (purposes === undefined)
|
||||
@@ -283,7 +315,7 @@ Certificate.create =
|
||||
assert.optionalBuffer(options.serial, 'options.serial');
|
||||
var serial = options.serial;
|
||||
if (serial === undefined)
|
||||
serial = new Buffer('0000000000000001', 'hex');
|
||||
serial = Buffer.from('0000000000000001', 'hex');
|
||||
|
||||
var purposes = options.purposes;
|
||||
if (purposes === undefined)
|
||||
@@ -369,8 +401,9 @@ Certificate.isCertificate = function (obj, ver) {
|
||||
/*
|
||||
* API versions for Certificate:
|
||||
* [1,0] -- initial ver
|
||||
* [1,1] -- openssh format now unpacks extensions
|
||||
*/
|
||||
Certificate.prototype._sshpkApiVersion = [1, 0];
|
||||
Certificate.prototype._sshpkApiVersion = [1, 1];
|
||||
|
||||
Certificate._oldVersionDetect = function (obj) {
|
||||
return ([1, 0]);
|
||||
|
||||
+19
-35
@@ -8,16 +8,19 @@ module.exports = {
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var crypto = require('crypto');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('./algs');
|
||||
var utils = require('./utils');
|
||||
var nacl;
|
||||
var nacl = require('tweetnacl');
|
||||
|
||||
var Key = require('./key');
|
||||
var PrivateKey = require('./private-key');
|
||||
|
||||
var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined);
|
||||
|
||||
var ecdh, ec, jsbn;
|
||||
var ecdh = require('ecc-jsbn');
|
||||
var ec = require('ecc-jsbn/lib/ec');
|
||||
var jsbn = require('jsbn').BigInteger;
|
||||
|
||||
function DiffieHellman(key) {
|
||||
utils.assertCompatible(key, Key, [1, 4], 'key');
|
||||
@@ -42,13 +45,6 @@ function DiffieHellman(key) {
|
||||
|
||||
} else if (key.type === 'ecdsa') {
|
||||
if (!CRYPTO_HAVE_ECDH) {
|
||||
if (ecdh === undefined)
|
||||
ecdh = require('ecc-jsbn');
|
||||
if (ec === undefined)
|
||||
ec = require('ecc-jsbn/lib/ec');
|
||||
if (jsbn === undefined)
|
||||
jsbn = require('jsbn').BigInteger;
|
||||
|
||||
this._ecParams = new X9ECParameters(this._curve);
|
||||
|
||||
if (this._isPriv) {
|
||||
@@ -75,9 +71,6 @@ function DiffieHellman(key) {
|
||||
this._dh.setPublicKey(key.part.Q.data);
|
||||
|
||||
} else if (key.type === 'curve25519') {
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
if (this._isPriv) {
|
||||
utils.assertCompatible(key, PrivateKey, [1, 5], 'key');
|
||||
this._priv = key.part.k.data;
|
||||
@@ -189,7 +182,7 @@ DiffieHellman.prototype.computeSecret = function (otherpk) {
|
||||
var secret = nacl.box.before(new Uint8Array(pub),
|
||||
new Uint8Array(priv));
|
||||
|
||||
return (new Buffer(secret));
|
||||
return (Buffer.from(secret));
|
||||
}
|
||||
|
||||
throw (new Error('Invalid algorithm: ' + this._algo));
|
||||
@@ -218,7 +211,7 @@ DiffieHellman.prototype.generateKey = function () {
|
||||
this._dh.generateKeys();
|
||||
|
||||
parts.push({name: 'curve',
|
||||
data: new Buffer(this._curve)});
|
||||
data: Buffer.from(this._curve)});
|
||||
parts.push({name: 'Q', data: this._dh.getPublicKey()});
|
||||
parts.push({name: 'd', data: this._dh.getPrivateKey()});
|
||||
this._key = new PrivateKey({
|
||||
@@ -236,14 +229,14 @@ DiffieHellman.prototype.generateKey = function () {
|
||||
priv = r.mod(n1).add(jsbn.ONE);
|
||||
pub = this._ecParams.getG().multiply(priv);
|
||||
|
||||
priv = new Buffer(priv.toByteArray());
|
||||
pub = new Buffer(this._ecParams.getCurve().
|
||||
priv = Buffer.from(priv.toByteArray());
|
||||
pub = Buffer.from(this._ecParams.getCurve().
|
||||
encodePointHex(pub), 'hex');
|
||||
|
||||
this._priv = new ECPrivate(this._ecParams, priv);
|
||||
|
||||
parts.push({name: 'curve',
|
||||
data: new Buffer(this._curve)});
|
||||
data: Buffer.from(this._curve)});
|
||||
parts.push({name: 'Q', data: pub});
|
||||
parts.push({name: 'd', data: priv});
|
||||
|
||||
@@ -258,8 +251,8 @@ DiffieHellman.prototype.generateKey = function () {
|
||||
|
||||
} else if (this._algo === 'curve25519') {
|
||||
var pair = nacl.box.keyPair();
|
||||
priv = new Buffer(pair.secretKey);
|
||||
pub = new Buffer(pair.publicKey);
|
||||
priv = Buffer.from(pair.secretKey);
|
||||
pub = Buffer.from(pair.publicKey);
|
||||
priv = Buffer.concat([priv, pub]);
|
||||
assert.strictEqual(priv.length, 64);
|
||||
assert.strictEqual(pub.length, 32);
|
||||
@@ -316,16 +309,13 @@ function ECPrivate(params, buffer) {
|
||||
ECPrivate.prototype.deriveSharedSecret = function (pubKey) {
|
||||
assert.ok(pubKey instanceof ECPublic);
|
||||
var S = pubKey._pub.multiply(this._priv);
|
||||
return (new Buffer(S.getX().toBigInteger().toByteArray()));
|
||||
return (Buffer.from(S.getX().toBigInteger().toByteArray()));
|
||||
};
|
||||
|
||||
function generateED25519() {
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
var pair = nacl.sign.keyPair();
|
||||
var priv = new Buffer(pair.secretKey);
|
||||
var pub = new Buffer(pair.publicKey);
|
||||
var priv = Buffer.from(pair.secretKey);
|
||||
var pub = Buffer.from(pair.publicKey);
|
||||
assert.strictEqual(priv.length, 64);
|
||||
assert.strictEqual(pub.length, 32);
|
||||
|
||||
@@ -362,7 +352,7 @@ function generateECDSA(curve) {
|
||||
dh.generateKeys();
|
||||
|
||||
parts.push({name: 'curve',
|
||||
data: new Buffer(curve)});
|
||||
data: Buffer.from(curve)});
|
||||
parts.push({name: 'Q', data: dh.getPublicKey()});
|
||||
parts.push({name: 'd', data: dh.getPrivateKey()});
|
||||
|
||||
@@ -373,12 +363,6 @@ function generateECDSA(curve) {
|
||||
});
|
||||
return (key);
|
||||
} else {
|
||||
if (ecdh === undefined)
|
||||
ecdh = require('ecc-jsbn');
|
||||
if (ec === undefined)
|
||||
ec = require('ecc-jsbn/lib/ec');
|
||||
if (jsbn === undefined)
|
||||
jsbn = require('jsbn').BigInteger;
|
||||
|
||||
var ecParams = new X9ECParameters(curve);
|
||||
|
||||
@@ -395,11 +379,11 @@ function generateECDSA(curve) {
|
||||
var priv = c.mod(n1).add(jsbn.ONE);
|
||||
var pub = ecParams.getG().multiply(priv);
|
||||
|
||||
priv = new Buffer(priv.toByteArray());
|
||||
pub = new Buffer(ecParams.getCurve().
|
||||
priv = Buffer.from(priv.toByteArray());
|
||||
pub = Buffer.from(ecParams.getCurve().
|
||||
encodePointHex(pub), 'hex');
|
||||
|
||||
parts.push({name: 'curve', data: new Buffer(curve)});
|
||||
parts.push({name: 'curve', data: Buffer.from(curve)});
|
||||
parts.push({name: 'Q', data: pub});
|
||||
parts.push({name: 'd', data: priv});
|
||||
|
||||
|
||||
+6
-11
@@ -5,16 +5,14 @@ module.exports = {
|
||||
Signer: Signer
|
||||
};
|
||||
|
||||
var nacl;
|
||||
var nacl = require('tweetnacl');
|
||||
var stream = require('stream');
|
||||
var util = require('util');
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var Signature = require('./signature');
|
||||
|
||||
function Verifier(key, hashAlgo) {
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
if (hashAlgo.toLowerCase() !== 'sha512')
|
||||
throw (new Error('ED25519 only supports the use of ' +
|
||||
'SHA-512 hashes'));
|
||||
@@ -33,7 +31,7 @@ Verifier.prototype._write = function (chunk, enc, cb) {
|
||||
|
||||
Verifier.prototype.update = function (chunk) {
|
||||
if (typeof (chunk) === 'string')
|
||||
chunk = new Buffer(chunk, 'binary');
|
||||
chunk = Buffer.from(chunk, 'binary');
|
||||
this.chunks.push(chunk);
|
||||
};
|
||||
|
||||
@@ -45,7 +43,7 @@ Verifier.prototype.verify = function (signature, fmt) {
|
||||
sig = signature.toBuffer('raw');
|
||||
|
||||
} else if (typeof (signature) === 'string') {
|
||||
sig = new Buffer(signature, 'base64');
|
||||
sig = Buffer.from(signature, 'base64');
|
||||
|
||||
} else if (Signature.isSignature(signature, [1, 0])) {
|
||||
throw (new Error('signature was created by too old ' +
|
||||
@@ -60,9 +58,6 @@ Verifier.prototype.verify = function (signature, fmt) {
|
||||
};
|
||||
|
||||
function Signer(key, hashAlgo) {
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
if (hashAlgo.toLowerCase() !== 'sha512')
|
||||
throw (new Error('ED25519 only supports the use of ' +
|
||||
'SHA-512 hashes'));
|
||||
@@ -81,7 +76,7 @@ Signer.prototype._write = function (chunk, enc, cb) {
|
||||
|
||||
Signer.prototype.update = function (chunk) {
|
||||
if (typeof (chunk) === 'string')
|
||||
chunk = new Buffer(chunk, 'binary');
|
||||
chunk = Buffer.from(chunk, 'binary');
|
||||
this.chunks.push(chunk);
|
||||
};
|
||||
|
||||
@@ -90,7 +85,7 @@ Signer.prototype.sign = function () {
|
||||
new Uint8Array(Buffer.concat(this.chunks)),
|
||||
new Uint8Array(Buffer.concat([
|
||||
this.key.part.k.data, this.key.part.A.data])));
|
||||
var sigBuf = new Buffer(sig);
|
||||
var sigBuf = Buffer.from(sig);
|
||||
var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw');
|
||||
sigObj.hashAlgorithm = 'sha512';
|
||||
return (sigObj);
|
||||
|
||||
+11
-3
@@ -3,6 +3,7 @@
|
||||
module.exports = Fingerprint;
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('./algs');
|
||||
var crypto = require('crypto');
|
||||
var errs = require('./errors');
|
||||
@@ -90,7 +91,7 @@ Fingerprint.parse = function (fp, options) {
|
||||
if (!base64RE.test(parts[1]))
|
||||
throw (new FingerprintFormatError(fp));
|
||||
try {
|
||||
hash = new Buffer(parts[1], 'base64');
|
||||
hash = Buffer.from(parts[1], 'base64');
|
||||
} catch (e) {
|
||||
throw (new FingerprintFormatError(fp));
|
||||
}
|
||||
@@ -98,13 +99,20 @@ Fingerprint.parse = function (fp, options) {
|
||||
alg = 'md5';
|
||||
if (parts[0].toLowerCase() === 'md5')
|
||||
parts = parts.slice(1);
|
||||
parts = parts.map(function (p) {
|
||||
while (p.length < 2)
|
||||
p = '0' + p;
|
||||
if (p.length > 2)
|
||||
throw (new FingerprintFormatError(fp));
|
||||
return (p);
|
||||
});
|
||||
parts = parts.join('');
|
||||
/*JSSTYLED*/
|
||||
var md5RE = /^[a-fA-F0-9]+$/;
|
||||
if (!md5RE.test(parts))
|
||||
if (!md5RE.test(parts) || parts.length % 2 !== 0)
|
||||
throw (new FingerprintFormatError(fp));
|
||||
try {
|
||||
hash = new Buffer(parts, 'hex');
|
||||
hash = Buffer.from(parts, 'hex');
|
||||
} catch (e) {
|
||||
throw (new FingerprintFormatError(fp));
|
||||
}
|
||||
|
||||
+2
-1
@@ -6,6 +6,7 @@ module.exports = {
|
||||
};
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
var PrivateKey = require('../private-key');
|
||||
@@ -27,7 +28,7 @@ function read(buf, options) {
|
||||
return (ssh.read(buf, options));
|
||||
if (findDNSSECHeader(buf))
|
||||
return (dnssec.read(buf, options));
|
||||
buf = new Buffer(buf, 'binary');
|
||||
buf = Buffer.from(buf, 'binary');
|
||||
} else {
|
||||
assert.buffer(buf);
|
||||
if (findPEMHeader(buf))
|
||||
|
||||
+8
-7
@@ -6,6 +6,7 @@ module.exports = {
|
||||
};
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var Key = require('../key');
|
||||
var PrivateKey = require('../private-key');
|
||||
var utils = require('../utils');
|
||||
@@ -66,7 +67,7 @@ function readRFC3110(keyString) {
|
||||
if (!supportedAlgosById[algorithm])
|
||||
throw (new Error('Unsupported algorithm: ' + algorithm));
|
||||
var base64key = elems.slice(6, elems.length).join();
|
||||
var keyBuffer = new Buffer(base64key, 'base64');
|
||||
var keyBuffer = Buffer.from(base64key, 'base64');
|
||||
if (supportedAlgosById[algorithm].match(/^RSA-/)) {
|
||||
// join the rest of the body into a single base64-blob
|
||||
var publicExponentLen = keyBuffer.readUInt8(0);
|
||||
@@ -101,7 +102,7 @@ function readRFC3110(keyString) {
|
||||
curve: curve,
|
||||
size: size,
|
||||
parts: [
|
||||
{name: 'curve', data: new Buffer(curve) },
|
||||
{name: 'curve', data: Buffer.from(curve) },
|
||||
{name: 'Q', data: utils.ecNormalize(keyBuffer) }
|
||||
]
|
||||
};
|
||||
@@ -112,7 +113,7 @@ function readRFC3110(keyString) {
|
||||
}
|
||||
|
||||
function elementToBuf(e) {
|
||||
return (new Buffer(e.split(' ')[1], 'base64'));
|
||||
return (Buffer.from(e.split(' ')[1], 'base64'));
|
||||
}
|
||||
|
||||
function readDNSSECRSAPrivateKey(elements) {
|
||||
@@ -161,7 +162,7 @@ function readDNSSECPrivateKey(alg, elements) {
|
||||
}
|
||||
if (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' ||
|
||||
supportedAlgosById[alg] === 'ECDSA-P256-SHA256') {
|
||||
var d = new Buffer(elements[0].split(' ')[1], 'base64');
|
||||
var d = Buffer.from(elements[0].split(' ')[1], 'base64');
|
||||
var curve = 'nistp384';
|
||||
var size = 384;
|
||||
if (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') {
|
||||
@@ -176,7 +177,7 @@ function readDNSSECPrivateKey(alg, elements) {
|
||||
curve: curve,
|
||||
size: size,
|
||||
parts: [
|
||||
{name: 'curve', data: new Buffer(curve) },
|
||||
{name: 'curve', data: Buffer.from(curve) },
|
||||
{name: 'd', data: d },
|
||||
{name: 'Q', data: Q }
|
||||
]
|
||||
@@ -237,7 +238,7 @@ function writeRSA(key, options) {
|
||||
out += 'Created: ' + dnssecTimestamp(timestamp) + '\n';
|
||||
out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n';
|
||||
out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n';
|
||||
return (new Buffer(out, 'ascii'));
|
||||
return (Buffer.from(out, 'ascii'));
|
||||
}
|
||||
|
||||
function writeECDSA(key, options) {
|
||||
@@ -260,7 +261,7 @@ function writeECDSA(key, options) {
|
||||
out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n';
|
||||
out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n';
|
||||
|
||||
return (new Buffer(out, 'ascii'));
|
||||
return (Buffer.from(out, 'ascii'));
|
||||
}
|
||||
|
||||
function write(key, options) {
|
||||
|
||||
+41
-11
@@ -15,6 +15,7 @@ module.exports = {
|
||||
var assert = require('assert-plus');
|
||||
var SSHBuffer = require('../ssh-buffer');
|
||||
var crypto = require('crypto');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var Key = require('../key');
|
||||
var PrivateKey = require('../private-key');
|
||||
@@ -50,7 +51,7 @@ function read(buf, options) {
|
||||
var algo = parts[0];
|
||||
var data = parts[1];
|
||||
|
||||
data = new Buffer(data, 'base64');
|
||||
data = Buffer.from(data, 'base64');
|
||||
return (fromBuffer(data, algo));
|
||||
}
|
||||
|
||||
@@ -121,8 +122,23 @@ function fromBuffer(data, algo, partial) {
|
||||
cert.validFrom = int64ToDate(sshbuf.readInt64());
|
||||
cert.validUntil = int64ToDate(sshbuf.readInt64());
|
||||
|
||||
cert.signatures.openssh.critical = sshbuf.readBuffer();
|
||||
cert.signatures.openssh.exts = sshbuf.readBuffer();
|
||||
var exts = [];
|
||||
var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() });
|
||||
var ext;
|
||||
while (!extbuf.atEnd()) {
|
||||
ext = { critical: true };
|
||||
ext.name = extbuf.readString();
|
||||
ext.data = extbuf.readBuffer();
|
||||
exts.push(ext);
|
||||
}
|
||||
extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() });
|
||||
while (!extbuf.atEnd()) {
|
||||
ext = { critical: false };
|
||||
ext.name = extbuf.readString();
|
||||
ext.data = extbuf.readBuffer();
|
||||
exts.push(ext);
|
||||
}
|
||||
cert.signatures.openssh.exts = exts;
|
||||
|
||||
/* reserved */
|
||||
sshbuf.readBuffer();
|
||||
@@ -164,7 +180,7 @@ function dateToInt64(date) {
|
||||
var i = Math.round(date.getTime() / 1000);
|
||||
var upper = Math.floor(i / 4294967296);
|
||||
var lower = Math.floor(i % 4294967296);
|
||||
var buf = new Buffer(8);
|
||||
var buf = Buffer.alloc(8);
|
||||
buf.writeUInt32BE(upper, 0);
|
||||
buf.writeUInt32BE(lower, 4);
|
||||
return (buf);
|
||||
@@ -277,16 +293,30 @@ function toBuffer(cert, noSig) {
|
||||
buf.writeInt64(dateToInt64(cert.validFrom));
|
||||
buf.writeInt64(dateToInt64(cert.validUntil));
|
||||
|
||||
if (sig.critical === undefined)
|
||||
sig.critical = new Buffer(0);
|
||||
buf.writeBuffer(sig.critical);
|
||||
var exts = sig.exts;
|
||||
if (exts === undefined)
|
||||
exts = [];
|
||||
|
||||
if (sig.exts === undefined)
|
||||
sig.exts = new Buffer(0);
|
||||
buf.writeBuffer(sig.exts);
|
||||
var extbuf = new SSHBuffer({});
|
||||
exts.forEach(function (ext) {
|
||||
if (ext.critical !== true)
|
||||
return;
|
||||
extbuf.writeString(ext.name);
|
||||
extbuf.writeBuffer(ext.data);
|
||||
});
|
||||
buf.writeBuffer(extbuf.toBuffer());
|
||||
|
||||
extbuf = new SSHBuffer({});
|
||||
exts.forEach(function (ext) {
|
||||
if (ext.critical === true)
|
||||
return;
|
||||
extbuf.writeString(ext.name);
|
||||
extbuf.writeBuffer(ext.data);
|
||||
});
|
||||
buf.writeBuffer(extbuf.toBuffer());
|
||||
|
||||
/* reserved */
|
||||
buf.writeBuffer(new Buffer(0));
|
||||
buf.writeBuffer(Buffer.alloc(0));
|
||||
|
||||
sub = rfc4253.write(cert.issuerKey);
|
||||
buf.writeBuffer(sub);
|
||||
|
||||
+5
-4
@@ -8,6 +8,7 @@ module.exports = {
|
||||
var assert = require('assert-plus');
|
||||
var asn1 = require('asn1');
|
||||
var crypto = require('crypto');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
@@ -67,7 +68,7 @@ function read(buf, options, forceType) {
|
||||
var parts = headers['proc-type'].split(',');
|
||||
if (parts[0] === '4' && parts[1] === 'ENCRYPTED') {
|
||||
if (typeof (options.passphrase) === 'string') {
|
||||
options.passphrase = new Buffer(
|
||||
options.passphrase = Buffer.from(
|
||||
options.passphrase, 'utf-8');
|
||||
}
|
||||
if (!Buffer.isBuffer(options.passphrase)) {
|
||||
@@ -77,7 +78,7 @@ function read(buf, options, forceType) {
|
||||
parts = headers['dek-info'].split(',');
|
||||
assert.ok(parts.length === 2);
|
||||
cipher = parts[0].toLowerCase();
|
||||
iv = new Buffer(parts[1], 'hex');
|
||||
iv = Buffer.from(parts[1], 'hex');
|
||||
key = utils.opensslKeyDeriv(cipher, iv,
|
||||
options.passphrase, 1).key;
|
||||
}
|
||||
@@ -86,7 +87,7 @@ function read(buf, options, forceType) {
|
||||
|
||||
/* Chop off the first and last lines */
|
||||
lines = lines.slice(0, -1).join('');
|
||||
buf = new Buffer(lines, 'base64');
|
||||
buf = Buffer.from(lines, 'base64');
|
||||
|
||||
if (cipher && key && iv) {
|
||||
var cipherStream = crypto.createDecipheriv(cipher, key, iv);
|
||||
@@ -174,7 +175,7 @@ function write(key, options, type) {
|
||||
var tmp = der.buffer.toString('base64');
|
||||
var len = tmp.length + (tmp.length / 64) +
|
||||
18 + 16 + header.length*2 + 10;
|
||||
var buf = new Buffer(len);
|
||||
var buf = Buffer.alloc(len);
|
||||
var o = 0;
|
||||
o += buf.write('-----BEGIN ' + header + '-----\n', o);
|
||||
for (var i = 0; i < tmp.length; ) {
|
||||
|
||||
+7
-10
@@ -9,6 +9,7 @@ module.exports = {
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var asn1 = require('asn1');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
|
||||
@@ -209,7 +210,7 @@ function readPkcs1ECDSAPublic(der) {
|
||||
var key = {
|
||||
type: 'ecdsa',
|
||||
parts: [
|
||||
{ name: 'curve', data: new Buffer(curve) },
|
||||
{ name: 'curve', data: Buffer.from(curve) },
|
||||
{ name: 'Q', data: Q }
|
||||
]
|
||||
};
|
||||
@@ -235,7 +236,7 @@ function readPkcs1ECDSAPrivate(der) {
|
||||
var key = {
|
||||
type: 'ecdsa',
|
||||
parts: [
|
||||
{ name: 'curve', data: new Buffer(curve) },
|
||||
{ name: 'curve', data: Buffer.from(curve) },
|
||||
{ name: 'Q', data: Q },
|
||||
{ name: 'd', data: d }
|
||||
]
|
||||
@@ -285,8 +286,7 @@ function writePkcs1RSAPublic(der, key) {
|
||||
}
|
||||
|
||||
function writePkcs1RSAPrivate(der, key) {
|
||||
var ver = new Buffer(1);
|
||||
ver[0] = 0;
|
||||
var ver = Buffer.from([0]);
|
||||
der.writeBuffer(ver, asn1.Ber.Integer);
|
||||
|
||||
der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
|
||||
@@ -302,8 +302,7 @@ function writePkcs1RSAPrivate(der, key) {
|
||||
}
|
||||
|
||||
function writePkcs1DSAPrivate(der, key) {
|
||||
var ver = new Buffer(1);
|
||||
ver[0] = 0;
|
||||
var ver = Buffer.from([0]);
|
||||
der.writeBuffer(ver, asn1.Ber.Integer);
|
||||
|
||||
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
|
||||
@@ -336,8 +335,7 @@ function writePkcs1ECDSAPublic(der, key) {
|
||||
}
|
||||
|
||||
function writePkcs1ECDSAPrivate(der, key) {
|
||||
var ver = new Buffer(1);
|
||||
ver[0] = 1;
|
||||
var ver = Buffer.from([1]);
|
||||
der.writeBuffer(ver, asn1.Ber.Integer);
|
||||
|
||||
der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);
|
||||
@@ -356,8 +354,7 @@ function writePkcs1ECDSAPrivate(der, key) {
|
||||
}
|
||||
|
||||
function writePkcs1EdDSAPrivate(der, key) {
|
||||
var ver = new Buffer(1);
|
||||
ver[0] = 1;
|
||||
var ver = Buffer.from([1]);
|
||||
der.writeBuffer(ver, asn1.Ber.Integer);
|
||||
|
||||
der.writeBuffer(key.part.k.data, asn1.Ber.OctetString);
|
||||
|
||||
+8
-12
@@ -12,6 +12,7 @@ module.exports = {
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var asn1 = require('asn1');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
@@ -307,7 +308,7 @@ function readPkcs8ECDSAPrivate(der) {
|
||||
var key = {
|
||||
type: 'ecdsa',
|
||||
parts: [
|
||||
{ name: 'curve', data: new Buffer(curveName) },
|
||||
{ name: 'curve', data: Buffer.from(curveName) },
|
||||
{ name: 'Q', data: Q },
|
||||
{ name: 'd', data: d }
|
||||
]
|
||||
@@ -326,7 +327,7 @@ function readPkcs8ECDSAPublic(der) {
|
||||
var key = {
|
||||
type: 'ecdsa',
|
||||
parts: [
|
||||
{ name: 'curve', data: new Buffer(curveName) },
|
||||
{ name: 'curve', data: Buffer.from(curveName) },
|
||||
{ name: 'Q', data: Q }
|
||||
]
|
||||
};
|
||||
@@ -415,8 +416,7 @@ function writePkcs8(der, key) {
|
||||
der.startSequence();
|
||||
|
||||
if (PrivateKey.isPrivateKey(key)) {
|
||||
var sillyInt = new Buffer(1);
|
||||
sillyInt[0] = 0x0;
|
||||
var sillyInt = Buffer.from([0]);
|
||||
der.writeBuffer(sillyInt, asn1.Ber.Integer);
|
||||
}
|
||||
|
||||
@@ -464,8 +464,7 @@ function writePkcs8RSAPrivate(key, der) {
|
||||
der.startSequence(asn1.Ber.OctetString);
|
||||
der.startSequence();
|
||||
|
||||
var version = new Buffer(1);
|
||||
version[0] = 0;
|
||||
var version = Buffer.from([0]);
|
||||
der.writeBuffer(version, asn1.Ber.Integer);
|
||||
|
||||
der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
|
||||
@@ -536,8 +535,7 @@ function writeECDSACurve(key, der) {
|
||||
// ECParameters sequence
|
||||
der.startSequence();
|
||||
|
||||
var version = new Buffer(1);
|
||||
version.writeUInt8(1, 0);
|
||||
var version = Buffer.from([1]);
|
||||
der.writeBuffer(version, asn1.Ber.Integer);
|
||||
|
||||
// FieldID sequence
|
||||
@@ -560,8 +558,7 @@ function writeECDSACurve(key, der) {
|
||||
der.writeBuffer(curve.n, asn1.Ber.Integer);
|
||||
var h = curve.h;
|
||||
if (!h) {
|
||||
h = new Buffer(1);
|
||||
h[0] = 1;
|
||||
h = Buffer.from([1]);
|
||||
}
|
||||
der.writeBuffer(h, asn1.Ber.Integer);
|
||||
|
||||
@@ -585,8 +582,7 @@ function writePkcs8ECDSAPrivate(key, der) {
|
||||
der.startSequence(asn1.Ber.OctetString);
|
||||
der.startSequence();
|
||||
|
||||
var version = new Buffer(1);
|
||||
version[0] = 1;
|
||||
var version = Buffer.from([1]);
|
||||
der.writeBuffer(version, asn1.Ber.Integer);
|
||||
|
||||
der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);
|
||||
|
||||
+2
-1
@@ -14,6 +14,7 @@ module.exports = {
|
||||
};
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
@@ -54,7 +55,7 @@ function keyTypeToAlg(key) {
|
||||
|
||||
function read(partial, type, buf, options) {
|
||||
if (typeof (buf) === 'string')
|
||||
buf = new Buffer(buf);
|
||||
buf = Buffer.from(buf);
|
||||
assert.buffer(buf, 'buf');
|
||||
|
||||
var key = {};
|
||||
|
||||
+7
-6
@@ -8,6 +8,7 @@ module.exports = {
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var asn1 = require('asn1');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
var crypto = require('crypto');
|
||||
@@ -70,7 +71,7 @@ function readSSHPrivate(type, buf, options) {
|
||||
}
|
||||
|
||||
if (typeof (options.passphrase) === 'string') {
|
||||
options.passphrase = new Buffer(options.passphrase,
|
||||
options.passphrase = Buffer.from(options.passphrase,
|
||||
'utf-8');
|
||||
}
|
||||
if (!Buffer.isBuffer(options.passphrase)) {
|
||||
@@ -88,7 +89,7 @@ function readSSHPrivate(type, buf, options) {
|
||||
throw (new Error('bcrypt_pbkdf function returned ' +
|
||||
'failure, parameters invalid'));
|
||||
}
|
||||
out = new Buffer(out);
|
||||
out = Buffer.from(out);
|
||||
var ckey = out.slice(0, cinf.keySize);
|
||||
var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);
|
||||
var cipherStream = crypto.createDecipheriv(cinf.opensslName,
|
||||
@@ -142,13 +143,13 @@ function write(key, options) {
|
||||
|
||||
var cipher = 'none';
|
||||
var kdf = 'none';
|
||||
var kdfopts = new Buffer(0);
|
||||
var kdfopts = Buffer.alloc(0);
|
||||
var cinf = { blockSize: 8 };
|
||||
var passphrase;
|
||||
if (options !== undefined) {
|
||||
passphrase = options.passphrase;
|
||||
if (typeof (passphrase) === 'string')
|
||||
passphrase = new Buffer(passphrase, 'utf-8');
|
||||
passphrase = Buffer.from(passphrase, 'utf-8');
|
||||
if (passphrase !== undefined) {
|
||||
assert.buffer(passphrase, 'options.passphrase');
|
||||
assert.optionalString(options.cipher, 'options.cipher');
|
||||
@@ -199,7 +200,7 @@ function write(key, options) {
|
||||
throw (new Error('bcrypt_pbkdf function returned ' +
|
||||
'failure, parameters invalid'));
|
||||
}
|
||||
out = new Buffer(out);
|
||||
out = Buffer.from(out);
|
||||
var ckey = out.slice(0, cinf.keySize);
|
||||
var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);
|
||||
|
||||
@@ -244,7 +245,7 @@ function write(key, options) {
|
||||
var tmp = buf.toString('base64');
|
||||
var len = tmp.length + (tmp.length / 70) +
|
||||
18 + 16 + header.length*2 + 10;
|
||||
buf = new Buffer(len);
|
||||
buf = Buffer.alloc(len);
|
||||
var o = 0;
|
||||
o += buf.write('-----BEGIN ' + header + '-----\n', o);
|
||||
for (var i = 0; i < tmp.length; ) {
|
||||
|
||||
+4
-3
@@ -6,6 +6,7 @@ module.exports = {
|
||||
};
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var rfc4253 = require('./rfc4253');
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
@@ -31,7 +32,7 @@ function read(buf, options) {
|
||||
assert.ok(m, 'key must match regex');
|
||||
|
||||
var type = rfc4253.algToKeyType(m[1]);
|
||||
var kbuf = new Buffer(m[2], 'base64');
|
||||
var kbuf = Buffer.from(m[2], 'base64');
|
||||
|
||||
/*
|
||||
* This is a bit tricky. If we managed to parse the key and locate the
|
||||
@@ -50,7 +51,7 @@ function read(buf, options) {
|
||||
} catch (e) {
|
||||
m = trimmed.match(SSHKEY_RE2);
|
||||
assert.ok(m, 'key must match regex');
|
||||
kbuf = new Buffer(m[2], 'base64');
|
||||
kbuf = Buffer.from(m[2], 'base64');
|
||||
key = rfc4253.readInternal(ret, 'public', kbuf);
|
||||
}
|
||||
} else {
|
||||
@@ -110,5 +111,5 @@ function write(key, options) {
|
||||
if (key.comment)
|
||||
parts.push(key.comment);
|
||||
|
||||
return (new Buffer(parts.join(' ')));
|
||||
return (Buffer.from(parts.join(' ')));
|
||||
}
|
||||
|
||||
+3
-2
@@ -11,6 +11,7 @@ module.exports = {
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var asn1 = require('asn1');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
@@ -48,7 +49,7 @@ function read(buf, options) {
|
||||
|
||||
/* Chop off the first and last lines */
|
||||
lines = lines.slice(0, -1).join('');
|
||||
buf = new Buffer(lines, 'base64');
|
||||
buf = Buffer.from(lines, 'base64');
|
||||
|
||||
return (x509.read(buf, options));
|
||||
}
|
||||
@@ -60,7 +61,7 @@ function write(cert, options) {
|
||||
var tmp = dbuf.toString('base64');
|
||||
var len = tmp.length + (tmp.length / 64) +
|
||||
18 + 16 + header.length*2 + 10;
|
||||
var buf = new Buffer(len);
|
||||
var buf = Buffer.alloc(len);
|
||||
var o = 0;
|
||||
o += buf.write('-----BEGIN ' + header + '-----\n', o);
|
||||
for (var i = 0; i < tmp.length; ) {
|
||||
|
||||
+6
-5
@@ -10,6 +10,7 @@ module.exports = {
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var asn1 = require('asn1');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('../algs');
|
||||
var utils = require('../utils');
|
||||
var Key = require('../key');
|
||||
@@ -89,7 +90,7 @@ var EXTS = {
|
||||
|
||||
function read(buf, options) {
|
||||
if (typeof (buf) === 'string') {
|
||||
buf = new Buffer(buf, 'binary');
|
||||
buf = Buffer.from(buf, 'binary');
|
||||
}
|
||||
assert.buffer(buf, 'buf');
|
||||
|
||||
@@ -241,7 +242,8 @@ function readExtension(cert, buf, der) {
|
||||
var extId = der.readOID();
|
||||
var id;
|
||||
var sig = cert.signatures.x509;
|
||||
sig.extras.exts = [];
|
||||
if (!sig.extras.exts)
|
||||
sig.extras.exts = [];
|
||||
|
||||
var critical;
|
||||
if (der.peek() === asn1.Ber.Boolean)
|
||||
@@ -500,7 +502,7 @@ function write(cert, options) {
|
||||
der.endSequence();
|
||||
|
||||
var sigData = sig.signature.toBuffer('asn1');
|
||||
var data = new Buffer(sigData.length + 1);
|
||||
var data = Buffer.alloc(sigData.length + 1);
|
||||
data[0] = 0;
|
||||
sigData.copy(data, 1);
|
||||
der.writeBuffer(data, asn1.Ber.BitString);
|
||||
@@ -710,8 +712,7 @@ function writeBitField(setBits, bitIndex) {
|
||||
var bitLen = bitIndex.length;
|
||||
var blen = Math.ceil(bitLen / 8);
|
||||
var unused = blen * 8 - bitLen;
|
||||
var bits = new Buffer(1 + blen);
|
||||
bits.fill(0);
|
||||
var bits = Buffer.alloc(1 + blen); // zero-filled
|
||||
bits[0] = unused;
|
||||
for (var i = 0; i < bitLen; ++i) {
|
||||
var byteN = 1 + Math.floor(i / 8);
|
||||
|
||||
+89
-4
@@ -11,6 +11,7 @@ var errs = require('./errors');
|
||||
var util = require('util');
|
||||
var utils = require('./utils');
|
||||
var asn1 = require('asn1');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
|
||||
/*JSSTYLED*/
|
||||
var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i;
|
||||
@@ -23,9 +24,21 @@ oids.l = '2.5.4.7';
|
||||
oids.s = '2.5.4.8';
|
||||
oids.c = '2.5.4.6';
|
||||
oids.sn = '2.5.4.4';
|
||||
oids.postalCode = '2.5.4.17';
|
||||
oids.serialNumber = '2.5.4.5';
|
||||
oids.street = '2.5.4.9';
|
||||
oids.x500UniqueIdentifier = '2.5.4.45';
|
||||
oids.role = '2.5.4.72';
|
||||
oids.telephoneNumber = '2.5.4.20';
|
||||
oids.description = '2.5.4.13';
|
||||
oids.dc = '0.9.2342.19200300.100.1.25';
|
||||
oids.uid = '0.9.2342.19200300.100.1.1';
|
||||
oids.mail = '0.9.2342.19200300.100.1.3';
|
||||
oids.title = '2.5.4.12';
|
||||
oids.gn = '2.5.4.42';
|
||||
oids.initials = '2.5.4.43';
|
||||
oids.pseudonym = '2.5.4.65';
|
||||
oids.emailAddress = '1.2.840.113549.1.9.1';
|
||||
|
||||
var unoids = {};
|
||||
Object.keys(oids).forEach(function (k) {
|
||||
@@ -112,10 +125,39 @@ function Identity(opts) {
|
||||
|
||||
Identity.prototype.toString = function () {
|
||||
return (this.components.map(function (c) {
|
||||
return (c.name.toUpperCase() + '=' + c.value);
|
||||
var n = c.name.toUpperCase();
|
||||
/*JSSTYLED*/
|
||||
n = n.replace(/=/g, '\\=');
|
||||
var v = c.value;
|
||||
/*JSSTYLED*/
|
||||
v = v.replace(/,/g, '\\,');
|
||||
return (n + '=' + v);
|
||||
}).join(', '));
|
||||
};
|
||||
|
||||
Identity.prototype.get = function (name, asArray) {
|
||||
assert.string(name, 'name');
|
||||
var arr = this.componentLookup[name];
|
||||
if (arr === undefined || arr.length === 0)
|
||||
return (undefined);
|
||||
if (!asArray && arr.length > 1)
|
||||
throw (new Error('Multiple values for attribute ' + name));
|
||||
if (!asArray)
|
||||
return (arr[0].value);
|
||||
return (arr.map(function (c) {
|
||||
return (c.value);
|
||||
}));
|
||||
};
|
||||
|
||||
Identity.prototype.toArray = function (idx) {
|
||||
return (this.components.map(function (c) {
|
||||
return ({
|
||||
name: c.name,
|
||||
value: c.value
|
||||
});
|
||||
}));
|
||||
};
|
||||
|
||||
/*
|
||||
* These are from X.680 -- PrintableString allowed chars are in section 37.4
|
||||
* table 8. Spec for IA5Strings is "1,6 + SPACE + DEL" where 1 refers to
|
||||
@@ -143,7 +185,7 @@ Identity.prototype.toAsn1 = function (der, tag) {
|
||||
*/
|
||||
if (c.asn1type === asn1.Ber.Utf8String ||
|
||||
c.value.match(NOT_IA5)) {
|
||||
var v = new Buffer(c.value, 'utf8');
|
||||
var v = Buffer.from(c.value, 'utf8');
|
||||
der.writeBuffer(v, asn1.Ber.Utf8String);
|
||||
|
||||
} else if (c.asn1type === asn1.Ber.IA5String ||
|
||||
@@ -223,17 +265,60 @@ Identity.forEmail = function (email) {
|
||||
|
||||
Identity.parseDN = function (dn) {
|
||||
assert.string(dn, 'dn');
|
||||
var parts = dn.split(',');
|
||||
var parts = [''];
|
||||
var idx = 0;
|
||||
var rem = dn;
|
||||
while (rem.length > 0) {
|
||||
var m;
|
||||
/*JSSTYLED*/
|
||||
if ((m = /^,/.exec(rem)) !== null) {
|
||||
parts[++idx] = '';
|
||||
rem = rem.slice(m[0].length);
|
||||
/*JSSTYLED*/
|
||||
} else if ((m = /^\\,/.exec(rem)) !== null) {
|
||||
parts[idx] += ',';
|
||||
rem = rem.slice(m[0].length);
|
||||
/*JSSTYLED*/
|
||||
} else if ((m = /^\\./.exec(rem)) !== null) {
|
||||
parts[idx] += m[0];
|
||||
rem = rem.slice(m[0].length);
|
||||
/*JSSTYLED*/
|
||||
} else if ((m = /^[^\\,]+/.exec(rem)) !== null) {
|
||||
parts[idx] += m[0];
|
||||
rem = rem.slice(m[0].length);
|
||||
} else {
|
||||
throw (new Error('Failed to parse DN'));
|
||||
}
|
||||
}
|
||||
var cmps = parts.map(function (c) {
|
||||
c = c.trim();
|
||||
var eqPos = c.indexOf('=');
|
||||
var name = c.slice(0, eqPos).toLowerCase();
|
||||
while (eqPos > 0 && c.charAt(eqPos - 1) === '\\')
|
||||
eqPos = c.indexOf('=', eqPos + 1);
|
||||
if (eqPos === -1) {
|
||||
throw (new Error('Failed to parse DN'));
|
||||
}
|
||||
/*JSSTYLED*/
|
||||
var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, '=');
|
||||
var value = c.slice(eqPos + 1);
|
||||
return ({ name: name, value: value });
|
||||
});
|
||||
return (new Identity({ components: cmps }));
|
||||
};
|
||||
|
||||
Identity.fromArray = function (components) {
|
||||
assert.arrayOfObject(components, 'components');
|
||||
components.forEach(function (cmp) {
|
||||
assert.object(cmp, 'component');
|
||||
assert.string(cmp.name, 'component.name');
|
||||
if (!Buffer.isBuffer(cmp.value) &&
|
||||
!(typeof (cmp.value) === 'string')) {
|
||||
throw (new Error('Invalid component value'));
|
||||
}
|
||||
});
|
||||
return (new Identity({ components: components }));
|
||||
};
|
||||
|
||||
Identity.parseAsn1 = function (der, top) {
|
||||
var components = [];
|
||||
der.readSequence(top);
|
||||
|
||||
+1
@@ -28,6 +28,7 @@ module.exports = {
|
||||
identityForHost: Identity.forHost,
|
||||
identityForUser: Identity.forUser,
|
||||
identityForEmail: Identity.forEmail,
|
||||
identityFromArray: Identity.fromArray,
|
||||
|
||||
/* errors */
|
||||
FingerprintFormatError: errs.FingerprintFormatError,
|
||||
|
||||
+6
-17
@@ -3,6 +3,7 @@
|
||||
module.exports = PrivateKey;
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('./algs');
|
||||
var crypto = require('crypto');
|
||||
var Fingerprint = require('./fingerprint');
|
||||
@@ -13,14 +14,8 @@ var utils = require('./utils');
|
||||
var dhe = require('./dhe');
|
||||
var generateECDSA = dhe.generateECDSA;
|
||||
var generateED25519 = dhe.generateED25519;
|
||||
var edCompat;
|
||||
var nacl;
|
||||
|
||||
try {
|
||||
edCompat = require('./ed-compat');
|
||||
} catch (e) {
|
||||
/* Just continue through, and bail out if we try to use it. */
|
||||
}
|
||||
var edCompat = require('./ed-compat');
|
||||
var nacl = require('tweetnacl');
|
||||
|
||||
var Key = require('./key');
|
||||
|
||||
@@ -89,15 +84,12 @@ PrivateKey.prototype.derive = function (newType) {
|
||||
var priv, pub, pair;
|
||||
|
||||
if (this.type === 'ed25519' && newType === 'curve25519') {
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
priv = this.part.k.data;
|
||||
if (priv[0] === 0x00)
|
||||
priv = priv.slice(1);
|
||||
|
||||
pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv));
|
||||
pub = new Buffer(pair.publicKey);
|
||||
pub = Buffer.from(pair.publicKey);
|
||||
|
||||
return (new PrivateKey({
|
||||
type: 'curve25519',
|
||||
@@ -107,15 +99,12 @@ PrivateKey.prototype.derive = function (newType) {
|
||||
]
|
||||
}));
|
||||
} else if (this.type === 'curve25519' && newType === 'ed25519') {
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
priv = this.part.k.data;
|
||||
if (priv[0] === 0x00)
|
||||
priv = priv.slice(1);
|
||||
|
||||
pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv));
|
||||
pub = new Buffer(pair.publicKey);
|
||||
pub = Buffer.from(pair.publicKey);
|
||||
|
||||
return (new PrivateKey({
|
||||
type: 'ed25519',
|
||||
@@ -166,7 +155,7 @@ PrivateKey.prototype.createSign = function (hashAlgo) {
|
||||
v.sign = function () {
|
||||
var sig = oldSign(key);
|
||||
if (typeof (sig) === 'string')
|
||||
sig = new Buffer(sig, 'binary');
|
||||
sig = Buffer.from(sig, 'binary');
|
||||
sig = Signature.parse(sig, type, 'asn1');
|
||||
sig.hashAlgorithm = hashAlgo;
|
||||
sig.curve = curve;
|
||||
|
||||
+2
-1
@@ -3,6 +3,7 @@
|
||||
module.exports = Signature;
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var algs = require('./algs');
|
||||
var crypto = require('crypto');
|
||||
var errs = require('./errors');
|
||||
@@ -141,7 +142,7 @@ Signature.prototype.toString = function (format) {
|
||||
|
||||
Signature.parse = function (data, type, format) {
|
||||
if (typeof (data) === 'string')
|
||||
data = new Buffer(data, 'base64');
|
||||
data = Buffer.from(data, 'base64');
|
||||
assert.buffer(data, 'data');
|
||||
assert.string(format, 'format');
|
||||
assert.string(type, 'type');
|
||||
|
||||
+4
-3
@@ -3,6 +3,7 @@
|
||||
module.exports = SSHBuffer;
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
|
||||
function SSHBuffer(opts) {
|
||||
assert.object(opts, 'options');
|
||||
@@ -10,7 +11,7 @@ function SSHBuffer(opts) {
|
||||
assert.buffer(opts.buffer, 'options.buffer');
|
||||
|
||||
this._size = opts.buffer ? opts.buffer.length : 1024;
|
||||
this._buffer = opts.buffer || (new Buffer(this._size));
|
||||
this._buffer = opts.buffer || Buffer.alloc(this._size);
|
||||
this._offset = 0;
|
||||
}
|
||||
|
||||
@@ -32,7 +33,7 @@ SSHBuffer.prototype.skip = function (n) {
|
||||
|
||||
SSHBuffer.prototype.expand = function () {
|
||||
this._size *= 2;
|
||||
var buf = new Buffer(this._size);
|
||||
var buf = Buffer.alloc(this._size);
|
||||
this._buffer.copy(buf, 0);
|
||||
this._buffer = buf;
|
||||
};
|
||||
@@ -96,7 +97,7 @@ SSHBuffer.prototype.writeBuffer = function (buf) {
|
||||
};
|
||||
|
||||
SSHBuffer.prototype.writeString = function (str) {
|
||||
this.writeBuffer(new Buffer(str, 'utf8'));
|
||||
this.writeBuffer(Buffer.from(str, 'utf8'));
|
||||
};
|
||||
|
||||
SSHBuffer.prototype.writeCString = function (str) {
|
||||
|
||||
+23
-42
@@ -21,14 +21,16 @@ module.exports = {
|
||||
};
|
||||
|
||||
var assert = require('assert-plus');
|
||||
var Buffer = require('safer-buffer').Buffer;
|
||||
var PrivateKey = require('./private-key');
|
||||
var Key = require('./key');
|
||||
var crypto = require('crypto');
|
||||
var algs = require('./algs');
|
||||
var asn1 = require('asn1');
|
||||
|
||||
var ec, jsbn;
|
||||
var nacl;
|
||||
var ec = require('ecc-jsbn/lib/ec');
|
||||
var jsbn = require('jsbn').BigInteger;
|
||||
var nacl = require('tweetnacl');
|
||||
|
||||
var MAX_CLASS_DEPTH = 3;
|
||||
|
||||
@@ -85,8 +87,9 @@ function assertCompatible(obj, klass, needVer, name) {
|
||||
}
|
||||
|
||||
var CIPHER_LEN = {
|
||||
'des-ede3-cbc': { key: 7, iv: 8 },
|
||||
'aes-128-cbc': { key: 16, iv: 16 }
|
||||
'des-ede3-cbc': { key: 24, iv: 8 },
|
||||
'aes-128-cbc': { key: 16, iv: 16 },
|
||||
'aes-256-cbc': { key: 32, iv: 16 }
|
||||
};
|
||||
var PKCS5_SALT_LEN = 8;
|
||||
|
||||
@@ -101,7 +104,7 @@ function opensslKeyDeriv(cipher, salt, passphrase, count) {
|
||||
salt = salt.slice(0, PKCS5_SALT_LEN);
|
||||
|
||||
var D, D_prev, bufs;
|
||||
var material = new Buffer(0);
|
||||
var material = Buffer.alloc(0);
|
||||
while (material.length < clen.key + clen.iv) {
|
||||
bufs = [];
|
||||
if (D_prev)
|
||||
@@ -185,7 +188,7 @@ function ecNormalize(buf, addZero) {
|
||||
if (!addZero)
|
||||
return (buf);
|
||||
}
|
||||
var b = new Buffer(buf.length + 1);
|
||||
var b = Buffer.alloc(buf.length + 1);
|
||||
b[0] = 0x0;
|
||||
buf.copy(b, 1);
|
||||
return (b);
|
||||
@@ -203,7 +206,7 @@ function readBitString(der, tag) {
|
||||
function writeBitString(der, buf, tag) {
|
||||
if (tag === undefined)
|
||||
tag = asn1.Ber.BitString;
|
||||
var b = new Buffer(buf.length + 1);
|
||||
var b = Buffer.alloc(buf.length + 1);
|
||||
b[0] = 0x00;
|
||||
buf.copy(b, 1);
|
||||
der.writeBuffer(b, tag);
|
||||
@@ -214,7 +217,7 @@ function mpNormalize(buf) {
|
||||
while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00)
|
||||
buf = buf.slice(1);
|
||||
if ((buf[0] & 0x80) === 0x80) {
|
||||
var b = new Buffer(buf.length + 1);
|
||||
var b = Buffer.alloc(buf.length + 1);
|
||||
b[0] = 0x00;
|
||||
buf.copy(b, 1);
|
||||
buf = b;
|
||||
@@ -237,7 +240,7 @@ function zeroPadToLength(buf, len) {
|
||||
buf = buf.slice(1);
|
||||
}
|
||||
while (buf.length < len) {
|
||||
var b = new Buffer(buf.length + 1);
|
||||
var b = Buffer.alloc(buf.length + 1);
|
||||
b[0] = 0x00;
|
||||
buf.copy(b, 1);
|
||||
buf = b;
|
||||
@@ -246,7 +249,7 @@ function zeroPadToLength(buf, len) {
|
||||
}
|
||||
|
||||
function bigintToMpBuf(bigint) {
|
||||
var buf = new Buffer(bigint.toByteArray());
|
||||
var buf = Buffer.from(bigint.toByteArray());
|
||||
buf = mpNormalize(buf);
|
||||
return (buf);
|
||||
}
|
||||
@@ -255,15 +258,9 @@ function calculateDSAPublic(g, p, x) {
|
||||
assert.buffer(g);
|
||||
assert.buffer(p);
|
||||
assert.buffer(x);
|
||||
try {
|
||||
var bigInt = require('jsbn').BigInteger;
|
||||
} catch (e) {
|
||||
throw (new Error('To load a PKCS#8 format DSA private key, ' +
|
||||
'the node jsbn library is required.'));
|
||||
}
|
||||
g = new bigInt(g);
|
||||
p = new bigInt(p);
|
||||
x = new bigInt(x);
|
||||
g = new jsbn(g);
|
||||
p = new jsbn(p);
|
||||
x = new jsbn(x);
|
||||
var y = g.modPow(x, p);
|
||||
var ybuf = bigintToMpBuf(y);
|
||||
return (ybuf);
|
||||
@@ -272,38 +269,26 @@ function calculateDSAPublic(g, p, x) {
|
||||
function calculateED25519Public(k) {
|
||||
assert.buffer(k);
|
||||
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k));
|
||||
return (new Buffer(kp.publicKey));
|
||||
return (Buffer.from(kp.publicKey));
|
||||
}
|
||||
|
||||
function calculateX25519Public(k) {
|
||||
assert.buffer(k);
|
||||
|
||||
if (nacl === undefined)
|
||||
nacl = require('tweetnacl');
|
||||
|
||||
var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k));
|
||||
return (new Buffer(kp.publicKey));
|
||||
return (Buffer.from(kp.publicKey));
|
||||
}
|
||||
|
||||
function addRSAMissing(key) {
|
||||
assert.object(key);
|
||||
assertCompatible(key, PrivateKey, [1, 1]);
|
||||
try {
|
||||
var bigInt = require('jsbn').BigInteger;
|
||||
} catch (e) {
|
||||
throw (new Error('To write a PEM private key from ' +
|
||||
'this source, the node jsbn lib is required.'));
|
||||
}
|
||||
|
||||
var d = new bigInt(key.part.d.data);
|
||||
var d = new jsbn(key.part.d.data);
|
||||
var buf;
|
||||
|
||||
if (!key.part.dmodp) {
|
||||
var p = new bigInt(key.part.p.data);
|
||||
var p = new jsbn(key.part.p.data);
|
||||
var dmodp = d.mod(p.subtract(1));
|
||||
|
||||
buf = bigintToMpBuf(dmodp);
|
||||
@@ -311,7 +296,7 @@ function addRSAMissing(key) {
|
||||
key.parts.push(key.part.dmodp);
|
||||
}
|
||||
if (!key.part.dmodq) {
|
||||
var q = new bigInt(key.part.q.data);
|
||||
var q = new jsbn(key.part.q.data);
|
||||
var dmodq = d.mod(q.subtract(1));
|
||||
|
||||
buf = bigintToMpBuf(dmodq);
|
||||
@@ -323,10 +308,6 @@ function addRSAMissing(key) {
|
||||
function publicFromPrivateECDSA(curveName, priv) {
|
||||
assert.string(curveName, 'curveName');
|
||||
assert.buffer(priv);
|
||||
if (ec === undefined)
|
||||
ec = require('ecc-jsbn/lib/ec');
|
||||
if (jsbn === undefined)
|
||||
jsbn = require('jsbn').BigInteger;
|
||||
var params = algs.curves[curveName];
|
||||
var p = new jsbn(params.p);
|
||||
var a = new jsbn(params.a);
|
||||
@@ -336,10 +317,10 @@ function publicFromPrivateECDSA(curveName, priv) {
|
||||
|
||||
var d = new jsbn(mpNormalize(priv));
|
||||
var pub = G.multiply(d);
|
||||
pub = new Buffer(curve.encodePointHex(pub), 'hex');
|
||||
pub = Buffer.from(curve.encodePointHex(pub), 'hex');
|
||||
|
||||
var parts = [];
|
||||
parts.push({name: 'curve', data: new Buffer(curveName)});
|
||||
parts.push({name: 'curve', data: Buffer.from(curveName)});
|
||||
parts.push({name: 'Q', data: pub});
|
||||
|
||||
var key = new Key({type: 'ecdsa', curve: curve, parts: parts});
|
||||
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
Dave Eddy <dave@daveeddy.com>
|
||||
Fred Kuo <fred.kuo@joyent.com>
|
||||
Lars-Magnus Skog <ralphtheninja@riseup.net>
|
||||
Mark Cavage <mcavage@gmail.com>
|
||||
Patrick Mooney <pmooney@pfmooney.com>
|
||||
Rob Gulewich <robert.gulewich@joyent.com>
|
||||
Generated
Vendored
-14
@@ -1,14 +0,0 @@
|
||||
# assert-plus Changelog
|
||||
|
||||
## 1.0.0
|
||||
|
||||
- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input
|
||||
- Add assert.finite check. Previous assert.number callers should use this if
|
||||
they expect Infinity inputs to throw.
|
||||
|
||||
## 0.2.0
|
||||
|
||||
- Fix `assert.object(null)` so it throws
|
||||
- Fix optional/arrayOf exports for non-type-of asserts
|
||||
- Add optiona/arrayOf exports for Stream/Date/Regex/uuid
|
||||
- Add basic unit test coverage
|
||||
-162
@@ -1,162 +0,0 @@
|
||||
# assert-plus
|
||||
|
||||
This library is a super small wrapper over node's assert module that has two
|
||||
things: (1) the ability to disable assertions with the environment variable
|
||||
NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like
|
||||
`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks
|
||||
like this:
|
||||
|
||||
```javascript
|
||||
var assert = require('assert-plus');
|
||||
|
||||
function fooAccount(options, callback) {
|
||||
assert.object(options, 'options');
|
||||
assert.number(options.id, 'options.id');
|
||||
assert.bool(options.isManager, 'options.isManager');
|
||||
assert.string(options.name, 'options.name');
|
||||
assert.arrayOfString(options.email, 'options.email');
|
||||
assert.func(callback, 'callback');
|
||||
|
||||
// Do stuff
|
||||
callback(null, {});
|
||||
}
|
||||
```
|
||||
|
||||
# API
|
||||
|
||||
All methods that *aren't* part of node's core assert API are simply assumed to
|
||||
take an argument, and then a string 'name' that's not a message; `AssertionError`
|
||||
will be thrown if the assertion fails with a message like:
|
||||
|
||||
AssertionError: foo (string) is required
|
||||
at test (/home/mark/work/foo/foo.js:3:9)
|
||||
at Object.<anonymous> (/home/mark/work/foo/foo.js:15:1)
|
||||
at Module._compile (module.js:446:26)
|
||||
at Object..js (module.js:464:10)
|
||||
at Module.load (module.js:353:31)
|
||||
at Function._load (module.js:311:12)
|
||||
at Array.0 (module.js:484:10)
|
||||
at EventEmitter._tickCallback (node.js:190:38)
|
||||
|
||||
from:
|
||||
|
||||
```javascript
|
||||
function test(foo) {
|
||||
assert.string(foo, 'foo');
|
||||
}
|
||||
```
|
||||
|
||||
There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`:
|
||||
|
||||
```javascript
|
||||
function test(foo) {
|
||||
assert.arrayOfString(foo, 'foo');
|
||||
}
|
||||
```
|
||||
|
||||
You can assert IFF an argument is not `undefined` (i.e., an optional arg):
|
||||
|
||||
```javascript
|
||||
assert.optionalString(foo, 'foo');
|
||||
```
|
||||
|
||||
Lastly, you can opt-out of assertion checking altogether by setting the
|
||||
environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have
|
||||
lots of assertions, and don't want to pay `typeof ()` taxes to v8 in
|
||||
production. Be advised: The standard functions re-exported from `assert` are
|
||||
also disabled in assert-plus if NDEBUG is specified. Using them directly from
|
||||
the `assert` module avoids this behavior.
|
||||
|
||||
The complete list of APIs is:
|
||||
|
||||
* assert.array
|
||||
* assert.bool
|
||||
* assert.buffer
|
||||
* assert.func
|
||||
* assert.number
|
||||
* assert.finite
|
||||
* assert.object
|
||||
* assert.string
|
||||
* assert.stream
|
||||
* assert.date
|
||||
* assert.regexp
|
||||
* assert.uuid
|
||||
* assert.arrayOfArray
|
||||
* assert.arrayOfBool
|
||||
* assert.arrayOfBuffer
|
||||
* assert.arrayOfFunc
|
||||
* assert.arrayOfNumber
|
||||
* assert.arrayOfFinite
|
||||
* assert.arrayOfObject
|
||||
* assert.arrayOfString
|
||||
* assert.arrayOfStream
|
||||
* assert.arrayOfDate
|
||||
* assert.arrayOfRegexp
|
||||
* assert.arrayOfUuid
|
||||
* assert.optionalArray
|
||||
* assert.optionalBool
|
||||
* assert.optionalBuffer
|
||||
* assert.optionalFunc
|
||||
* assert.optionalNumber
|
||||
* assert.optionalFinite
|
||||
* assert.optionalObject
|
||||
* assert.optionalString
|
||||
* assert.optionalStream
|
||||
* assert.optionalDate
|
||||
* assert.optionalRegexp
|
||||
* assert.optionalUuid
|
||||
* assert.optionalArrayOfArray
|
||||
* assert.optionalArrayOfBool
|
||||
* assert.optionalArrayOfBuffer
|
||||
* assert.optionalArrayOfFunc
|
||||
* assert.optionalArrayOfNumber
|
||||
* assert.optionalArrayOfFinite
|
||||
* assert.optionalArrayOfObject
|
||||
* assert.optionalArrayOfString
|
||||
* assert.optionalArrayOfStream
|
||||
* assert.optionalArrayOfDate
|
||||
* assert.optionalArrayOfRegexp
|
||||
* assert.optionalArrayOfUuid
|
||||
* assert.AssertionError
|
||||
* assert.fail
|
||||
* assert.ok
|
||||
* assert.equal
|
||||
* assert.notEqual
|
||||
* assert.deepEqual
|
||||
* assert.notDeepEqual
|
||||
* assert.strictEqual
|
||||
* assert.notStrictEqual
|
||||
* assert.throws
|
||||
* assert.doesNotThrow
|
||||
* assert.ifError
|
||||
|
||||
# Installation
|
||||
|
||||
npm install assert-plus
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT)
|
||||
Copyright (c) 2012 Mark Cavage
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
## Bugs
|
||||
|
||||
See <https://github.com/mcavage/node-assert-plus/issues>.
|
||||
-211
@@ -1,211 +0,0 @@
|
||||
// Copyright (c) 2012, Mark Cavage. All rights reserved.
|
||||
// Copyright 2015 Joyent, Inc.
|
||||
|
||||
var assert = require('assert');
|
||||
var Stream = require('stream').Stream;
|
||||
var util = require('util');
|
||||
|
||||
|
||||
///--- Globals
|
||||
|
||||
/* JSSTYLED */
|
||||
var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
|
||||
|
||||
|
||||
///--- Internal
|
||||
|
||||
function _capitalize(str) {
|
||||
return (str.charAt(0).toUpperCase() + str.slice(1));
|
||||
}
|
||||
|
||||
function _toss(name, expected, oper, arg, actual) {
|
||||
throw new assert.AssertionError({
|
||||
message: util.format('%s (%s) is required', name, expected),
|
||||
actual: (actual === undefined) ? typeof (arg) : actual(arg),
|
||||
expected: expected,
|
||||
operator: oper || '===',
|
||||
stackStartFunction: _toss.caller
|
||||
});
|
||||
}
|
||||
|
||||
function _getClass(arg) {
|
||||
return (Object.prototype.toString.call(arg).slice(8, -1));
|
||||
}
|
||||
|
||||
function noop() {
|
||||
// Why even bother with asserts?
|
||||
}
|
||||
|
||||
|
||||
///--- Exports
|
||||
|
||||
var types = {
|
||||
bool: {
|
||||
check: function (arg) { return typeof (arg) === 'boolean'; }
|
||||
},
|
||||
func: {
|
||||
check: function (arg) { return typeof (arg) === 'function'; }
|
||||
},
|
||||
string: {
|
||||
check: function (arg) { return typeof (arg) === 'string'; }
|
||||
},
|
||||
object: {
|
||||
check: function (arg) {
|
||||
return typeof (arg) === 'object' && arg !== null;
|
||||
}
|
||||
},
|
||||
number: {
|
||||
check: function (arg) {
|
||||
return typeof (arg) === 'number' && !isNaN(arg);
|
||||
}
|
||||
},
|
||||
finite: {
|
||||
check: function (arg) {
|
||||
return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);
|
||||
}
|
||||
},
|
||||
buffer: {
|
||||
check: function (arg) { return Buffer.isBuffer(arg); },
|
||||
operator: 'Buffer.isBuffer'
|
||||
},
|
||||
array: {
|
||||
check: function (arg) { return Array.isArray(arg); },
|
||||
operator: 'Array.isArray'
|
||||
},
|
||||
stream: {
|
||||
check: function (arg) { return arg instanceof Stream; },
|
||||
operator: 'instanceof',
|
||||
actual: _getClass
|
||||
},
|
||||
date: {
|
||||
check: function (arg) { return arg instanceof Date; },
|
||||
operator: 'instanceof',
|
||||
actual: _getClass
|
||||
},
|
||||
regexp: {
|
||||
check: function (arg) { return arg instanceof RegExp; },
|
||||
operator: 'instanceof',
|
||||
actual: _getClass
|
||||
},
|
||||
uuid: {
|
||||
check: function (arg) {
|
||||
return typeof (arg) === 'string' && UUID_REGEXP.test(arg);
|
||||
},
|
||||
operator: 'isUUID'
|
||||
}
|
||||
};
|
||||
|
||||
function _setExports(ndebug) {
|
||||
var keys = Object.keys(types);
|
||||
var out;
|
||||
|
||||
/* re-export standard assert */
|
||||
if (process.env.NODE_NDEBUG) {
|
||||
out = noop;
|
||||
} else {
|
||||
out = function (arg, msg) {
|
||||
if (!arg) {
|
||||
_toss(msg, 'true', arg);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* standard checks */
|
||||
keys.forEach(function (k) {
|
||||
if (ndebug) {
|
||||
out[k] = noop;
|
||||
return;
|
||||
}
|
||||
var type = types[k];
|
||||
out[k] = function (arg, msg) {
|
||||
if (!type.check(arg)) {
|
||||
_toss(msg, k, type.operator, arg, type.actual);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
/* optional checks */
|
||||
keys.forEach(function (k) {
|
||||
var name = 'optional' + _capitalize(k);
|
||||
if (ndebug) {
|
||||
out[name] = noop;
|
||||
return;
|
||||
}
|
||||
var type = types[k];
|
||||
out[name] = function (arg, msg) {
|
||||
if (arg === undefined || arg === null) {
|
||||
return;
|
||||
}
|
||||
if (!type.check(arg)) {
|
||||
_toss(msg, k, type.operator, arg, type.actual);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
/* arrayOf checks */
|
||||
keys.forEach(function (k) {
|
||||
var name = 'arrayOf' + _capitalize(k);
|
||||
if (ndebug) {
|
||||
out[name] = noop;
|
||||
return;
|
||||
}
|
||||
var type = types[k];
|
||||
var expected = '[' + k + ']';
|
||||
out[name] = function (arg, msg) {
|
||||
if (!Array.isArray(arg)) {
|
||||
_toss(msg, expected, type.operator, arg, type.actual);
|
||||
}
|
||||
var i;
|
||||
for (i = 0; i < arg.length; i++) {
|
||||
if (!type.check(arg[i])) {
|
||||
_toss(msg, expected, type.operator, arg, type.actual);
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
/* optionalArrayOf checks */
|
||||
keys.forEach(function (k) {
|
||||
var name = 'optionalArrayOf' + _capitalize(k);
|
||||
if (ndebug) {
|
||||
out[name] = noop;
|
||||
return;
|
||||
}
|
||||
var type = types[k];
|
||||
var expected = '[' + k + ']';
|
||||
out[name] = function (arg, msg) {
|
||||
if (arg === undefined || arg === null) {
|
||||
return;
|
||||
}
|
||||
if (!Array.isArray(arg)) {
|
||||
_toss(msg, expected, type.operator, arg, type.actual);
|
||||
}
|
||||
var i;
|
||||
for (i = 0; i < arg.length; i++) {
|
||||
if (!type.check(arg[i])) {
|
||||
_toss(msg, expected, type.operator, arg, type.actual);
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
/* re-export built-in assertions */
|
||||
Object.keys(assert).forEach(function (k) {
|
||||
if (k === 'AssertionError') {
|
||||
out[k] = assert[k];
|
||||
return;
|
||||
}
|
||||
if (ndebug) {
|
||||
out[k] = noop;
|
||||
return;
|
||||
}
|
||||
out[k] = assert[k];
|
||||
});
|
||||
|
||||
/* export ourselves (for unit tests _only_) */
|
||||
out._setExports = _setExports;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
module.exports = _setExports(process.env.NODE_NDEBUG);
|
||||
Generated
Vendored
-86
@@ -1,86 +0,0 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"assert-plus@1.0.0",
|
||||
"/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah"
|
||||
]
|
||||
],
|
||||
"_development": true,
|
||||
"_from": "assert-plus@1.0.0",
|
||||
"_id": "assert-plus@1.0.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
|
||||
"_location": "/sshpk/assert-plus",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "assert-plus@1.0.0",
|
||||
"name": "assert-plus",
|
||||
"escapedName": "assert-plus",
|
||||
"rawSpec": "1.0.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "1.0.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/sshpk"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"_spec": "1.0.0",
|
||||
"_where": "/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah",
|
||||
"author": {
|
||||
"name": "Mark Cavage",
|
||||
"email": "mcavage@gmail.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/mcavage/node-assert-plus/issues"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Dave Eddy",
|
||||
"email": "dave@daveeddy.com"
|
||||
},
|
||||
{
|
||||
"name": "Fred Kuo",
|
||||
"email": "fred.kuo@joyent.com"
|
||||
},
|
||||
{
|
||||
"name": "Lars-Magnus Skog",
|
||||
"email": "ralphtheninja@riseup.net"
|
||||
},
|
||||
{
|
||||
"name": "Mark Cavage",
|
||||
"email": "mcavage@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Patrick Mooney",
|
||||
"email": "pmooney@pfmooney.com"
|
||||
},
|
||||
{
|
||||
"name": "Rob Gulewich",
|
||||
"email": "robert.gulewich@joyent.com"
|
||||
}
|
||||
],
|
||||
"dependencies": {},
|
||||
"description": "Extra assertions on top of node's assert module",
|
||||
"devDependencies": {
|
||||
"faucet": "0.0.1",
|
||||
"tape": "4.2.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
},
|
||||
"homepage": "https://github.com/mcavage/node-assert-plus#readme",
|
||||
"license": "MIT",
|
||||
"main": "./assert.js",
|
||||
"name": "assert-plus",
|
||||
"optionalDependencies": {},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/mcavage/node-assert-plus.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tape tests/*.js | ./node_modules/.bin/faucet"
|
||||
},
|
||||
"version": "1.0.0"
|
||||
}
|
||||
+20
-28
@@ -1,33 +1,27 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"sshpk@1.14.1",
|
||||
"/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah"
|
||||
]
|
||||
],
|
||||
"_development": true,
|
||||
"_from": "sshpk@1.14.1",
|
||||
"_id": "sshpk@1.14.1",
|
||||
"_from": "sshpk@^1.7.0",
|
||||
"_id": "sshpk@1.15.2",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
|
||||
"_integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
|
||||
"_location": "/sshpk",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "sshpk@1.14.1",
|
||||
"raw": "sshpk@^1.7.0",
|
||||
"name": "sshpk",
|
||||
"escapedName": "sshpk",
|
||||
"rawSpec": "1.14.1",
|
||||
"rawSpec": "^1.7.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "1.14.1"
|
||||
"fetchSpec": "^1.7.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/http-signature"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
|
||||
"_spec": "1.14.1",
|
||||
"_where": "/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah",
|
||||
"_resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
|
||||
"_shasum": "c946d6bd9b1a39d0e8635763f5242d6ed6dcb629",
|
||||
"_spec": "sshpk@^1.7.0",
|
||||
"_where": "/home/kevin/Documents/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/http-signature",
|
||||
"author": {
|
||||
"name": "Joyent, Inc"
|
||||
},
|
||||
@@ -39,6 +33,7 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/arekinath/node-sshpk/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Dave Eddy",
|
||||
@@ -61,8 +56,10 @@
|
||||
"ecc-jsbn": "~0.1.1",
|
||||
"getpass": "^0.1.1",
|
||||
"jsbn": "~0.1.0",
|
||||
"safer-buffer": "^2.0.2",
|
||||
"tweetnacl": "~0.14.0"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "A library for finding and using SSH public keys",
|
||||
"devDependencies": {
|
||||
"benchmark": "^1.0.0",
|
||||
@@ -82,23 +79,18 @@
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"man": [
|
||||
"/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/sshpk/man/man1/sshpk-conv.1",
|
||||
"/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/sshpk/man/man1/sshpk-sign.1",
|
||||
"/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/sshpk/man/man1/sshpk-verify.1"
|
||||
"/home/kevin/Documents/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/sshpk/man/man1/sshpk-conv.1",
|
||||
"/home/kevin/Documents/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/sshpk/man/man1/sshpk-sign.1",
|
||||
"/home/kevin/Documents/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/sshpk/man/man1/sshpk-verify.1"
|
||||
],
|
||||
"name": "sshpk",
|
||||
"optionalDependencies": {
|
||||
"bcrypt-pbkdf": "^1.0.0",
|
||||
"ecc-jsbn": "~0.1.1",
|
||||
"jsbn": "~0.1.0",
|
||||
"tweetnacl": "~0.14.0"
|
||||
},
|
||||
"optionalDependencies": {},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/arekinath/node-sshpk.git"
|
||||
"url": "git+https://github.com/joyent/node-sshpk.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tape test/*.js"
|
||||
},
|
||||
"version": "1.14.1"
|
||||
"version": "1.15.2"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user