classicfm-discord-bot/node_modules/sodium/lib/sign.js
2024-05-09 14:45:10 -04:00

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;