2019-07-10 04:01:15 +00:00
/ *
* @ project : TERA
* @ version : Development ( beta )
* @ copyright : Yuriy Ivanov 2017 - 2019 [ progr76 @ gmail . com ]
* @ license : MIT ( not for evil )
* Web : http : //terafoundation.org
* GitHub : https : //github.com/terafoundation/wallet
* Twitter : https : //twitter.com/terafoundation
* Telegram : https : //web.telegram.org/#/im?p=@terafoundation
* /
"use strict" ;
var der = require ( "./der" ) , toString = Object . prototype . toString , exports = { } , assert = exports ;
2019-07-10 09:53:52 +00:00
exports . isArray = function ( e , s ) {
if ( ! Array . isArray ( e ) )
2019-07-10 04:01:15 +00:00
throw TypeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isBoolean = function ( e , s ) {
if ( "[object Boolean]" !== toString . call ( e ) )
2019-07-10 04:01:15 +00:00
throw TypeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isBuffer = function ( e , s ) {
if ( ! Buffer . isBuffer ( e ) )
2019-07-10 04:01:15 +00:00
throw TypeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isFunction = function ( e , s ) {
if ( "[object Function]" !== toString . call ( e ) )
2019-07-10 04:01:15 +00:00
throw TypeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isNumber = function ( e , s ) {
if ( "[object Number]" !== toString . call ( e ) )
2019-07-10 04:01:15 +00:00
throw TypeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isObject = function ( e , s ) {
if ( "[object Object]" !== toString . call ( e ) )
2019-07-10 04:01:15 +00:00
throw TypeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isBufferLength = function ( e , s , r ) {
if ( e . length !== s )
2019-07-10 04:01:15 +00:00
throw RangeError ( r ) ;
2019-07-10 09:53:52 +00:00
} , exports . isBufferLength2 = function ( e , s , r , _ ) {
if ( e . length !== s && e . length !== r )
2019-07-10 04:01:15 +00:00
throw RangeError ( _ ) ;
2019-07-10 09:53:52 +00:00
} , exports . isLengthGTZero = function ( e , s ) {
if ( 0 === e . length )
2019-07-10 04:01:15 +00:00
throw RangeError ( s ) ;
2019-07-10 09:53:52 +00:00
} , exports . isNumberInInterval = function ( e , s , r , _ ) {
if ( e <= s || r <= e )
2019-07-10 04:01:15 +00:00
throw RangeError ( _ ) ;
} ;
2019-07-10 09:53:52 +00:00
var messages = {
COMPRESSED _TYPE _INVALID : "compressed should be a boolean" , EC _PRIVATE _KEY _TYPE _INVALID : "private key should be a Buffer" ,
EC _PRIVATE _KEY _LENGTH _INVALID : "private key length is invalid" , EC _PRIVATE _KEY _RANGE _INVALID : "private key range is invalid" ,
EC _PRIVATE _KEY _TWEAK _ADD _FAIL : "tweak out of range or resulting private key is invalid" , EC _PRIVATE _KEY _TWEAK _MUL _FAIL : "tweak out of range" ,
EC _PRIVATE _KEY _EXPORT _DER _FAIL : "couldn't export to DER format" , EC _PRIVATE _KEY _IMPORT _DER _FAIL : "couldn't import from DER format" ,
EC _PUBLIC _KEYS _TYPE _INVALID : "public keys should be an Array" , EC _PUBLIC _KEYS _LENGTH _INVALID : "public keys Array should have at least 1 element" ,
EC _PUBLIC _KEY _TYPE _INVALID : "public key should be a Buffer" , EC _PUBLIC _KEY _LENGTH _INVALID : "public key length is invalid" , EC _PUBLIC _KEY _PARSE _FAIL : "the public key could not be parsed or is invalid" ,
EC _PUBLIC _KEY _CREATE _FAIL : "private was invalid, try again" , EC _PUBLIC _KEY _TWEAK _ADD _FAIL : "tweak out of range or resulting public key is invalid" ,
EC _PUBLIC _KEY _TWEAK _MUL _FAIL : "tweak out of range" , EC _PUBLIC _KEY _COMBINE _FAIL : "the sum of the public keys is not valid" , ECDH _FAIL : "scalar was invalid (zero or overflow)" ,
ECDSA _SIGNATURE _TYPE _INVALID : "signature should be a Buffer" , ECDSA _SIGNATURE _LENGTH _INVALID : "signature length is invalid" ,
ECDSA _SIGNATURE _PARSE _FAIL : "couldn't parse signature" , ECDSA _SIGNATURE _PARSE _DER _FAIL : "couldn't parse DER signature" , ECDSA _SIGNATURE _SERIALIZE _DER _FAIL : "couldn't serialize signature to DER format" ,
ECDSA _SIGN _FAIL : "nonce generation function failed or private key is invalid" , ECDSA _RECOVER _FAIL : "couldn't recover public key from signature" ,
MSG32 _TYPE _INVALID : "message should be a Buffer" , MSG32 _LENGTH _INVALID : "message length is invalid" , OPTIONS _TYPE _INVALID : "options should be an Object" ,
OPTIONS _DATA _TYPE _INVALID : "options.data should be a Buffer" , OPTIONS _DATA _LENGTH _INVALID : "options.data length is invalid" ,
OPTIONS _NONCEFN _TYPE _INVALID : "options.noncefn should be a Function" , RECOVERY _ID _TYPE _INVALID : "recovery should be a Number" ,
RECOVERY _ID _VALUE _INVALID : "recovery should have value between -1 and 4" , TWEAK _TYPE _INVALID : "tweak should be a Buffer" , TWEAK _LENGTH _INVALID : "tweak length is invalid"
} ;
2019-07-10 04:01:15 +00:00
2019-07-10 09:53:52 +00:00
function initCompressedValue ( e , s ) {
2019-07-10 04:01:15 +00:00
return void 0 === e ? s : ( assert . isBoolean ( e , messages . COMPRESSED _TYPE _INVALID ) , e ) ;
} ;
2019-07-10 09:53:52 +00:00
module . exports = function ( E ) {
return {
privateKeyVerify : function ( e ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , 32 === e . length && E . privateKeyVerify ( e ) ;
2019-07-10 09:53:52 +00:00
} , privateKeyExport : function ( e , s ) {
2019-07-10 04:01:15 +00:00
assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
s = initCompressedValue ( s , ! 0 ) ;
2019-07-10 04:01:15 +00:00
var r = E . privateKeyExport ( e , s ) ;
return der . privateKeyExport ( e , r , s ) ;
2019-07-10 09:53:52 +00:00
} , privateKeyImport : function ( e ) {
if ( assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , ( e = der . privateKeyImport ( e ) ) && 32 === e . length && E . privateKeyVerify ( e ) )
2019-07-10 04:01:15 +00:00
return e ;
throw new Error ( messages . EC _PRIVATE _KEY _IMPORT _DER _FAIL ) ;
2019-07-10 09:53:52 +00:00
} , privateKeyNegate : function ( e ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
E . privateKeyNegate ( e ) ;
} , privateKeyModInverse : function ( e ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
E . privateKeyModInverse ( e ) ;
} , privateKeyTweakAdd : function ( e , s ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBuffer ( s , messages . TWEAK _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . TWEAK _LENGTH _INVALID ) , E . privateKeyTweakAdd ( e ,
s ) ;
} , privateKeyTweakMul : function ( e , s ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBuffer ( s , messages . TWEAK _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . TWEAK _LENGTH _INVALID ) , E . privateKeyTweakMul ( e ,
s ) ;
} , publicKeyCreate : function ( e , s ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
s = initCompressedValue ( s , ! 0 ) , E . publicKeyCreate ( e , s ) ;
} , publicKeyConvert : function ( e , s ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( e , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
s = initCompressedValue ( s , ! 0 ) , E . publicKeyConvert ( e , s ) ;
} , publicKeyVerify : function ( e ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , E . publicKeyVerify ( e ) ;
2019-07-10 09:53:52 +00:00
} , publicKeyTweakAdd : function ( e , s , r ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( e , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBuffer ( s , messages . TWEAK _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . TWEAK _LENGTH _INVALID ) , r = initCompressedValue ( r ,
! 0 ) , E . publicKeyTweakAdd ( e , s , r ) ;
} , publicKeyTweakMul : function ( e , s , r ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( e , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBuffer ( s , messages . TWEAK _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . TWEAK _LENGTH _INVALID ) , r = initCompressedValue ( r ,
! 0 ) , E . publicKeyTweakMul ( e , s , r ) ;
} , publicKeyCombine : function ( e , s ) {
2019-07-10 04:01:15 +00:00
assert . isArray ( e , messages . EC _PUBLIC _KEYS _TYPE _INVALID ) , assert . isLengthGTZero ( e , messages . EC _PUBLIC _KEYS _LENGTH _INVALID ) ;
2019-07-10 09:53:52 +00:00
for ( var r = 0 ; r < e . length ; ++ r )
2019-07-10 04:01:15 +00:00
assert . isBuffer ( e [ r ] , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( e [ r ] , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) ;
return s = initCompressedValue ( s , ! 0 ) , E . publicKeyCombine ( e , s ) ;
2019-07-10 09:53:52 +00:00
} , signatureNormalize : function ( e ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . ECDSA _SIGNATURE _TYPE _INVALID ) , assert . isBufferLength ( e , 64 , messages . ECDSA _SIGNATURE _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
E . signatureNormalize ( e ) ;
} , signatureExport : function ( e ) {
2019-07-10 04:01:15 +00:00
assert . isBuffer ( e , messages . ECDSA _SIGNATURE _TYPE _INVALID ) , assert . isBufferLength ( e , 64 , messages . ECDSA _SIGNATURE _LENGTH _INVALID ) ;
var s = E . signatureExport ( e ) ;
return der . signatureExport ( s ) ;
2019-07-10 09:53:52 +00:00
} , signatureImport : function ( e ) {
2019-07-10 04:01:15 +00:00
assert . isBuffer ( e , messages . ECDSA _SIGNATURE _TYPE _INVALID ) , assert . isLengthGTZero ( e , messages . ECDSA _SIGNATURE _LENGTH _INVALID ) ;
var s = der . signatureImport ( e ) ;
2019-07-10 09:53:52 +00:00
if ( s )
2019-07-10 04:01:15 +00:00
return E . signatureImport ( s ) ;
throw new Error ( messages . ECDSA _SIGNATURE _PARSE _DER _FAIL ) ;
2019-07-10 09:53:52 +00:00
} , signatureImportLax : function ( e ) {
2019-07-10 04:01:15 +00:00
assert . isBuffer ( e , messages . ECDSA _SIGNATURE _TYPE _INVALID ) , assert . isLengthGTZero ( e , messages . ECDSA _SIGNATURE _LENGTH _INVALID ) ;
var s = der . signatureImportLax ( e ) ;
2019-07-10 09:53:52 +00:00
if ( s )
2019-07-10 04:01:15 +00:00
return E . signatureImport ( s ) ;
throw new Error ( messages . ECDSA _SIGNATURE _PARSE _DER _FAIL ) ;
2019-07-10 09:53:52 +00:00
} , sign : function ( e , s , r ) {
2019-07-10 04:01:15 +00:00
assert . isBuffer ( e , messages . MSG32 _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . MSG32 _LENGTH _INVALID ) , assert . isBuffer ( s ,
2019-07-10 09:53:52 +00:00
messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ;
2019-07-10 04:01:15 +00:00
var _ = null , t = null ;
return void 0 !== r && ( assert . isObject ( r , messages . OPTIONS _TYPE _INVALID ) , void 0 !== r . data && ( assert . isBuffer ( r . data , messages . OPTIONS _DATA _TYPE _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBufferLength ( r . data , 32 , messages . OPTIONS _DATA _LENGTH _INVALID ) , _ = r . data ) , void 0 !== r . noncefn && ( assert . isFunction ( r . noncefn ,
messages . OPTIONS _NONCEFN _TYPE _INVALID ) , t = r . noncefn ) ) , E . sign ( e , s , t , _ ) ;
} , verify : function ( e , s , r ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . MSG32 _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . MSG32 _LENGTH _INVALID ) , assert . isBuffer ( s ,
2019-07-10 09:53:52 +00:00
messages . ECDSA _SIGNATURE _TYPE _INVALID ) , assert . isBufferLength ( s , 64 , messages . ECDSA _SIGNATURE _LENGTH _INVALID ) , assert . isBuffer ( r ,
messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( r , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) , E . verify ( e ,
s , r ) ;
} , recover : function ( e , s , r , _ ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . MSG32 _TYPE _INVALID ) , assert . isBufferLength ( e , 32 , messages . MSG32 _LENGTH _INVALID ) , assert . isBuffer ( s ,
2019-07-10 09:53:52 +00:00
messages . ECDSA _SIGNATURE _TYPE _INVALID ) , assert . isBufferLength ( s , 64 , messages . ECDSA _SIGNATURE _LENGTH _INVALID ) , assert . isNumber ( r ,
messages . RECOVERY _ID _TYPE _INVALID ) , assert . isNumberInInterval ( r , - 1 , 4 , messages . RECOVERY _ID _VALUE _INVALID ) , _ = initCompressedValue ( _ ,
! 0 ) , E . recover ( e , s , r , _ ) ;
} , ecdh : function ( e , s ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( e , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBuffer ( s , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
E . ecdh ( e , s ) ;
} , ecdhUnsafe : function ( e , s , r ) {
2019-07-10 04:01:15 +00:00
return assert . isBuffer ( e , messages . EC _PUBLIC _KEY _TYPE _INVALID ) , assert . isBufferLength2 ( e , 33 , 65 , messages . EC _PUBLIC _KEY _LENGTH _INVALID ) ,
2019-07-10 09:53:52 +00:00
assert . isBuffer ( s , messages . EC _PRIVATE _KEY _TYPE _INVALID ) , assert . isBufferLength ( s , 32 , messages . EC _PRIVATE _KEY _LENGTH _INVALID ) ,
r = initCompressedValue ( r , ! 0 ) , E . ecdhUnsafe ( e , s , r ) ;
}
} ;
2019-07-10 04:01:15 +00:00
} , global . SIGN _LIB = module . exports ;