Comparing version 1.1.0 to 1.2.0
35
index.js
var nacl = require("tweetnacl"); | ||
var bs58 = require("bs58"); | ||
var fromSeed = function(seed){ | ||
@@ -23,3 +24,3 @@ | ||
var signed = nacl.sign.open(signedMessage, decodedKey); | ||
return signed !== null; | ||
return signed !== null ? new Buffer(signed).toString("utf8") : false; | ||
}; | ||
@@ -31,6 +32,31 @@ | ||
var fullSignKey = Buffer.concat([signKey, verifyKey]); | ||
var arrayMessage = Uint8Array.from(message); | ||
var arrayMessage = Buffer.from(message, "utf8"); | ||
return nacl.sign(arrayMessage, fullSignKey); | ||
}; | ||
function getArrayFromKey(key) { | ||
return Uint8Array.from(bs58.decode(key)); | ||
} | ||
var getNonce = function () { | ||
return nacl.randomBytes(nacl.box.nonceLength); | ||
}; | ||
var getBoxKeyPairFromSignKey = function (signKey) { | ||
return nacl.box.keyPair.fromSecretKey(getArrayFromKey(signKey)); | ||
}; | ||
var getSharedSecret = function (theirVerifyKey, mySigningKey) { | ||
return nacl.box.before(theirVerifyKey, mySigningKey) | ||
}; | ||
var decryptMessage = function (encryptedMessage, nonce, sharedSecret) { | ||
var verifiedEncrypTion = nacl.box.open.after(encryptedMessage, nonce, sharedSecret); | ||
return verifiedEncrypTion !== null ? new Buffer(verifiedEncrypTion).toString("utf8") : false; | ||
}; | ||
var encryptMessage = function (message, nonce, sharedSecret) { | ||
return nacl.box.after(Buffer.from(message, "utf8"), nonce, sharedSecret); | ||
}; | ||
module.exports = { | ||
@@ -44,2 +70,7 @@ gen: function(){ | ||
verifySignedMessage: verifySignedMessage, | ||
getKeyPairFromSignKey: getBoxKeyPairFromSignKey, | ||
getSharedSecret: getSharedSecret, | ||
decryptMessage: decryptMessage, | ||
encryptMessage: encryptMessage, | ||
getNonce: getNonce, | ||
}; |
{ | ||
"name": "sovrin-did", | ||
"version": "1.1.0", | ||
"version": "1.2.0", | ||
"description": "node.js module to generate DID and Ed25519 keys to use with Sovrin", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
156
README.md
@@ -7,2 +7,3 @@ # node-sovrin-did | ||
## Install | ||
@@ -14,2 +15,3 @@ | ||
## Example | ||
@@ -33,5 +35,8 @@ | ||
## API | ||
### sovrinDID.gen() | ||
### gen() | ||
Generates a new did, verification key, signing key, and also gives you the seed used to generate them. | ||
@@ -51,4 +56,5 @@ | ||
### sovrinDID.fromSeed(seed) | ||
### fromSeed(seed) | ||
Same as `.gen()` except you supply the seed. The seed should be a 32-byte Uint8Array (i.e. Buffer). | ||
@@ -67,3 +73,5 @@ | ||
### sovrinDID.signMessage(message, signKey, verifyKey) | ||
### signMessage(message, signKey, verifyKey) | ||
Signs a message with the given signKey and verifyKey. | ||
@@ -84,12 +92,14 @@ | ||
var signedMessage = sovrinDID.signMessage(message, signKey, verifyKey);; | ||
var signedMessage = sovrinDID.signMessage(message, signKey, verifyKey); | ||
``` | ||
``` | ||
### sovrinDID.verifySignedMessage(signedMessage, verifyKey) | ||
### verifySignedMessage(signedMessage, verifyKey) | ||
Verifies that the given message has been signed by the possessor of the given verifyKey. | ||
* The signedMessage should be what is returned from the `signMessage(message, signKey, verifyKey)` method | ||
* The signedMessage should be what is returned from `signMessage(message, signKey, verifyKey)` | ||
* The verifyKey should be the verifyKey given from the `gen()` or `fromSeed(seed)` methods | ||
Returns `true` if the message was signed by the owner of the verifyKey `false` otherwise. | ||
Returns the original message if the message was signed by the owner of the verifyKey `false` otherwise. | ||
@@ -110,3 +120,3 @@ Example: | ||
console.log(sovrinDID.verifySignedMessage(signedMessage, verifyKey)); | ||
console.log(sovrinDID.verifySignedMessage(signedMessage, verifyKey2)) | ||
console.log(sovrinDID.verifySignedMessage(signedMessage, verifyKey2)); | ||
``` | ||
@@ -116,6 +126,132 @@ | ||
``` | ||
true | ||
Hello World!! | ||
false | ||
``` | ||
### getKeyPairFromSignKey(signKey) | ||
Returns a key pair that is valid to use for encrypting. | ||
* The signKey should be the signKey given from the object given from `gen()` or `fromSeed()` | ||
Example: | ||
```js | ||
var sovrin = sovrinDID.gen(); | ||
var signKey = sovrin.secret.signKey; | ||
var keyPair = sovrinDID.getKeyPairFromSignKey(signKey); | ||
console.log(keyPair); | ||
``` | ||
Output: | ||
```js | ||
{ | ||
publicKey: ... // Uint8Array with 32-byte public key | ||
secretKey: ... // Uint8Array with 32-byte secret key | ||
} | ||
``` | ||
### getNonce() | ||
Returns a random nonce as a Uint8Array that can be used for encrypting. | ||
Example: | ||
```js | ||
var nonce = sovrinDID.getNonce(); | ||
``` | ||
### getSharedSecret(theirVerifyKey, mySigningKey) | ||
Computes a sharedSecret to be used for encryption. | ||
* theirVerifyKey should be the publicKey given from the `getKeyPairFromSignKey(signKey)` method | ||
* mySigningKey should be the secretKey given from the `getKeyPairFromSignKey(signKey)` method | ||
Example: | ||
```js | ||
var sovrin1 = sovrinDID.gen(); | ||
var sovrin2 = sovrinDID.gen(); | ||
var signKey1 = sovrin1.secret.signKey; | ||
var signKey2 = sovrin2.secret.signKey; | ||
var keyPair1 = sovrinDID.getKeyPairFromSignKey(signKey1); | ||
var keyPair2 = sovrinDID.getKeyPairFromSignKey(signKey2); | ||
// These two secrets are the same | ||
var sharedSecret1To2 = sovrinDID.getSharedSecret(keyPair2.publicKey, keyPair1.secretKey); | ||
var sharedSecret2To1 = sovrinDID.getSharedSecret(keyPair1.publicKey, keyPair2.secretKey); | ||
``` | ||
### encryptMessage(message, nonce, sharedSecret) | ||
Encrypts a the given message using a precomputed sharedSecret. | ||
* message should be given as a string | ||
* nonce should be a nonce from the `getNonce()` method | ||
* Note: The nonce used for encrypting and decrypting need to be the same | ||
* sharedSecret should be computed using the `getSharedSecret(theirVerifyKey, mySigningKey)` method | ||
Example: | ||
```js | ||
var sovrin1 = sovrinDID.gen(); | ||
var sovrin2 = sovrinDID.gen(); | ||
var signKey1 = sovrin1.secret.signKey; | ||
var signKey2 = sovrin2.secret.signKey; | ||
var keyPair1 = sovrinDID.getKeyPairFromSignKey(signKey1); | ||
var keyPair2 = sovrinDID.getKeyPairFromSignKey(signKey2); | ||
var sharedSecret1To2 = sovrinDID.getSharedSecret(keyPair2.publicKey, keyPair1.secretKey); | ||
var message = "Hello World!!"; | ||
var nonce = sovrinDID.getNonce(); | ||
var encryptedMessage = sovrinDID.encryptMessage(message, nonce, sharedSecret1To2); | ||
``` | ||
### decryptMessage(encryptedMessage, nonce, sharedSecret) | ||
Verifies and decrypts a previously encrypted message. | ||
* encryptedMessage should be what is returned from the `encryptMessage(message, nonce, sharedSecret)` method | ||
* nonce should be a nonce given from the `getNonce()` method | ||
* Note: The nonce used for encrypting and decrypting need to be the same | ||
* sharedSecret should be computed using the `getSharedSecret(theirVerifyKey, mySigningKey)` method | ||
Example: | ||
```js | ||
var signKey1 = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
var signKey2 = "516mChDX1BRjwHJc2w838W8cXxy8a6Eb35HKXjPR2fD8"; | ||
var signKey3 = "7H25Jfb2ND51hhaomL5FPhhqQvBGujd1jJeSjZZ8HQzR"; | ||
var keyPair1 = sovrinDID.getKeyPairFromSignKey(signKey1); | ||
var keyPair2 = sovrinDID.getKeyPairFromSignKey(signKey2); | ||
var keyPair3 = sovrinDID.getKeyPairFromSignKey(signKey3); | ||
var sharedSecret1To2 = sovrinDID.getSharedSecret(keyPair2.publicKey, keyPair1.secretKey); | ||
var sharedSecret2To1 = sovrinDID.getSharedSecret(keyPair1.publicKey, keyPair2.secretKey); | ||
var sharedSecret3To1 = sovrinDID.getSharedSecret(keyPair3.publicKey, keyPair1.secretKey); | ||
var message = "Hello World!!"; | ||
var nonce = sovrinDID.getNonce(); | ||
var encryptedMessage = sovrinDID.encryptMessage(message, nonce, sharedSecret1To2); | ||
var decryptedMessage = sovrinDID.decryptMessage(encryptedMessage, nonce, sharedSecret2To1); | ||
var attemptedDecryption = sovrinDID.decryptMessage(encryptedMessage, nonce, sharedSecret3To1); | ||
console.log(decryptedMessage); | ||
console.log(attemptedDecryption); | ||
``` | ||
Output: | ||
``` | ||
Hello World!! | ||
false | ||
``` | ||
## License | ||
MIT |
83
tests.js
var test = require("tape"); | ||
var nacl = require("tweetnacl"); | ||
var sovrinDID = require("./"); | ||
@@ -73,3 +74,3 @@ | ||
test("sovrinDID.signMessage(message, signKey, verifyKey)", function (t) { | ||
test("sovrinDID.signMessage(message, signKey, verifyKey)", function(t) { | ||
@@ -85,3 +86,3 @@ var signKey = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
test("sovrinDID.verifySignedMessage(signedMessage, verifyKey)", function (t) { | ||
test("sovrinDID.verifySignedMessage(signedMessage, verifyKey)", function(t) { | ||
@@ -98,6 +99,6 @@ var signKey = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
t.equal(sovrinDID.verifySignedMessage(signedMessage, verifyKey), true); | ||
t.equal(sovrinDID.verifySignedMessage(signedMessage, verifyKey), message); | ||
t.equal(sovrinDID.verifySignedMessage(signedMessage, verifyKey2), false); | ||
t.equal(sovrinDID.verifySignedMessage(signedMessage2, verifyKey2), true); | ||
t.equal(sovrinDID.verifySignedMessage(signedMessage2, verifyKey2), message2); | ||
t.equal(sovrinDID.verifySignedMessage(signedMessage2, verifyKey), false); | ||
@@ -107,1 +108,75 @@ | ||
}); | ||
test("sovrinDID.getKeyPairFromSignKey(signKey)", function(t) { | ||
var signKey = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
var keyPair = sovrinDID.getKeyPairFromSignKey(signKey); | ||
t.equal(keyPair.publicKey.length, 32); | ||
t.equal(keyPair.secretKey.length, 32); | ||
t.end(); | ||
}); | ||
test("sovrinDID.getSharedSecret(theirVerifyKey, mySigningKey", function(t) { | ||
var signKey1 = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
var signKey2 = "516mChDX1BRjwHJc2w838W8cXxy8a6Eb35HKXjPR2fD8"; | ||
var signKey3 = "7H25Jfb2ND51hhaomL5FPhhqQvBGujd1jJeSjZZ8HQzR"; | ||
var keyPair1 = sovrinDID.getKeyPairFromSignKey(signKey1); | ||
var keyPair2 = sovrinDID.getKeyPairFromSignKey(signKey2); | ||
var keyPair3 = sovrinDID.getKeyPairFromSignKey(signKey3); | ||
var sharedSecret1To2 = sovrinDID.getSharedSecret(keyPair2.publicKey, keyPair1.secretKey); | ||
var sharedSecret2To1 = sovrinDID.getSharedSecret(keyPair1.publicKey, keyPair2.secretKey); | ||
var sharedSecret3To1 = sovrinDID.getSharedSecret(keyPair3.publicKey, keyPair1.secretKey); | ||
t.equal(nacl.verify(sharedSecret1To2, sharedSecret2To1), true); | ||
t.equal(nacl.verify(sharedSecret3To1, sharedSecret2To1), false); | ||
t.end(); | ||
}); | ||
test("sovrinDID.encryptMessage(message, nonce, sharedSecret)", function (t) { | ||
var signKey1 = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
var signKey2 = "516mChDX1BRjwHJc2w838W8cXxy8a6Eb35HKXjPR2fD8"; | ||
var keyPair1 = sovrinDID.getKeyPairFromSignKey(signKey1); | ||
var keyPair2 = sovrinDID.getKeyPairFromSignKey(signKey2); | ||
var sharedSecret1To2 = sovrinDID.getSharedSecret(keyPair2.publicKey, keyPair1.secretKey); | ||
var message = "Hello World!!"; | ||
var nonce = sovrinDID.getNonce(); | ||
var encryptedMessage = sovrinDID.encryptMessage(message, nonce, sharedSecret1To2); | ||
t.notEqual(message, encryptedMessage); | ||
t.end(); | ||
}); | ||
test("sovrinDID.decryptMessage(theirVerifyKey, mySigningKey", function(t) { | ||
var signKey1 = "4bMnc36WuLYJqsWTZtiazJJrtkvPwgyWnirn7gKk7ium"; | ||
var signKey2 = "516mChDX1BRjwHJc2w838W8cXxy8a6Eb35HKXjPR2fD8"; | ||
var signKey3 = "7H25Jfb2ND51hhaomL5FPhhqQvBGujd1jJeSjZZ8HQzR"; | ||
var keyPair1 = sovrinDID.getKeyPairFromSignKey(signKey1); | ||
var keyPair2 = sovrinDID.getKeyPairFromSignKey(signKey2); | ||
var keyPair3 = sovrinDID.getKeyPairFromSignKey(signKey3); | ||
var sharedSecret1To2 = sovrinDID.getSharedSecret(keyPair2.publicKey, keyPair1.secretKey); | ||
var sharedSecret2To1 = sovrinDID.getSharedSecret(keyPair1.publicKey, keyPair2.secretKey); | ||
var sharedSecret3To1 = sovrinDID.getSharedSecret(keyPair3.publicKey, keyPair1.secretKey); | ||
var message = "Hello World!!"; | ||
var nonce = sovrinDID.getNonce(); | ||
var encryptedMessage = sovrinDID.encryptMessage(message, nonce, sharedSecret1To2); | ||
var decryptedMessage = sovrinDID.decryptMessage(encryptedMessage, nonce, sharedSecret2To1); | ||
var attemptedDecryption = sovrinDID.decryptMessage(encryptedMessage, nonce, sharedSecret3To1); | ||
t.equal(decryptedMessage, message); | ||
t.notEqual(message, attemptedDecryption); | ||
t.equal(attemptedDecryption, false); | ||
t.end(); | ||
}); |
17532
186
250