153 lines
4.1 KiB
JavaScript
Executable file
153 lines
4.1 KiB
JavaScript
Executable file
/**
|
|
* Created by bmf on 11/2/13.
|
|
*
|
|
* Documentation of crypto http://nacl.cr.yp.to/box.html
|
|
*/
|
|
/* jslint node: true */
|
|
'use strict';
|
|
|
|
var binding = require('../build/Release/sodium');
|
|
var assert = require('assert');
|
|
var SignKey = require('./keys/sign-key');
|
|
var toBuffer = require('./toBuffer');
|
|
|
|
|
|
/**
|
|
* Public-key authenticated message signatures: Sign
|
|
*
|
|
* @param {String|Buffer|Array} secretKey sender's private key.
|
|
* @param {String|Buffer|Array} publicKey recipient's private key.
|
|
*
|
|
* @see Keys
|
|
* @constructor
|
|
*/
|
|
function Sign(key) {
|
|
var self = this;
|
|
|
|
/** default encoding to use in all string operations */
|
|
self.defaultEncoding = undefined;
|
|
|
|
if( key instanceof SignKey) {
|
|
self.iKey = key;
|
|
}
|
|
else {
|
|
/** Set of keys used to encrypt and decrypt messages */
|
|
self.iKey = new SignKey();
|
|
}
|
|
|
|
/** Size of the generated message signature */
|
|
self.bytes = function() {
|
|
return binding.crypto_sign_BYTES;
|
|
};
|
|
|
|
/** String name of the default crypto primitive used in sign operations */
|
|
self.primitive = function() {
|
|
return binding.crypto_sign_PRIMITIVE;
|
|
};
|
|
|
|
/**
|
|
* Get the keypair object
|
|
* @returns {SignKey|*}
|
|
*/
|
|
self.key = function() {
|
|
return self.iKey;
|
|
};
|
|
|
|
/**
|
|
* @return {Number} The size of the message signature
|
|
*/
|
|
self.size = function() {
|
|
return binding.crypto_sign_BYTES;
|
|
};
|
|
|
|
/**
|
|
* Set the default encoding to use in all string conversions
|
|
* @param {String} encoding encoding to use
|
|
*/
|
|
self.setEncoding = function(encoding) {
|
|
assert(!!encoding.match(/^(?:utf8|ascii|binary|hex|utf16le|ucs2|base64)$/), 'Encoding ' + encoding + ' is currently unsupported.');
|
|
self.defaultEncoding = encoding;
|
|
};
|
|
|
|
/**
|
|
* Get the current default encoding
|
|
* @returns {undefined|String}
|
|
*/
|
|
self.getEncoding = function() {
|
|
return self.defaultEncoding;
|
|
};
|
|
|
|
/**
|
|
* Digitally sign message
|
|
*
|
|
* @param {Buffer|String|Array} message message to sign
|
|
* @param {String} [encoding] encoding of message string
|
|
*
|
|
* @returns {Object} cipher box
|
|
*/
|
|
self.sign = function (message, encoding) {
|
|
encoding = String(encoding) || self.defaultEncoding || 'utf8';
|
|
|
|
var buf = toBuffer(message, encoding);
|
|
|
|
var signature = binding.crypto_sign(buf, self.iKey.sk().get());
|
|
if( !signature ) {
|
|
return undefined;
|
|
}
|
|
|
|
return {
|
|
sign: signature,
|
|
publicKey: self.iKey.pk().get()
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Digitally sign message, using detached signature
|
|
*
|
|
* @param {Buffer|String|Array} message message to sign
|
|
* @param {String} [encoding] encoding of message string
|
|
*
|
|
* @returns {Object} cipher box
|
|
*/
|
|
self.signDetached = function (message, encoding) {
|
|
encoding = String(encoding) || self.defaultEncoding || 'utf8';
|
|
|
|
var buf = toBuffer(message, encoding);
|
|
|
|
var signature = binding.crypto_sign_detached(buf, self.iKey.sk().get());
|
|
if( !signature ) {
|
|
return undefined;
|
|
}
|
|
|
|
return {
|
|
sign: signature,
|
|
publicKey: self.iKey.pk().get()
|
|
};
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Verify digital signature
|
|
*
|
|
* @param {Buffer|String|Array} cipherText the signed message
|
|
*/
|
|
Sign.verify = function (signature) {
|
|
assert(typeof signature == 'object' && signature.hasOwnProperty('sign') && signature.hasOwnProperty('publicKey'));
|
|
return binding.crypto_sign_open(signature.sign, signature.publicKey);
|
|
};
|
|
|
|
/**
|
|
* Verify digital signature (detached mode)
|
|
*
|
|
* @param {Buffer|String|Array} signature the signature
|
|
* @param {Buffer|String|Array} message the message
|
|
*
|
|
* returns true if verified successfully, false otherwise.
|
|
*/
|
|
Sign.verifyDetached = function (signature, message) {
|
|
assert(typeof signature == 'object' && signature.hasOwnProperty('sign') && signature.hasOwnProperty('publicKey'));
|
|
return binding.crypto_sign_verify_detached(signature.sign, message, signature.publicKey);
|
|
};
|
|
|
|
module.exports = Sign;
|