42070 lines
1.1 MiB
42070 lines
1.1 MiB
// AWS SDK for JavaScript v3.0.78
|
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
// License at https://sdk.amazonaws.com/js/BUNDLE_LICENSE.txt
|
|
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2015-11-11",
|
|
"endpointPrefix": "account",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Account",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Account_20151111",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"CheckEmail": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"exists"
|
|
],
|
|
"members": {
|
|
"exists": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Create": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"email",
|
|
"password"
|
|
],
|
|
"members": {
|
|
"email": {},
|
|
"password": {},
|
|
"invitationCode": {},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"campaign": {},
|
|
"messagingAllowed": {
|
|
"type": "boolean"
|
|
},
|
|
"roles": {
|
|
"shape": "S9"
|
|
},
|
|
"termsAccepted": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"Login": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"email",
|
|
"password"
|
|
],
|
|
"members": {
|
|
"email": {},
|
|
"password": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"Search": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"query"
|
|
],
|
|
"members": {
|
|
"query": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
},
|
|
"ResetKeys": {
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"Get": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"ids": {
|
|
"type": "list",
|
|
"member": {}
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
},
|
|
"Update": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"email": {},
|
|
"password": {},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"messagingAllowed": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"Remove": {
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"ActivateByCode": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"code"
|
|
],
|
|
"members": {
|
|
"code": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"ResendActivationCode": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"ChangePassword": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"oldPassword",
|
|
"newPassword"
|
|
],
|
|
"members": {
|
|
"oldPassword": {},
|
|
"newPassword": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"ChangeEmail": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"password",
|
|
"email"
|
|
],
|
|
"members": {
|
|
"password": {},
|
|
"email": {},
|
|
"campaign": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "So"
|
|
}
|
|
},
|
|
"ConfirmEmailReset": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"code"
|
|
],
|
|
"members": {
|
|
"code": {}
|
|
}
|
|
}
|
|
},
|
|
"SendPasswordReset": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"PasswordResetByCode": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"code",
|
|
"password"
|
|
],
|
|
"members": {
|
|
"code": {},
|
|
"password": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"UpdatePhoto": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"body": {
|
|
"type": "blob",
|
|
"streaming": true
|
|
}
|
|
},
|
|
"payload": "body"
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"RemovePhoto": {
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"SendPhoneVerificationCode": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"phoneNumber"
|
|
],
|
|
"members": {
|
|
"phoneNumber": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "So"
|
|
}
|
|
},
|
|
"VerifyPhoneByCode": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"code"
|
|
],
|
|
"members": {
|
|
"code": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"CreateAccessToken": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"payload": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sy"
|
|
}
|
|
},
|
|
"GetAccountByAccessToken": {
|
|
"input": {
|
|
"shape": "Sy"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"accessKeyId",
|
|
"secretAccessKey"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"accessKeyId": {
|
|
"type": "string"
|
|
},
|
|
"secretAccessKey": {
|
|
"type": "string"
|
|
},
|
|
"email": {},
|
|
"friendlyId": {
|
|
"type": "string"
|
|
},
|
|
"payload": {}
|
|
}
|
|
}
|
|
},
|
|
"FacebookPrepareLogin": {
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"url"
|
|
],
|
|
"members": {
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"client_id": {
|
|
"type": "string"
|
|
},
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"response_type": {
|
|
"type": "string"
|
|
},
|
|
"state": {},
|
|
"redirect_uri": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"FacebookConnect": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"state",
|
|
"token"
|
|
],
|
|
"members": {
|
|
"state": {},
|
|
"token": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"FacebookMobileConnect": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token"
|
|
],
|
|
"members": {
|
|
"token": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"AcceptTerms": {
|
|
"output": {
|
|
"shape": "Sb"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S1": {
|
|
"type": "structure",
|
|
"required": [
|
|
"email"
|
|
],
|
|
"members": {
|
|
"email": {},
|
|
"campaign": {}
|
|
}
|
|
},
|
|
"S9": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"Sb": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"email"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"email": {},
|
|
"accessKeyId": {
|
|
"type": "string"
|
|
},
|
|
"secretAccessKey": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"roles": {
|
|
"shape": "S9"
|
|
},
|
|
"photoUrl": {
|
|
"type": "string"
|
|
},
|
|
"facebookConnected": {
|
|
"type": "boolean"
|
|
},
|
|
"termsAccepted": {
|
|
"type": "long"
|
|
},
|
|
"phoneNumber": {
|
|
"type": "string"
|
|
},
|
|
"messagingAllowed": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"Sg": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "Sb"
|
|
}
|
|
},
|
|
"So": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {}
|
|
}
|
|
},
|
|
"Sy": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token"
|
|
],
|
|
"members": {
|
|
"token": {},
|
|
"expires": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],2:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2015-11-11",
|
|
"endpointPrefix": "accountadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Account",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Account_20151111",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"ActivateById": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"email"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"email": {},
|
|
"accessKeyId": {
|
|
"type": "string"
|
|
},
|
|
"secretAccessKey": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"roles": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"photoUrl": {
|
|
"type": "string"
|
|
},
|
|
"facebookConnected": {
|
|
"type": "boolean"
|
|
},
|
|
"termsAccepted": {
|
|
"type": "long"
|
|
},
|
|
"phoneNumber": {
|
|
"type": "string"
|
|
},
|
|
"messagingAllowed": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ResetEmail": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"email"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"email": {},
|
|
"campaign": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S1"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S1": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],3:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2017-02-22",
|
|
"endpointPrefix": "backup",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Backup",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Backup_20170222",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"New": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"uploadUrl"
|
|
],
|
|
"members": {
|
|
"uploadUrl": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"List": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"members": {
|
|
"modified": {
|
|
"type": "string"
|
|
},
|
|
"etag": {
|
|
"type": "string"
|
|
},
|
|
"size": {
|
|
"type": "string"
|
|
},
|
|
"location": {
|
|
"type": "structure",
|
|
"members": {
|
|
"expires": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],4:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-11-26",
|
|
"endpointPrefix": "collision",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Collision",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Collision_20161126",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"Match": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"name",
|
|
"existingNames"
|
|
],
|
|
"members": {
|
|
"name": {},
|
|
"existingNames": {
|
|
"type": "list",
|
|
"member": {}
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"success"
|
|
],
|
|
"members": {
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"collision": {
|
|
"type": "boolean"
|
|
},
|
|
"closest_pair": {},
|
|
"distance": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],5:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-09-30",
|
|
"endpointPrefix": "gqa",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo GQA",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "GQA_20160930",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"Question": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"Input"
|
|
],
|
|
"members": {
|
|
"Input": {
|
|
"type": "string"
|
|
},
|
|
"Intent": {
|
|
"type": "string"
|
|
},
|
|
"Latitude": {
|
|
"type": "float"
|
|
},
|
|
"Longitude": {
|
|
"type": "float"
|
|
},
|
|
"Country": {
|
|
"type": "string"
|
|
},
|
|
"HasKid": {
|
|
"type": "boolean"
|
|
},
|
|
"Timezone": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"success"
|
|
],
|
|
"members": {
|
|
"success": {
|
|
"type": "boolean"
|
|
},
|
|
"source": {
|
|
"type": "string"
|
|
},
|
|
"answer": {
|
|
"type": "string"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string"
|
|
},
|
|
"timestamps": {
|
|
"type": "structure",
|
|
"required": [
|
|
"receive_request"
|
|
],
|
|
"members": {
|
|
"receive_request": {
|
|
"type": "long"
|
|
},
|
|
"return_response": {
|
|
"type": "long"
|
|
},
|
|
"bing_request": {
|
|
"type": "long"
|
|
},
|
|
"bing_response": {
|
|
"type": "long"
|
|
},
|
|
"wiki_request": {
|
|
"type": "long"
|
|
},
|
|
"wiki_response": {
|
|
"type": "long"
|
|
},
|
|
"wolfram_request": {
|
|
"type": "long"
|
|
},
|
|
"wolfram_response": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"response": {
|
|
"type": "object"
|
|
},
|
|
"version": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ListAttribution": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"ID"
|
|
],
|
|
"members": {
|
|
"ID": {
|
|
"type": "string"
|
|
},
|
|
"Service": {
|
|
"type": "string"
|
|
},
|
|
"after": {
|
|
"type": "long"
|
|
},
|
|
"before": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"data"
|
|
],
|
|
"members": {
|
|
"data": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"members": {
|
|
"service": {
|
|
"type": "string"
|
|
},
|
|
"query": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"image_url": {
|
|
"type": "string"
|
|
},
|
|
"robot_id": {
|
|
"type": "string"
|
|
},
|
|
"timestamp": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],6:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2017-02-07",
|
|
"endpointPrefix": "ifttt",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo IFTTT",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "IFTTT_20170207",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"Trigger": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"text"
|
|
],
|
|
"members": {
|
|
"text": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"ListTriggers": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"text": {},
|
|
"identity": {},
|
|
"limit": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"identity",
|
|
"text",
|
|
"created"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"identity": {},
|
|
"text": {},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ListMedia": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"identity": {},
|
|
"limit": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"identity",
|
|
"created",
|
|
"decryptedUrl"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"identity": {},
|
|
"encryptedUrl": {},
|
|
"decryptedUrl": {},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"DeleteIdentity": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"identity"
|
|
],
|
|
"members": {
|
|
"identity": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"Action": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"fields": {
|
|
"shape": "Sh"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Si"
|
|
}
|
|
},
|
|
"ListActions": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"limit": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Si"
|
|
}
|
|
},
|
|
"UserInfo": {
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"name"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"name": {}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S3": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"Sh": {
|
|
"type": "map",
|
|
"key": {
|
|
"type": "string"
|
|
},
|
|
"value": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"Si": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"loopId",
|
|
"created"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"loopId": {},
|
|
"fields": {
|
|
"shape": "Sh"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],7:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-02-01",
|
|
"endpointPrefix": "key",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Key",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Key_20160201",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"GetRequest": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"CreateRequest": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId",
|
|
"publicKey"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"publicKey": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"Share": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"encryptedKey"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"encryptedKey": {},
|
|
"keyHash": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"ListIncomingRequests": {
|
|
"input": {
|
|
"shape": "Sb"
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S3"
|
|
}
|
|
}
|
|
},
|
|
"ShouldCreate": {
|
|
"input": {
|
|
"shape": "Sb"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"shouldCreate"
|
|
],
|
|
"members": {
|
|
"shouldCreate": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Backup": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId",
|
|
"encryptedKey"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"encryptedKey": {},
|
|
"passwordHash": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
},
|
|
"Restore": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"passwordHash": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
},
|
|
"ListBinaryRequests": {
|
|
"input": {
|
|
"shape": "Sb"
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "Sj"
|
|
}
|
|
}
|
|
},
|
|
"ShareBinary": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"body": {
|
|
"type": "blob",
|
|
"streaming": true
|
|
},
|
|
"id": {
|
|
"location": "header",
|
|
"locationName": "x-id"
|
|
}
|
|
},
|
|
"payload": "body"
|
|
},
|
|
"output": {
|
|
"shape": "Sj"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S3": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"accountId",
|
|
"loopId",
|
|
"publicKey"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"accountId": {},
|
|
"loopId": {},
|
|
"publicKey": {},
|
|
"encryptedKey": {}
|
|
}
|
|
},
|
|
"Sb": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"Sg": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId",
|
|
"encryptedKey"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"accountId": {},
|
|
"encryptedKey": {}
|
|
}
|
|
},
|
|
"Sj": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"accountId",
|
|
"loopId",
|
|
"encryptedUrl"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"accountId": {},
|
|
"loopId": {},
|
|
"encryptedUrl": {},
|
|
"decryptedUrl": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],8:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2015-03-09",
|
|
"endpointPrefix": "log",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Log",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Log_20150309",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"PutEvents": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"events"
|
|
],
|
|
"members": {
|
|
"trackingId": {},
|
|
"deviceId": {},
|
|
"events": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"created"
|
|
],
|
|
"members": {
|
|
"created": {
|
|
"type": "long"
|
|
},
|
|
"payload": {
|
|
"type": "object"
|
|
},
|
|
"message": {},
|
|
"level": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"output": {}
|
|
},
|
|
"PutEventsAsync": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"kind",
|
|
"serial"
|
|
],
|
|
"members": {
|
|
"kind": {},
|
|
"serial": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"contentEncoding",
|
|
"uploadUrl"
|
|
],
|
|
"members": {
|
|
"contentEncoding": {},
|
|
"uploadUrl": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"NewKinesisCredentials": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"credentials",
|
|
"region",
|
|
"streamName"
|
|
],
|
|
"members": {
|
|
"credentials": {
|
|
"type": "structure",
|
|
"required": [
|
|
"AccessKeyId",
|
|
"Expiration",
|
|
"SecretAccessKey",
|
|
"SessionToken"
|
|
],
|
|
"members": {
|
|
"AccessKeyId": {
|
|
"type": "string"
|
|
},
|
|
"Expiration": {
|
|
"type": "string"
|
|
},
|
|
"SecretAccessKey": {
|
|
"type": "string"
|
|
},
|
|
"SessionToken": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"region": {
|
|
"type": "string"
|
|
},
|
|
"streamName": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"PutBinary": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"trackingId": {
|
|
"location": "header",
|
|
"locationName": "x-tracking-id"
|
|
},
|
|
"body": {
|
|
"type": "blob",
|
|
"streaming": true
|
|
}
|
|
},
|
|
"payload": "body"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"url"
|
|
],
|
|
"members": {
|
|
"path": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"PutBinaryAsync": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"trackingId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"url",
|
|
"uploadUrl"
|
|
],
|
|
"members": {
|
|
"path": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"uploadUrl": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],9:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2015-03-09",
|
|
"endpointPrefix": "logadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Log",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Log_20150309",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"SetLevel": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"friendlyIds",
|
|
"namespaces"
|
|
],
|
|
"members": {
|
|
"friendlyIds": {
|
|
"type": "list",
|
|
"member": {}
|
|
},
|
|
"namespaces": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"members": {
|
|
"namespace": {
|
|
"type": "string"
|
|
},
|
|
"level": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],10:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-03-24",
|
|
"endpointPrefix": "Loop",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Loop",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Loop_20160324",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"InviteMember": {
|
|
"name": "InviteLoopMember",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {},
|
|
"email": {},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"asLegalGuardian": {
|
|
"type": "boolean"
|
|
},
|
|
"isChild": {
|
|
"type": "boolean"
|
|
},
|
|
"phoneNumber": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"loopId"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"AcceptInvitation": {
|
|
"name": "AcceptLoopInvitation",
|
|
"input": {
|
|
"shape": "Sk"
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"DeclineInvitation": {
|
|
"name": "DeclineLoopInvitation",
|
|
"input": {
|
|
"shape": "Sk"
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"ListMembers": {
|
|
"name": "ListLoopMembers",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"statusList": {
|
|
"type": "list",
|
|
"member": {}
|
|
},
|
|
"typeList": {
|
|
"type": "list",
|
|
"member": {}
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S8"
|
|
}
|
|
},
|
|
"UpdateMember": {
|
|
"name": "UpdateLoopMember",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {},
|
|
"id": {},
|
|
"email": {},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"isChild": {
|
|
"type": "boolean"
|
|
},
|
|
"phoneNumber": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"loopId",
|
|
"id"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"RemoveMember": {
|
|
"name": "RemoveLoopMember",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {},
|
|
"id": {}
|
|
},
|
|
"required": [
|
|
"loopId",
|
|
"id"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"ListOwnerRobots": {
|
|
"input": {
|
|
"shape": "Sq"
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {}
|
|
}
|
|
},
|
|
"ClearRobot": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"robotId": {}
|
|
},
|
|
"required": [
|
|
"robotId"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"GetRobot": {
|
|
"input": {
|
|
"shape": "Sk"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"accessKeyId",
|
|
"secretAccessKey",
|
|
"friendlyId"
|
|
],
|
|
"members": {
|
|
"accessKeyId": {
|
|
"type": "string"
|
|
},
|
|
"secretAccessKey": {
|
|
"type": "string"
|
|
},
|
|
"friendlyId": {}
|
|
}
|
|
}
|
|
},
|
|
"Create": {
|
|
"name": "CreateLoop",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"robotId": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"name",
|
|
"robotId"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"Update": {
|
|
"name": "UpdateLoop",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {},
|
|
"name": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"name",
|
|
"loopId"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "Sw"
|
|
}
|
|
},
|
|
"List": {
|
|
"name": "ListLoops",
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S5"
|
|
}
|
|
}
|
|
},
|
|
"Remove": {
|
|
"name": "RemoveLoop",
|
|
"input": {
|
|
"shape": "Sk"
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"SetEnrollment": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {},
|
|
"id": {},
|
|
"face": {
|
|
"type": "boolean"
|
|
},
|
|
"voice": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"loopId",
|
|
"id"
|
|
]
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"FindOwner": {
|
|
"input": {
|
|
"shape": "Sq"
|
|
},
|
|
"output": {}
|
|
},
|
|
"SetLegalGuardian": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId",
|
|
"childId",
|
|
"parentId"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"childId": {},
|
|
"parentId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sw"
|
|
}
|
|
},
|
|
"UpdateAgreementStatus": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"agreementId"
|
|
],
|
|
"members": {
|
|
"agreementId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sw"
|
|
}
|
|
},
|
|
"UpdateNickname": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId",
|
|
"id"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"id": {},
|
|
"nickname": {
|
|
"shape": "Sh"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sw"
|
|
}
|
|
},
|
|
"UpdatePhoneticName": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId",
|
|
"id"
|
|
],
|
|
"members": {
|
|
"loopId": {},
|
|
"id": {},
|
|
"phoneticName": {
|
|
"shape": "Si"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sw"
|
|
}
|
|
},
|
|
"SuspendLoop": {
|
|
"input": {
|
|
"shape": "Sk"
|
|
},
|
|
"output": {
|
|
"shape": "Sw"
|
|
}
|
|
},
|
|
"UpdateMemberPhoto": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"body": {
|
|
"shape": "S15"
|
|
},
|
|
"loopId": {
|
|
"location": "header",
|
|
"locationName": "x-loop-id"
|
|
},
|
|
"id": {
|
|
"location": "header",
|
|
"locationName": "x-id"
|
|
}
|
|
},
|
|
"payload": "body"
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"RemoveMemberPhoto": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"body": {
|
|
"shape": "S15"
|
|
},
|
|
"loopId": {},
|
|
"id": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S5": {
|
|
"type": "structure",
|
|
"required": [
|
|
"owner"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"owner": {},
|
|
"robot": {},
|
|
"robotFriendlyId": {},
|
|
"members": {
|
|
"shape": "S8"
|
|
},
|
|
"isSuspended": {
|
|
"type": "boolean"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
},
|
|
"updated": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"S8": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"members": {
|
|
"id": {},
|
|
"loopId": {},
|
|
"accountId": {},
|
|
"account": {
|
|
"type": "structure",
|
|
"members": {
|
|
"email": {},
|
|
"firstName": {
|
|
"type": "string"
|
|
},
|
|
"lastName": {
|
|
"type": "string"
|
|
},
|
|
"gender": {},
|
|
"birthday": {
|
|
"type": "long"
|
|
},
|
|
"photoUrl": {
|
|
"type": "string"
|
|
},
|
|
"facebookAccessToken": {},
|
|
"isChild": {
|
|
"type": "boolean"
|
|
},
|
|
"phoneNumber": {
|
|
"type": "string"
|
|
},
|
|
"messagingAllowed": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"enrolled": {
|
|
"type": "structure",
|
|
"members": {
|
|
"face": {
|
|
"type": "boolean"
|
|
},
|
|
"voice": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"status": {},
|
|
"type": {},
|
|
"agreementId": {},
|
|
"nickname": {
|
|
"shape": "Sh"
|
|
},
|
|
"phoneticName": {
|
|
"shape": "Si"
|
|
},
|
|
"legalGuardianId": {},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
},
|
|
"required": [
|
|
"id",
|
|
"loopId",
|
|
"status",
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
"Sh": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"Si": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"Sk": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {}
|
|
},
|
|
"required": [
|
|
"loopId"
|
|
]
|
|
},
|
|
"Sq": {
|
|
"type": "structure",
|
|
"members": {
|
|
"accountId": {}
|
|
}
|
|
},
|
|
"Sw": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"S15": {
|
|
"type": "blob",
|
|
"streaming": true
|
|
}
|
|
}
|
|
}
|
|
},{}],11:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-07-25",
|
|
"endpointPrefix": "media",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Media",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Media_20160725",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"Create": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"body": {
|
|
"type": "blob",
|
|
"streaming": true
|
|
},
|
|
"loopId": {
|
|
"location": "header",
|
|
"locationName": "x-loop-id"
|
|
},
|
|
"path": {
|
|
"location": "header",
|
|
"locationName": "x-path"
|
|
},
|
|
"type": {
|
|
"location": "header",
|
|
"locationName": "x-type"
|
|
},
|
|
"reference": {
|
|
"location": "header",
|
|
"locationName": "x-reference"
|
|
},
|
|
"isEncrypted": {
|
|
"location": "header",
|
|
"locationName": "x-encrypted",
|
|
"type": "boolean"
|
|
},
|
|
"meta": {
|
|
"shape": "S8",
|
|
"location": "headers",
|
|
"locationName": "x-meta"
|
|
}
|
|
},
|
|
"payload": "body"
|
|
},
|
|
"output": {
|
|
"shape": "Sa"
|
|
}
|
|
},
|
|
"List": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopIds"
|
|
],
|
|
"members": {
|
|
"loopIds": {
|
|
"type": "list",
|
|
"member": {}
|
|
},
|
|
"after": {
|
|
"type": "long"
|
|
},
|
|
"before": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
},
|
|
"Remove": {
|
|
"input": {
|
|
"shape": "Sh"
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
},
|
|
"Get": {
|
|
"input": {
|
|
"shape": "Sh"
|
|
},
|
|
"output": {
|
|
"shape": "Sg"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S8": {
|
|
"type": "map",
|
|
"key": {},
|
|
"value": {}
|
|
},
|
|
"Sa": {
|
|
"type": "structure",
|
|
"required": [
|
|
"path",
|
|
"created"
|
|
],
|
|
"members": {
|
|
"path": {},
|
|
"type": {},
|
|
"reference": {},
|
|
"accountId": {},
|
|
"loopId": {},
|
|
"url": {},
|
|
"isEncrypted": {
|
|
"type": "boolean"
|
|
},
|
|
"isDeleted": {
|
|
"type": "boolean"
|
|
},
|
|
"meta": {
|
|
"shape": "S8"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
},
|
|
"Sg": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "Sa"
|
|
}
|
|
},
|
|
"Sh": {
|
|
"type": "structure",
|
|
"required": [
|
|
"paths"
|
|
],
|
|
"members": {
|
|
"paths": {
|
|
"type": "list",
|
|
"member": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],12:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-07-25",
|
|
"endpointPrefix": "mediaadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Media",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Media_20160725",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"RemoveAllMediaFromLoop": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"path",
|
|
"created"
|
|
],
|
|
"members": {
|
|
"path": {},
|
|
"type": {},
|
|
"reference": {},
|
|
"accountId": {},
|
|
"loopId": {},
|
|
"url": {},
|
|
"isEncrypted": {
|
|
"type": "boolean"
|
|
},
|
|
"isDeleted": {
|
|
"type": "boolean"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],13:[function(require,module,exports){
|
|
module.exports={
|
|
"log": {
|
|
"name": "Log"
|
|
},
|
|
"logadmin": {
|
|
"name": "LogAdmin"
|
|
},
|
|
"push": {
|
|
"name": "Push"
|
|
},
|
|
"account": {
|
|
"name": "Account",
|
|
"cors": true
|
|
},
|
|
"accountadmin": {
|
|
"name": "AccountAdmin"
|
|
},
|
|
"backup": {
|
|
"name": "Backup"
|
|
},
|
|
"notification": {
|
|
"name": "Notification"
|
|
},
|
|
"update": {
|
|
"name": "Update"
|
|
},
|
|
"updateadmin": {
|
|
"name": "UpdateAdmin"
|
|
},
|
|
"robot": {
|
|
"name": "Robot"
|
|
},
|
|
"robotadmin": {
|
|
"name": "RobotAdmin"
|
|
},
|
|
"key": {
|
|
"name": "Key"
|
|
},
|
|
"loop": {
|
|
"name": "Loop",
|
|
"cors": true
|
|
},
|
|
"media": {
|
|
"name": "Media"
|
|
},
|
|
"mediaadmin": {
|
|
"name": "MediaAdmin"
|
|
},
|
|
"person": {
|
|
"name": "Person"
|
|
},
|
|
"gqa": {
|
|
"name": "GQA"
|
|
},
|
|
"oobe": {
|
|
"name": "OOBE"
|
|
},
|
|
"nlp": {
|
|
"name": "NLP"
|
|
},
|
|
"collision": {
|
|
"name": "Collision"
|
|
},
|
|
"ifttt": {
|
|
"name": "IFTTT"
|
|
},
|
|
"oobeadmin": {
|
|
"name": "OOBEAdmin"
|
|
},
|
|
"rom": {
|
|
"name": "ROM"
|
|
},
|
|
"oauthclientsadmin": {
|
|
"name": "OauthClientsAdmin"
|
|
}
|
|
}
|
|
|
|
},{}],14:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-10-31",
|
|
"endpointPrefix": "nlp",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo NLP",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "NLP_20161031",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"PartOfSpeech": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"partsOfSpeech"
|
|
],
|
|
"members": {
|
|
"partsOfSpeech": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"members": {
|
|
"word": {
|
|
"type": "string"
|
|
},
|
|
"pos": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"NamedEntityRecognition": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"namedEntities"
|
|
],
|
|
"members": {
|
|
"namedEntities": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"members": {
|
|
"start": {
|
|
"type": "integer"
|
|
},
|
|
"end": {
|
|
"type": "integer"
|
|
},
|
|
"label": {
|
|
"type": "string"
|
|
},
|
|
"text": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S1": {
|
|
"type": "structure",
|
|
"required": [
|
|
"Input"
|
|
],
|
|
"members": {
|
|
"Input": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],15:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2015-05-05",
|
|
"endpointPrefix": "notification",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Notification",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Notification_20150505",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"NewRobotToken": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"deviceId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token"
|
|
],
|
|
"members": {
|
|
"token": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"GetStatus": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"accountId"
|
|
],
|
|
"members": {
|
|
"accountId": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"connected"
|
|
],
|
|
"members": {
|
|
"connected": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],16:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2017-11-08",
|
|
"endpointPrefix": "oauthclientsadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo OAuth Clients",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "OauthClients_20171108",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"ListClients": {
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S2"
|
|
}
|
|
}
|
|
},
|
|
"Create": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"clientId",
|
|
"redirectUri",
|
|
"responseType",
|
|
"scope",
|
|
"secret"
|
|
],
|
|
"members": {
|
|
"aco": {
|
|
"shape": "S4"
|
|
},
|
|
"channelKey": {
|
|
"type": "string"
|
|
},
|
|
"clientId": {
|
|
"type": "string"
|
|
},
|
|
"pkce": {
|
|
"type": "boolean"
|
|
},
|
|
"redirectUri": {
|
|
"type": "string"
|
|
},
|
|
"refresh": {
|
|
"type": "boolean"
|
|
},
|
|
"responseType": {
|
|
"type": "string"
|
|
},
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"secret": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S2"
|
|
}
|
|
},
|
|
"Update": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"aco": {
|
|
"shape": "S4"
|
|
},
|
|
"channelKey": {
|
|
"type": "string"
|
|
},
|
|
"clientId": {
|
|
"type": "string"
|
|
},
|
|
"pkce": {
|
|
"type": "boolean"
|
|
},
|
|
"redirectUri": {
|
|
"type": "string"
|
|
},
|
|
"refresh": {
|
|
"type": "boolean"
|
|
},
|
|
"responseType": {
|
|
"type": "string"
|
|
},
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"secret": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S2"
|
|
}
|
|
},
|
|
"Remove": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S2"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S2": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"clientId",
|
|
"scope"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"aco": {
|
|
"shape": "S4"
|
|
},
|
|
"channelKey": {
|
|
"type": "string"
|
|
},
|
|
"clientId": {
|
|
"type": "string"
|
|
},
|
|
"pkce": {
|
|
"type": "boolean"
|
|
},
|
|
"redirectUri": {
|
|
"type": "string"
|
|
},
|
|
"refresh": {
|
|
"type": "boolean"
|
|
},
|
|
"responseType": {
|
|
"type": "string"
|
|
},
|
|
"scope": {
|
|
"type": "string"
|
|
},
|
|
"secret": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"S4": {
|
|
"type": "structure",
|
|
"members": {
|
|
"commandSet": {
|
|
"type": "list",
|
|
"member": {}
|
|
},
|
|
"streamSet": {
|
|
"type": "list",
|
|
"member": {}
|
|
},
|
|
"appConfig": {
|
|
"type": "structure",
|
|
"members": {
|
|
"speechConfig": {
|
|
"type": "structure",
|
|
"members": {
|
|
"maxNoSpeechTimeout": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"keepAliveTimeout": {
|
|
"type": "integer"
|
|
},
|
|
"recoveryTimeout": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],17:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-10-26",
|
|
"endpointPrefix": "oobe",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo OOBE",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "OOBE_20161026",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"PrepareRobot": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"GetStatus": {
|
|
"input": {
|
|
"shape": "S3"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"complete"
|
|
],
|
|
"members": {
|
|
"complete": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"SetupRobot": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token",
|
|
"id"
|
|
],
|
|
"members": {
|
|
"token": {},
|
|
"id": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"accessKeyId",
|
|
"secretAccessKey"
|
|
],
|
|
"members": {
|
|
"accessKeyId": {
|
|
"type": "string"
|
|
},
|
|
"secretAccessKey": {
|
|
"type": "string"
|
|
},
|
|
"serviceMode": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ReconnectRobot": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token"
|
|
],
|
|
"members": {
|
|
"token": {},
|
|
"id": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S3": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token"
|
|
],
|
|
"members": {
|
|
"token": {},
|
|
"expires": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],18:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-10-26",
|
|
"endpointPrefix": "oobeadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo OOBE",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "OOBE_20161026",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"GetServiceToken": {
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"token"
|
|
],
|
|
"members": {
|
|
"token": {},
|
|
"expires": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],19:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-08-01",
|
|
"endpointPrefix": "person",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Person",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Person_20160801",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"List": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"category"
|
|
],
|
|
"members": {
|
|
"category": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"key",
|
|
"question"
|
|
],
|
|
"members": {
|
|
"key": {},
|
|
"question": {},
|
|
"options": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"key"
|
|
],
|
|
"members": {
|
|
"key": {},
|
|
"answer": {},
|
|
"image": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Answer": {
|
|
"input": {
|
|
"shape": "Sc"
|
|
},
|
|
"output": {
|
|
"shape": "Sc"
|
|
}
|
|
},
|
|
"EnableHolidays": {
|
|
"input": {
|
|
"shape": "Sd"
|
|
},
|
|
"output": {
|
|
"shape": "Sh"
|
|
}
|
|
},
|
|
"ListHolidays": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"loopId",
|
|
"category"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"eventId": {},
|
|
"name": {},
|
|
"category": {},
|
|
"subcategory": {},
|
|
"loopId": {},
|
|
"memberId": {},
|
|
"isEnabled": {
|
|
"type": "boolean"
|
|
},
|
|
"date": {},
|
|
"endDate": {},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"DisableHolidays": {
|
|
"input": {
|
|
"shape": "Sd"
|
|
},
|
|
"output": {
|
|
"shape": "Sh"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"Sc": {
|
|
"type": "structure",
|
|
"required": [
|
|
"key",
|
|
"answer"
|
|
],
|
|
"members": {
|
|
"key": {},
|
|
"answer": {}
|
|
}
|
|
},
|
|
"Sd": {
|
|
"type": "structure",
|
|
"required": [
|
|
"ids",
|
|
"loopId"
|
|
],
|
|
"members": {
|
|
"ids": {
|
|
"type": "list",
|
|
"member": {}
|
|
},
|
|
"loopId": {}
|
|
}
|
|
},
|
|
"Sh": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],20:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-07-29",
|
|
"endpointPrefix": "push",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Push",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Push_20160729",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"CreateDevice": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
},
|
|
"RemoveDevice": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"name"
|
|
],
|
|
"members": {
|
|
"name": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S1": {
|
|
"type": "structure",
|
|
"required": [
|
|
"name",
|
|
"pushToken",
|
|
"type"
|
|
],
|
|
"members": {
|
|
"name": {},
|
|
"pushToken": {
|
|
"type": "string"
|
|
},
|
|
"type": {}
|
|
}
|
|
},
|
|
"S4": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S1"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],21:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-02-25",
|
|
"endpointPrefix": "robot",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Robot",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Robot_20160225",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"GetFriendlyIds": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"count"
|
|
],
|
|
"members": {
|
|
"count": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"RemoveRobot": {
|
|
"input": {
|
|
"shape": "S6"
|
|
},
|
|
"output": {
|
|
"shape": "S8"
|
|
}
|
|
},
|
|
"UpdateRobot": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"payload"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"payload": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S8"
|
|
}
|
|
},
|
|
"GetRobot": {
|
|
"input": {
|
|
"shape": "S6"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"payload"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"payload": {
|
|
"type": "object"
|
|
},
|
|
"calibrationPayload": {
|
|
"type": "object"
|
|
},
|
|
"updated": {
|
|
"type": "long"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"GetRobotHistory": {
|
|
"input": {
|
|
"shape": "S6"
|
|
},
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"payload"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"name": {},
|
|
"payload": {
|
|
"type": "object"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"GetCalibrationData": {
|
|
"input": {
|
|
"shape": "S6"
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"calibrationPayload"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"calibrationPayload": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S6": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"serialNumber": {}
|
|
}
|
|
},
|
|
"S8": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],22:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-02-25",
|
|
"endpointPrefix": "robotadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Robot",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Robot_20160225",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"CreateRobot": {
|
|
"input": {
|
|
"shape": "S1"
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
},
|
|
"CreateRobotBatch": {
|
|
"input": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S1"
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
},
|
|
"CalibrateRobot": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"calibrationPayload"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"calibrationPayload": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S1": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id",
|
|
"payload"
|
|
],
|
|
"members": {
|
|
"id": {},
|
|
"payload": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
},
|
|
"S4": {
|
|
"type": "structure",
|
|
"required": [
|
|
"result"
|
|
],
|
|
"members": {
|
|
"result": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],23:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2017-10-11",
|
|
"endpointPrefix": "rom",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo ROM",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "ROM_20171011",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"Create": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"friendlyId"
|
|
],
|
|
"members": {
|
|
"friendlyId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"created"
|
|
],
|
|
"members": {
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"SetupClient": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"friendlyId"
|
|
],
|
|
"members": {
|
|
"friendlyId": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"cert",
|
|
"public",
|
|
"private",
|
|
"fingerprint",
|
|
"payload",
|
|
"created"
|
|
],
|
|
"members": {
|
|
"cert": {},
|
|
"public": {},
|
|
"private": {},
|
|
"p12": {},
|
|
"fingerprint": {},
|
|
"payload": {
|
|
"type": "structure",
|
|
"required": [
|
|
"ipAddress"
|
|
],
|
|
"members": {
|
|
"ipAddress": {}
|
|
}
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"SetupServer": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"ipAddress"
|
|
],
|
|
"members": {
|
|
"ipAddress": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"type": "structure",
|
|
"required": [
|
|
"cert",
|
|
"public",
|
|
"private",
|
|
"fingerprint",
|
|
"created"
|
|
],
|
|
"members": {
|
|
"cert": {},
|
|
"public": {},
|
|
"private": {},
|
|
"fingerprint": {},
|
|
"created": {
|
|
"type": "long"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {}
|
|
}
|
|
},{}],24:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-03-01",
|
|
"endpointPrefix": "update",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Update",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Update_20160301",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"ListUpdates": {
|
|
"input": {
|
|
"type": "structure",
|
|
"members": {
|
|
"subsystem": {},
|
|
"filter": {}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
},
|
|
"ListUpdatesFrom": {
|
|
"input": {
|
|
"shape": "Sa"
|
|
},
|
|
"output": {
|
|
"shape": "S4"
|
|
}
|
|
},
|
|
"GetUpdateFrom": {
|
|
"input": {
|
|
"shape": "Sa"
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"CreateUpdate": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"fromVersion",
|
|
"toVersion",
|
|
"changes"
|
|
],
|
|
"members": {
|
|
"fromVersion": {
|
|
"type": "string",
|
|
"location": "header",
|
|
"locationName": "x-update-from-version"
|
|
},
|
|
"toVersion": {
|
|
"type": "string",
|
|
"location": "header",
|
|
"locationName": "x-update-to-version"
|
|
},
|
|
"changes": {
|
|
"type": "string",
|
|
"location": "header",
|
|
"locationName": "x-update-changes"
|
|
},
|
|
"body": {
|
|
"type": "blob",
|
|
"streaming": true
|
|
},
|
|
"subsystem": {
|
|
"location": "header",
|
|
"locationName": "x-update-subsystem"
|
|
},
|
|
"filter": {
|
|
"location": "header",
|
|
"locationName": "x-update-filter"
|
|
},
|
|
"dependencies": {
|
|
"shape": "S8",
|
|
"location": "headers",
|
|
"locationName": "x-update-dependencies"
|
|
}
|
|
},
|
|
"payload": "body"
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"RemoveUpdate": {
|
|
"input": {
|
|
"type": "structure",
|
|
"required": [
|
|
"id"
|
|
],
|
|
"members": {
|
|
"id": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"shape": "S5"
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S4": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S5"
|
|
}
|
|
},
|
|
"S5": {
|
|
"type": "structure",
|
|
"required": [
|
|
"_id",
|
|
"created",
|
|
"accountId",
|
|
"fromVersion",
|
|
"toVersion",
|
|
"changes",
|
|
"url",
|
|
"shaHash",
|
|
"subsystem"
|
|
],
|
|
"members": {
|
|
"_id": {
|
|
"type": "string"
|
|
},
|
|
"created": {
|
|
"type": "long"
|
|
},
|
|
"accountId": {},
|
|
"fromVersion": {
|
|
"type": "string"
|
|
},
|
|
"toVersion": {
|
|
"type": "string"
|
|
},
|
|
"changes": {
|
|
"type": "string"
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"shaHash": {
|
|
"type": "string"
|
|
},
|
|
"length": {
|
|
"type": "long"
|
|
},
|
|
"subsystem": {},
|
|
"filter": {},
|
|
"dependencies": {
|
|
"shape": "S8"
|
|
}
|
|
}
|
|
},
|
|
"S8": {
|
|
"type": "map",
|
|
"key": {},
|
|
"value": {}
|
|
},
|
|
"Sa": {
|
|
"type": "structure",
|
|
"required": [
|
|
"fromVersion"
|
|
],
|
|
"members": {
|
|
"fromVersion": {
|
|
"type": "string"
|
|
},
|
|
"subsystem": {},
|
|
"filter": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],25:[function(require,module,exports){
|
|
module.exports={
|
|
"metadata": {
|
|
"apiVersion": "2016-03-01",
|
|
"endpointPrefix": "updateadmin",
|
|
"jsonVersion": "1.1",
|
|
"serviceFullName": "Jibo Update",
|
|
"signatureVersion": "v4",
|
|
"targetPrefix": "Update_20160301",
|
|
"protocol": "json"
|
|
},
|
|
"operations": {
|
|
"ListUniqueFilters": {
|
|
"output": {
|
|
"type": "list",
|
|
"member": {}
|
|
}
|
|
},
|
|
"SetTarget": {
|
|
"input": {
|
|
"shape": "S3"
|
|
}
|
|
},
|
|
"ListTargets": {
|
|
"output": {
|
|
"type": "list",
|
|
"member": {
|
|
"shape": "S3"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"shapes": {
|
|
"S3": {
|
|
"type": "structure",
|
|
"required": [
|
|
"serial"
|
|
],
|
|
"members": {
|
|
"serial": {},
|
|
"target": {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},{}],26:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
|
|
AWS.apiLoader = function(svc, version) {
|
|
if (!AWS.apiLoader.services.hasOwnProperty(svc)) {
|
|
throw new Error('InvalidService: Failed to load api for ' + svc);
|
|
}
|
|
return AWS.apiLoader.services[svc][version];
|
|
};
|
|
|
|
AWS.apiLoader.services = {};
|
|
|
|
module.exports = AWS.apiLoader;
|
|
},{"./core":29}],27:[function(require,module,exports){
|
|
(function (process){
|
|
var util = require('./util');
|
|
|
|
util.crypto.lib = require('crypto-browserify');
|
|
util.Buffer = require('buffer/').Buffer;
|
|
util.url = require('url/');
|
|
util.querystring = require('querystring/');
|
|
|
|
var AWS = require('./core');
|
|
|
|
require('./api_loader');
|
|
|
|
AWS.XML.Parser = require('./xml/browser_parser');
|
|
|
|
require('./http/xhr');
|
|
|
|
if (typeof process === 'undefined') {
|
|
process = {
|
|
browser: true
|
|
};
|
|
}
|
|
}).call(this,require('_process'))
|
|
},{"./api_loader":26,"./core":29,"./http/xhr":34,"./util":72,"./xml/browser_parser":73,"_process":274,"buffer/":130,"crypto-browserify":141,"querystring/":287,"url/":316}],28:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
require('./credentials');
|
|
require('./credentials/credential_provider_chain');
|
|
var PromisesDependency;
|
|
|
|
|
|
AWS.Config = AWS.util.inherit({
|
|
|
|
|
|
|
|
constructor: function Config(options) {
|
|
if (options === undefined) options = {};
|
|
options = this.extractCredentials(options);
|
|
|
|
AWS.util.each.call(this, this.keys, function (key, value) {
|
|
this.set(key, options[key], value);
|
|
});
|
|
},
|
|
|
|
|
|
|
|
|
|
getCredentials: function getCredentials(callback) {
|
|
var self = this;
|
|
|
|
function finish(err) {
|
|
callback(err, err ? null : self.credentials);
|
|
}
|
|
|
|
function credError(msg, err) {
|
|
return new AWS.util.error(err || new Error(), {
|
|
code: 'CredentialsError', message: msg
|
|
});
|
|
}
|
|
|
|
function getAsyncCredentials() {
|
|
self.credentials.get(function(err) {
|
|
if (err) {
|
|
var msg = 'Could not load credentials from ' +
|
|
self.credentials.constructor.name;
|
|
err = credError(msg, err);
|
|
}
|
|
finish(err);
|
|
});
|
|
}
|
|
|
|
function getStaticCredentials() {
|
|
var err = null;
|
|
if (!self.credentials.accessKeyId || !self.credentials.secretAccessKey) {
|
|
err = credError('Missing credentials');
|
|
}
|
|
finish(err);
|
|
}
|
|
|
|
if (self.credentials) {
|
|
if (typeof self.credentials.get === 'function') {
|
|
getAsyncCredentials();
|
|
} else { // static credentials
|
|
getStaticCredentials();
|
|
}
|
|
} else if (self.credentialProvider) {
|
|
self.credentialProvider.resolve(function(err, creds) {
|
|
if (err) {
|
|
err = credError('Could not load credentials from any providers', err);
|
|
}
|
|
self.credentials = creds;
|
|
finish(err);
|
|
});
|
|
} else {
|
|
finish(credError('No credentials to load'));
|
|
}
|
|
},
|
|
|
|
|
|
|
|
|
|
update: function update(options, allowUnknownKeys) {
|
|
allowUnknownKeys = allowUnknownKeys || false;
|
|
options = this.extractCredentials(options);
|
|
AWS.util.each.call(this, options, function (key, value) {
|
|
if (allowUnknownKeys || Object.prototype.hasOwnProperty.call(this.keys, key) ||
|
|
AWS.Service.hasService(key)) {
|
|
this.set(key, value);
|
|
}
|
|
});
|
|
},
|
|
|
|
|
|
loadFromPath: function loadFromPath(path) {
|
|
this.clear();
|
|
|
|
var options = JSON.parse(AWS.util.readFileSync(path));
|
|
var fileSystemCreds = new AWS.FileSystemCredentials(path);
|
|
var chain = new AWS.CredentialProviderChain();
|
|
chain.providers.unshift(fileSystemCreds);
|
|
chain.resolve(function (err, creds) {
|
|
if (err) throw err;
|
|
else options.credentials = creds;
|
|
});
|
|
|
|
this.constructor(options);
|
|
|
|
return this;
|
|
},
|
|
|
|
|
|
clear: function clear() {
|
|
|
|
AWS.util.each.call(this, this.keys, function (key) {
|
|
delete this[key];
|
|
});
|
|
|
|
this.set('credentials', undefined);
|
|
this.set('credentialProvider', undefined);
|
|
},
|
|
|
|
|
|
set: function set(property, value, defaultValue) {
|
|
if (value === undefined) {
|
|
if (defaultValue === undefined) {
|
|
defaultValue = this.keys[property];
|
|
}
|
|
if (typeof defaultValue === 'function') {
|
|
this[property] = defaultValue.call(this);
|
|
} else {
|
|
this[property] = defaultValue;
|
|
}
|
|
} else if (property === 'httpOptions' && this[property]) {
|
|
this[property] = AWS.util.merge(this[property], value);
|
|
} else {
|
|
this[property] = value;
|
|
}
|
|
},
|
|
|
|
|
|
keys: {
|
|
credentials: null,
|
|
credentialProvider: null,
|
|
region: null,
|
|
logger: null,
|
|
apiVersions: {},
|
|
apiVersion: null,
|
|
endpoint: undefined,
|
|
httpOptions: {
|
|
timeout: 120000
|
|
},
|
|
maxRetries: undefined,
|
|
maxRedirects: 10,
|
|
paramValidation: true,
|
|
sslEnabled: true,
|
|
s3ForcePathStyle: false,
|
|
s3BucketEndpoint: false,
|
|
s3DisableBodySigning: true,
|
|
computeChecksums: true,
|
|
convertResponseTypes: true,
|
|
correctClockSkew: false,
|
|
customUserAgent: null,
|
|
dynamoDbCrc32: true,
|
|
systemClockOffset: 0,
|
|
signatureVersion: null,
|
|
signatureCache: true,
|
|
retryDelayOptions: {
|
|
base: 100
|
|
},
|
|
useAccelerateEndpoint: false
|
|
},
|
|
|
|
|
|
extractCredentials: function extractCredentials(options) {
|
|
if (options.accessKeyId && options.secretAccessKey) {
|
|
options = AWS.util.copy(options);
|
|
options.credentials = new AWS.Credentials(options);
|
|
}
|
|
return options;
|
|
},
|
|
|
|
|
|
setPromisesDependency: function setPromisesDependency(dep) {
|
|
PromisesDependency = dep;
|
|
if (dep === null && typeof Promise === 'function') {
|
|
PromisesDependency = Promise;
|
|
}
|
|
var constructors = [AWS.Request, AWS.Credentials, AWS.CredentialProviderChain];
|
|
if (AWS.S3 && AWS.S3.ManagedUpload) constructors.push(AWS.S3.ManagedUpload);
|
|
AWS.util.addPromises(constructors, PromisesDependency);
|
|
},
|
|
|
|
|
|
getPromisesDependency: function getPromisesDependency() {
|
|
return PromisesDependency;
|
|
}
|
|
});
|
|
|
|
|
|
AWS.config = new AWS.Config();
|
|
|
|
},{"./core":29,"./credentials":30,"./credentials/credential_provider_chain":31}],29:[function(require,module,exports){
|
|
|
|
var AWS = { util: require('./util') };
|
|
|
|
|
|
var _hidden = {}; _hidden.toString(); // hack to parse macro
|
|
|
|
module.exports = AWS;
|
|
|
|
AWS.util.update(AWS, {
|
|
|
|
|
|
VERSION: require('../package.json').version,
|
|
|
|
|
|
Signers: {},
|
|
|
|
|
|
Protocol: {
|
|
Json: require('./protocol/json'),
|
|
Query: require('./protocol/query'),
|
|
Rest: require('./protocol/rest'),
|
|
RestJson: require('./protocol/rest_json'),
|
|
RestXml: require('./protocol/rest_xml')
|
|
},
|
|
|
|
|
|
XML: {
|
|
Builder: require('./xml/builder'),
|
|
Parser: null // conditionally set based on environment
|
|
},
|
|
|
|
|
|
JSON: {
|
|
Builder: require('./json/builder'),
|
|
Parser: require('./json/parser')
|
|
},
|
|
|
|
|
|
Model: {
|
|
Api: require('./model/api'),
|
|
Operation: require('./model/operation'),
|
|
Shape: require('./model/shape'),
|
|
Paginator: require('./model/paginator'),
|
|
ResourceWaiter: require('./model/resource_waiter')
|
|
},
|
|
|
|
util: require('./util'),
|
|
|
|
|
|
apiLoader: function() { throw new Error('No API loader set'); }
|
|
});
|
|
|
|
require('./service');
|
|
require('./config');
|
|
|
|
require('./credentials');
|
|
require('./credentials/credential_provider_chain');
|
|
|
|
require('./http');
|
|
require('./sequential_executor');
|
|
require('./event_listeners');
|
|
require('./request');
|
|
require('./response');
|
|
require('./resource_waiter');
|
|
require('./signers/request_signer');
|
|
require('./param_validator');
|
|
|
|
|
|
AWS.events = new AWS.SequentialExecutor();
|
|
|
|
},{"../package.json":341,"./config":28,"./credentials":30,"./credentials/credential_provider_chain":31,"./event_listeners":32,"./http":33,"./json/builder":35,"./json/parser":36,"./model/api":37,"./model/operation":39,"./model/paginator":40,"./model/resource_waiter":41,"./model/shape":42,"./param_validator":43,"./protocol/json":44,"./protocol/query":45,"./protocol/rest":46,"./protocol/rest_json":47,"./protocol/rest_xml":48,"./request":52,"./resource_waiter":53,"./response":54,"./sequential_executor":55,"./service":56,"./signers/request_signer":65,"./util":72,"./xml/builder":74}],30:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
|
|
|
|
AWS.Credentials = AWS.util.inherit({
|
|
|
|
constructor: function Credentials() {
|
|
AWS.util.hideProperties(this, ['secretAccessKey']);
|
|
|
|
this.expired = false;
|
|
this.expireTime = null;
|
|
if (arguments.length === 1 && typeof arguments[0] === 'object') {
|
|
var creds = arguments[0].credentials || arguments[0];
|
|
this.accessKeyId = creds.accessKeyId;
|
|
this.secretAccessKey = creds.secretAccessKey;
|
|
this.sessionToken = creds.sessionToken;
|
|
} else {
|
|
this.accessKeyId = arguments[0];
|
|
this.secretAccessKey = arguments[1];
|
|
this.sessionToken = arguments[2];
|
|
}
|
|
},
|
|
|
|
|
|
expiryWindow: 15,
|
|
|
|
|
|
needsRefresh: function needsRefresh() {
|
|
var currentTime = AWS.util.date.getDate().getTime();
|
|
var adjustedTime = new Date(currentTime + this.expiryWindow * 1000);
|
|
|
|
if (this.expireTime && adjustedTime > this.expireTime) {
|
|
return true;
|
|
} else {
|
|
return this.expired || !this.accessKeyId || !this.secretAccessKey;
|
|
}
|
|
},
|
|
|
|
|
|
get: function get(callback) {
|
|
var self = this;
|
|
if (this.needsRefresh()) {
|
|
this.refresh(function(err) {
|
|
if (!err) self.expired = false; // reset expired flag
|
|
if (callback) callback(err);
|
|
});
|
|
} else if (callback) {
|
|
callback();
|
|
}
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
refresh: function refresh(callback) {
|
|
this.expired = false;
|
|
callback();
|
|
}
|
|
});
|
|
|
|
|
|
AWS.Credentials.addPromisesToClass = function addPromisesToClass(PromiseDependency) {
|
|
this.prototype.getPromise = AWS.util.promisifyMethod('get', PromiseDependency);
|
|
this.prototype.refreshPromise = AWS.util.promisifyMethod('refresh', PromiseDependency);
|
|
};
|
|
|
|
|
|
AWS.Credentials.deletePromisesFromClass = function deletePromisesFromClass() {
|
|
delete this.prototype.getPromise;
|
|
delete this.prototype.refreshPromise;
|
|
};
|
|
|
|
AWS.util.addPromises(AWS.Credentials);
|
|
|
|
},{"./core":29}],31:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
|
|
|
|
AWS.CredentialProviderChain = AWS.util.inherit(AWS.Credentials, {
|
|
|
|
|
|
constructor: function CredentialProviderChain(providers) {
|
|
if (providers) {
|
|
this.providers = providers;
|
|
} else {
|
|
this.providers = AWS.CredentialProviderChain.defaultProviders.slice(0);
|
|
}
|
|
},
|
|
|
|
|
|
|
|
|
|
resolve: function resolve(callback) {
|
|
if (this.providers.length === 0) {
|
|
callback(new Error('No providers'));
|
|
return this;
|
|
}
|
|
|
|
var index = 0;
|
|
var providers = this.providers.slice(0);
|
|
|
|
function resolveNext(err, creds) {
|
|
if ((!err && creds) || index === providers.length) {
|
|
callback(err, creds);
|
|
return;
|
|
}
|
|
|
|
var provider = providers[index++];
|
|
if (typeof provider === 'function') {
|
|
creds = provider.call();
|
|
} else {
|
|
creds = provider;
|
|
}
|
|
|
|
if (creds.get) {
|
|
creds.get(function(getErr) {
|
|
resolveNext(getErr, getErr ? null : creds);
|
|
});
|
|
} else {
|
|
resolveNext(null, creds);
|
|
}
|
|
}
|
|
|
|
resolveNext();
|
|
return this;
|
|
}
|
|
});
|
|
|
|
|
|
AWS.CredentialProviderChain.defaultProviders = [];
|
|
|
|
|
|
AWS.CredentialProviderChain.addPromisesToClass = function addPromisesToClass(PromiseDependency) {
|
|
this.prototype.resolvePromise = AWS.util.promisifyMethod('resolve', PromiseDependency);
|
|
};
|
|
|
|
|
|
AWS.CredentialProviderChain.deletePromisesFromClass = function deletePromisesFromClass() {
|
|
delete this.prototype.resolvePromise;
|
|
};
|
|
|
|
AWS.util.addPromises(AWS.CredentialProviderChain);
|
|
|
|
},{"../core":29}],32:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
var SequentialExecutor = require('./sequential_executor');
|
|
var uuid = require('uuid');
|
|
|
|
AWS.EventListeners = {
|
|
|
|
Core: {} /* doc hack */
|
|
};
|
|
|
|
AWS.EventListeners = {
|
|
Core: new SequentialExecutor().addNamedListeners(function(add, addAsync) {
|
|
addAsync('VALIDATE_CREDENTIALS', 'validate',
|
|
function VALIDATE_CREDENTIALS(req, done) {
|
|
if (!req.service.api.signatureVersion) return done(); // none
|
|
req.service.config.getCredentials(function(err) {
|
|
if (err) {
|
|
req.response.error = AWS.util.error(err,
|
|
{code: 'CredentialsError', message: 'Missing credentials in config'});
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
|
|
add('VALIDATE_REGION', 'validate', function VALIDATE_REGION(req) {
|
|
if (!req.service.config.region && !req.service.isGlobalEndpoint) {
|
|
req.response.error = AWS.util.error(new Error(),
|
|
{code: 'ConfigError', message: 'Missing region in config'});
|
|
}
|
|
});
|
|
|
|
add('BUILD_IDEMPOTENCY_TOKENS', 'validate', function BUILD_IDEMPOTENCY_TOKENS(req) {
|
|
var operation = req.service.api.operations[req.operation];
|
|
if (!operation) {
|
|
return;
|
|
}
|
|
var idempotentMembers = operation.idempotentMembers;
|
|
if (!idempotentMembers.length) {
|
|
return;
|
|
}
|
|
var params = AWS.util.copy(req.params);
|
|
for (var i = 0, iLen = idempotentMembers.length; i < iLen; i++) {
|
|
if (!params[idempotentMembers[i]]) {
|
|
params[idempotentMembers[i]] = uuid.v4();
|
|
}
|
|
}
|
|
req.params = params;
|
|
});
|
|
|
|
add('VALIDATE_PARAMETERS', 'validate', function VALIDATE_PARAMETERS(req) {
|
|
var rules = req.service.api.operations[req.operation].input;
|
|
var validation = req.service.config.paramValidation;
|
|
new AWS.ParamValidator(validation).validate(rules, req.params);
|
|
});
|
|
|
|
addAsync('COMPUTE_SHA256', 'afterBuild', function COMPUTE_SHA256(req, done) {
|
|
req.haltHandlersOnError();
|
|
if (!req.service.api.signatureVersion) return done(); // none
|
|
if (req.service.getSignerClass(req) === AWS.Signers.V4) {
|
|
var body = req.httpRequest.body || '';
|
|
AWS.util.computeSha256(body, function(err, sha) {
|
|
if (err) {
|
|
done(err);
|
|
}
|
|
else {
|
|
req.httpRequest.headers['X-Amz-Content-Sha256'] = sha;
|
|
done();
|
|
}
|
|
});
|
|
} else {
|
|
done();
|
|
}
|
|
});
|
|
|
|
add('SET_CONTENT_LENGTH', 'afterBuild', function SET_CONTENT_LENGTH(req) {
|
|
if (req.httpRequest.headers['Content-Length'] === undefined) {
|
|
var length;
|
|
try {
|
|
length = AWS.util.string.byteLength(req.httpRequest.body);
|
|
} catch (e) {
|
|
}
|
|
if (length) {
|
|
req.httpRequest.headers['Content-Length'] = length;
|
|
}
|
|
}
|
|
});
|
|
|
|
add('SET_HTTP_HOST', 'afterBuild', function SET_HTTP_HOST(req) {
|
|
req.httpRequest.headers['Host'] = req.httpRequest.endpoint.host;
|
|
});
|
|
|
|
add('RESTART', 'restart', function RESTART() {
|
|
var err = this.response.error;
|
|
if (!err || !err.retryable) return;
|
|
|
|
this.httpRequest = new AWS.HttpRequest(
|
|
this.service.endpoint,
|
|
this.service.region
|
|
);
|
|
|
|
if (this.response.retryCount < this.service.config.maxRetries) {
|
|
this.response.retryCount++;
|
|
} else {
|
|
this.response.error = null;
|
|
}
|
|
});
|
|
|
|
addAsync('SIGN', 'sign', function SIGN(req, done) {
|
|
var service = req.service;
|
|
if (!service.api.signatureVersion) return done(); // none
|
|
|
|
service.config.getCredentials(function (err, credentials) {
|
|
if (err) {
|
|
req.response.error = err;
|
|
return done();
|
|
}
|
|
|
|
try {
|
|
var date = AWS.util.date.getDate();
|
|
var SignerClass = service.getSignerClass(req);
|
|
var signer = new SignerClass(req.httpRequest,
|
|
service.api.signingName || service.api.endpointPrefix,
|
|
service.config.signatureCache);
|
|
signer.setServiceClientId(service._clientId);
|
|
|
|
delete req.httpRequest.headers['Authorization'];
|
|
delete req.httpRequest.headers['Date'];
|
|
delete req.httpRequest.headers['X-Amz-Date'];
|
|
|
|
signer.addAuthorization(credentials, date);
|
|
req.signedAt = date;
|
|
} catch (e) {
|
|
req.response.error = e;
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
|
|
add('VALIDATE_RESPONSE', 'validateResponse', function VALIDATE_RESPONSE(resp) {
|
|
if (this.service.successfulResponse(resp, this)) {
|
|
resp.data = {};
|
|
resp.error = null;
|
|
} else {
|
|
resp.data = null;
|
|
resp.error = AWS.util.error(new Error(),
|
|
{code: 'UnknownError', message: 'An unknown error occurred.'});
|
|
}
|
|
});
|
|
|
|
addAsync('SEND', 'send', function SEND(resp, done) {
|
|
resp.httpResponse._abortCallback = done;
|
|
resp.error = null;
|
|
resp.data = null;
|
|
|
|
function callback(httpResp) {
|
|
resp.httpResponse.stream = httpResp;
|
|
|
|
httpResp.on('headers', function onHeaders(statusCode, headers) {
|
|
resp.request.emit('httpHeaders', [statusCode, headers, resp]);
|
|
|
|
if (!resp.httpResponse.streaming) {
|
|
if (AWS.HttpClient.streamsApiVersion === 2) { // streams2 API check
|
|
httpResp.on('readable', function onReadable() {
|
|
var data = httpResp.read();
|
|
if (data !== null) {
|
|
resp.request.emit('httpData', [data, resp]);
|
|
}
|
|
});
|
|
} else { // legacy streams API
|
|
httpResp.on('data', function onData(data) {
|
|
resp.request.emit('httpData', [data, resp]);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
httpResp.on('end', function onEnd() {
|
|
resp.request.emit('httpDone');
|
|
done();
|
|
});
|
|
}
|
|
|
|
function progress(httpResp) {
|
|
httpResp.on('sendProgress', function onSendProgress(value) {
|
|
resp.request.emit('httpUploadProgress', [value, resp]);
|
|
});
|
|
|
|
httpResp.on('receiveProgress', function onReceiveProgress(value) {
|
|
resp.request.emit('httpDownloadProgress', [value, resp]);
|
|
});
|
|
}
|
|
|
|
function error(err) {
|
|
resp.error = AWS.util.error(err, {
|
|
code: 'NetworkingError',
|
|
region: resp.request.httpRequest.region,
|
|
hostname: resp.request.httpRequest.endpoint.hostname,
|
|
retryable: true
|
|
});
|
|
resp.request.emit('httpError', [resp.error, resp], function() {
|
|
done();
|
|
});
|
|
}
|
|
|
|
function executeSend() {
|
|
var http = AWS.HttpClient.getInstance();
|
|
var httpOptions = resp.request.service.config.httpOptions || {};
|
|
try {
|
|
var stream = http.handleRequest(resp.request.httpRequest, httpOptions,
|
|
callback, error);
|
|
progress(stream);
|
|
} catch (err) {
|
|
error(err);
|
|
}
|
|
}
|
|
|
|
var timeDiff = (AWS.util.date.getDate() - this.signedAt) / 1000;
|
|
if (timeDiff >= 60 * 10) { // if we signed 10min ago, re-sign
|
|
this.emit('sign', [this], function(err) {
|
|
if (err) done(err);
|
|
else executeSend();
|
|
});
|
|
} else {
|
|
executeSend();
|
|
}
|
|
});
|
|
|
|
add('HTTP_HEADERS', 'httpHeaders',
|
|
function HTTP_HEADERS(statusCode, headers, resp) {
|
|
resp.httpResponse.statusCode = statusCode;
|
|
resp.httpResponse.headers = headers;
|
|
resp.httpResponse.body = new AWS.util.Buffer('');
|
|
resp.httpResponse.buffers = [];
|
|
resp.httpResponse.numBytes = 0;
|
|
var dateHeader = headers.date || headers.Date;
|
|
if (dateHeader) {
|
|
var serverTime = Date.parse(dateHeader);
|
|
if (resp.request.service.config.correctClockSkew
|
|
&& AWS.util.isClockSkewed(serverTime)) {
|
|
AWS.util.applyClockOffset(serverTime);
|
|
}
|
|
}
|
|
});
|
|
|
|
add('HTTP_DATA', 'httpData', function HTTP_DATA(chunk, resp) {
|
|
if (chunk) {
|
|
if (AWS.util.isNode()) {
|
|
resp.httpResponse.numBytes += chunk.length;
|
|
|
|
var total = resp.httpResponse.headers['content-length'];
|
|
var progress = { loaded: resp.httpResponse.numBytes, total: total };
|
|
resp.request.emit('httpDownloadProgress', [progress, resp]);
|
|
}
|
|
|
|
resp.httpResponse.buffers.push(new AWS.util.Buffer(chunk));
|
|
}
|
|
});
|
|
|
|
add('HTTP_DONE', 'httpDone', function HTTP_DONE(resp) {
|
|
if (resp.httpResponse.buffers && resp.httpResponse.buffers.length > 0) {
|
|
var body = AWS.util.buffer.concat(resp.httpResponse.buffers);
|
|
resp.httpResponse.body = body;
|
|
}
|
|
delete resp.httpResponse.numBytes;
|
|
delete resp.httpResponse.buffers;
|
|
});
|
|
|
|
add('FINALIZE_ERROR', 'retry', function FINALIZE_ERROR(resp) {
|
|
if (resp.httpResponse.statusCode) {
|
|
resp.error.statusCode = resp.httpResponse.statusCode;
|
|
if (resp.error.retryable === undefined) {
|
|
resp.error.retryable = this.service.retryableError(resp.error, this);
|
|
}
|
|
}
|
|
});
|
|
|
|
add('INVALIDATE_CREDENTIALS', 'retry', function INVALIDATE_CREDENTIALS(resp) {
|
|
if (!resp.error) return;
|
|
switch (resp.error.code) {
|
|
case 'RequestExpired': // EC2 only
|
|
case 'ExpiredTokenException':
|
|
case 'ExpiredToken':
|
|
resp.error.retryable = true;
|
|
resp.request.service.config.credentials.expired = true;
|
|
}
|
|
});
|
|
|
|
add('EXPIRED_SIGNATURE', 'retry', function EXPIRED_SIGNATURE(resp) {
|
|
var err = resp.error;
|
|
if (!err) return;
|
|
if (typeof err.code === 'string' && typeof err.message === 'string') {
|
|
if (err.code.match(/Signature/) && err.message.match(/expired/)) {
|
|
resp.error.retryable = true;
|
|
}
|
|
}
|
|
});
|
|
|
|
add('CLOCK_SKEWED', 'retry', function CLOCK_SKEWED(resp) {
|
|
if (!resp.error) return;
|
|
if (this.service.clockSkewError(resp.error)
|
|
&& this.service.config.correctClockSkew
|
|
&& AWS.config.isClockSkewed) {
|
|
resp.error.retryable = true;
|
|
}
|
|
});
|
|
|
|
add('REDIRECT', 'retry', function REDIRECT(resp) {
|
|
if (resp.error && resp.error.statusCode >= 300 &&
|
|
resp.error.statusCode < 400 && resp.httpResponse.headers['location']) {
|
|
this.httpRequest.endpoint =
|
|
new AWS.Endpoint(resp.httpResponse.headers['location']);
|
|
this.httpRequest.headers['Host'] = this.httpRequest.endpoint.host;
|
|
resp.error.redirect = true;
|
|
resp.error.retryable = true;
|
|
}
|
|
});
|
|
|
|
add('RETRY_CHECK', 'retry', function RETRY_CHECK(resp) {
|
|
if (resp.error) {
|
|
if (resp.error.redirect && resp.redirectCount < resp.maxRedirects) {
|
|
resp.error.retryDelay = 0;
|
|
} else if (resp.retryCount < resp.maxRetries) {
|
|
resp.error.retryDelay = this.service.retryDelays(resp.retryCount) || 0;
|
|
}
|
|
}
|
|
});
|
|
|
|
addAsync('RESET_RETRY_STATE', 'afterRetry', function RESET_RETRY_STATE(resp, done) {
|
|
var delay, willRetry = false;
|
|
|
|
if (resp.error) {
|
|
delay = resp.error.retryDelay || 0;
|
|
if (resp.error.retryable && resp.retryCount < resp.maxRetries) {
|
|
resp.retryCount++;
|
|
willRetry = true;
|
|
} else if (resp.error.redirect && resp.redirectCount < resp.maxRedirects) {
|
|
resp.redirectCount++;
|
|
willRetry = true;
|
|
}
|
|
}
|
|
|
|
if (willRetry) {
|
|
resp.error = null;
|
|
setTimeout(done, delay);
|
|
} else {
|
|
done();
|
|
}
|
|
});
|
|
}),
|
|
|
|
CorePost: new SequentialExecutor().addNamedListeners(function(add) {
|
|
add('EXTRACT_REQUEST_ID', 'extractData', AWS.util.extractRequestId);
|
|
add('EXTRACT_REQUEST_ID', 'extractError', AWS.util.extractRequestId);
|
|
|
|
add('ENOTFOUND_ERROR', 'httpError', function ENOTFOUND_ERROR(err) {
|
|
if (err.code === 'NetworkingError' && err.errno === 'ENOTFOUND') {
|
|
var message = 'Inaccessible host: `' + err.hostname +
|
|
'\'. This service may not be available in the `' + err.region +
|
|
'\' region.';
|
|
this.response.error = AWS.util.error(new Error(message), {
|
|
code: 'UnknownEndpoint',
|
|
region: err.region,
|
|
hostname: err.hostname,
|
|
retryable: true,
|
|
originalError: err
|
|
});
|
|
}
|
|
});
|
|
}),
|
|
|
|
Logger: new SequentialExecutor().addNamedListeners(function(add) {
|
|
add('LOG_REQUEST', 'complete', function LOG_REQUEST(resp) {
|
|
var req = resp.request;
|
|
var logger = req.service.config.logger;
|
|
if (!logger) return;
|
|
|
|
function buildMessage() {
|
|
var time = AWS.util.date.getDate().getTime();
|
|
var delta = (time - req.startTime.getTime()) / 1000;
|
|
var ansi = logger.isTTY ? true : false;
|
|
var status = resp.httpResponse.statusCode;
|
|
var params = require('util').inspect(req.params, true, null);
|
|
|
|
var message = '';
|
|
if (ansi) message += '\x1B[33m';
|
|
message += '[AWS ' + req.service.serviceIdentifier + ' ' + status;
|
|
message += ' ' + delta.toString() + 's ' + resp.retryCount + ' retries]';
|
|
if (ansi) message += '\x1B[0;1m';
|
|
message += ' ' + AWS.util.string.lowerFirst(req.operation);
|
|
message += '(' + params + ')';
|
|
if (ansi) message += '\x1B[0m';
|
|
return message;
|
|
}
|
|
|
|
var line = buildMessage();
|
|
if (typeof logger.log === 'function') {
|
|
logger.log(line);
|
|
} else if (typeof logger.write === 'function') {
|
|
logger.write(line + '\n');
|
|
}
|
|
});
|
|
}),
|
|
|
|
Json: new SequentialExecutor().addNamedListeners(function(add) {
|
|
var svc = require('./protocol/json');
|
|
add('BUILD', 'build', svc.buildRequest);
|
|
add('EXTRACT_DATA', 'extractData', svc.extractData);
|
|
add('EXTRACT_ERROR', 'extractError', svc.extractError);
|
|
}),
|
|
|
|
Rest: new SequentialExecutor().addNamedListeners(function(add) {
|
|
var svc = require('./protocol/rest');
|
|
add('BUILD', 'build', svc.buildRequest);
|
|
add('EXTRACT_DATA', 'extractData', svc.extractData);
|
|
add('EXTRACT_ERROR', 'extractError', svc.extractError);
|
|
}),
|
|
|
|
RestJson: new SequentialExecutor().addNamedListeners(function(add) {
|
|
var svc = require('./protocol/rest_json');
|
|
add('BUILD', 'build', svc.buildRequest);
|
|
add('EXTRACT_DATA', 'extractData', svc.extractData);
|
|
add('EXTRACT_ERROR', 'extractError', svc.extractError);
|
|
}),
|
|
|
|
RestXml: new SequentialExecutor().addNamedListeners(function(add) {
|
|
var svc = require('./protocol/rest_xml');
|
|
add('BUILD', 'build', svc.buildRequest);
|
|
add('EXTRACT_DATA', 'extractData', svc.extractData);
|
|
add('EXTRACT_ERROR', 'extractError', svc.extractError);
|
|
}),
|
|
|
|
Query: new SequentialExecutor().addNamedListeners(function(add) {
|
|
var svc = require('./protocol/query');
|
|
add('BUILD', 'build', svc.buildRequest);
|
|
add('EXTRACT_DATA', 'extractData', svc.extractData);
|
|
add('EXTRACT_ERROR', 'extractError', svc.extractError);
|
|
})
|
|
};
|
|
|
|
},{"./core":29,"./protocol/json":44,"./protocol/query":45,"./protocol/rest":46,"./protocol/rest_json":47,"./protocol/rest_xml":48,"./sequential_executor":55,"util":320,"uuid":322}],33:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
AWS.Endpoint = inherit({
|
|
|
|
|
|
constructor: function Endpoint(endpoint, config) {
|
|
AWS.util.hideProperties(this, ['slashes', 'auth', 'hash', 'search', 'query']);
|
|
|
|
if (typeof endpoint === 'undefined' || endpoint === null) {
|
|
throw new Error('Invalid endpoint: ' + endpoint);
|
|
} else if (typeof endpoint !== 'string') {
|
|
return AWS.util.copy(endpoint);
|
|
}
|
|
|
|
if (!endpoint.match(/^http/)) {
|
|
var useSSL = config && config.sslEnabled !== undefined ?
|
|
config.sslEnabled : AWS.config.sslEnabled;
|
|
endpoint = (useSSL ? 'https' : 'http') + '://' + endpoint;
|
|
}
|
|
|
|
AWS.util.update(this, AWS.util.urlParse(endpoint));
|
|
|
|
if (this.port) {
|
|
this.port = parseInt(this.port, 10);
|
|
} else {
|
|
this.port = this.protocol === 'https:' ? 443 : 80;
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
|
|
AWS.HttpRequest = inherit({
|
|
|
|
|
|
constructor: function HttpRequest(endpoint, region, customUserAgent) {
|
|
endpoint = new AWS.Endpoint(endpoint);
|
|
this.method = 'POST';
|
|
this.path = endpoint.path || '/';
|
|
this.headers = {};
|
|
this.body = '';
|
|
this.endpoint = endpoint;
|
|
this.region = region;
|
|
this.setUserAgent(customUserAgent);
|
|
},
|
|
|
|
|
|
setUserAgent: function setUserAgent(customUserAgent) {
|
|
var prefix = AWS.util.isBrowser() ? 'X-Amz-' : '';
|
|
var customSuffix = '';
|
|
if (typeof customUserAgent === 'string' && customUserAgent) {
|
|
customSuffix += ' ' + customUserAgent;
|
|
}
|
|
this.headers[prefix + 'User-Agent'] = AWS.util.userAgent() + customSuffix;
|
|
},
|
|
|
|
|
|
pathname: function pathname() {
|
|
return this.path.split('?', 1)[0];
|
|
},
|
|
|
|
|
|
search: function search() {
|
|
var query = this.path.split('?', 2)[1];
|
|
if (query) {
|
|
query = AWS.util.queryStringParse(query);
|
|
return AWS.util.queryParamsToString(query);
|
|
}
|
|
return '';
|
|
}
|
|
|
|
});
|
|
|
|
|
|
AWS.HttpResponse = inherit({
|
|
|
|
|
|
constructor: function HttpResponse() {
|
|
this.statusCode = undefined;
|
|
this.headers = {};
|
|
this.body = undefined;
|
|
this.streaming = false;
|
|
this.stream = null;
|
|
},
|
|
|
|
|
|
createUnbufferedStream: function createUnbufferedStream() {
|
|
this.streaming = true;
|
|
return this.stream;
|
|
}
|
|
});
|
|
|
|
|
|
AWS.HttpClient = inherit({});
|
|
|
|
|
|
AWS.HttpClient.getInstance = function getInstance() {
|
|
if (this.singleton === undefined) {
|
|
this.singleton = new this();
|
|
}
|
|
return this.singleton;
|
|
};
|
|
|
|
},{"./core":29}],34:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var EventEmitter = require('events').EventEmitter;
|
|
require('../http');
|
|
|
|
|
|
AWS.XHRClient = AWS.util.inherit({
|
|
handleRequest: function handleRequest(httpRequest, httpOptions, callback, errCallback) {
|
|
var self = this;
|
|
var endpoint = httpRequest.endpoint;
|
|
var emitter = new EventEmitter();
|
|
var href = endpoint.protocol + '//' + endpoint.hostname;
|
|
if (endpoint.port !== 80 && endpoint.port !== 443) {
|
|
href += ':' + endpoint.port;
|
|
}
|
|
href += httpRequest.path;
|
|
|
|
var xhr = new XMLHttpRequest(), headersEmitted = false;
|
|
httpRequest.stream = xhr;
|
|
|
|
xhr.addEventListener('readystatechange', function() {
|
|
try {
|
|
if (xhr.status === 0) return; // 0 code is invalid
|
|
} catch (e) { return; }
|
|
|
|
if (this.readyState >= this.HEADERS_RECEIVED && !headersEmitted) {
|
|
try { xhr.responseType = 'arraybuffer'; } catch (e) {}
|
|
emitter.statusCode = xhr.status;
|
|
emitter.headers = self.parseHeaders(xhr.getAllResponseHeaders());
|
|
emitter.emit('headers', emitter.statusCode, emitter.headers);
|
|
headersEmitted = true;
|
|
}
|
|
if (this.readyState === this.DONE) {
|
|
self.finishRequest(xhr, emitter);
|
|
}
|
|
}, false);
|
|
xhr.upload.addEventListener('progress', function (evt) {
|
|
emitter.emit('sendProgress', evt);
|
|
});
|
|
xhr.addEventListener('progress', function (evt) {
|
|
emitter.emit('receiveProgress', evt);
|
|
}, false);
|
|
xhr.addEventListener('timeout', function () {
|
|
errCallback(AWS.util.error(new Error('Timeout'), {code: 'TimeoutError'}));
|
|
}, false);
|
|
xhr.addEventListener('error', function () {
|
|
errCallback(AWS.util.error(new Error('Network Failure'), {
|
|
code: 'NetworkingError'
|
|
}));
|
|
}, false);
|
|
|
|
callback(emitter);
|
|
xhr.open(httpRequest.method, href, httpOptions.xhrAsync !== false);
|
|
AWS.util.each(httpRequest.headers, function (key, value) {
|
|
if (key !== 'Content-Length' && key !== 'User-Agent' && key !== 'Host') {
|
|
xhr.setRequestHeader(key, value);
|
|
}
|
|
});
|
|
|
|
if (httpOptions.timeout && httpOptions.xhrAsync !== false) {
|
|
xhr.timeout = httpOptions.timeout;
|
|
}
|
|
|
|
if (httpOptions.xhrWithCredentials) {
|
|
xhr.withCredentials = true;
|
|
}
|
|
|
|
try {
|
|
xhr.send(httpRequest.body);
|
|
} catch (err) {
|
|
if (httpRequest.body && typeof httpRequest.body.buffer === 'object') {
|
|
xhr.send(httpRequest.body.buffer); // send ArrayBuffer directly
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
return emitter;
|
|
},
|
|
|
|
parseHeaders: function parseHeaders(rawHeaders) {
|
|
var headers = {};
|
|
AWS.util.arrayEach(rawHeaders.split(/\r?\n/), function (line) {
|
|
var key = line.split(':', 1)[0];
|
|
var value = line.substring(key.length + 2);
|
|
if (key.length > 0) headers[key.toLowerCase()] = value;
|
|
});
|
|
return headers;
|
|
},
|
|
|
|
finishRequest: function finishRequest(xhr, emitter) {
|
|
var buffer;
|
|
if (xhr.responseType === 'arraybuffer' && xhr.response) {
|
|
var ab = xhr.response;
|
|
buffer = new AWS.util.Buffer(ab.byteLength);
|
|
var view = new Uint8Array(ab);
|
|
for (var i = 0; i < buffer.length; ++i) {
|
|
buffer[i] = view[i];
|
|
}
|
|
}
|
|
|
|
try {
|
|
if (!buffer && typeof xhr.responseText === 'string') {
|
|
buffer = new AWS.util.Buffer(xhr.responseText);
|
|
}
|
|
} catch (e) {}
|
|
|
|
if (buffer) emitter.emit('data', buffer);
|
|
emitter.emit('end');
|
|
}
|
|
});
|
|
|
|
|
|
AWS.HttpClient.prototype = AWS.XHRClient.prototype;
|
|
|
|
|
|
AWS.HttpClient.streamsApiVersion = 1;
|
|
|
|
},{"../core":29,"../http":33,"events":172}],35:[function(require,module,exports){
|
|
var util = require('../util');
|
|
|
|
function JsonBuilder() { }
|
|
|
|
JsonBuilder.prototype.build = function(value, shape) {
|
|
return JSON.stringify(translate(value, shape));
|
|
};
|
|
|
|
function translate(value, shape) {
|
|
if (!shape || value === undefined) return undefined;
|
|
|
|
switch (shape.type) {
|
|
case 'structure': return translateStructure(value, shape);
|
|
case 'map': return translateMap(value, shape);
|
|
case 'list': return translateList(value, shape);
|
|
default: return translateScalar(value, shape);
|
|
}
|
|
}
|
|
|
|
function translateStructure(structure, shape) {
|
|
var struct = {};
|
|
util.each(structure, function(name, value) {
|
|
var memberShape = shape.members[name];
|
|
if (memberShape) {
|
|
if (memberShape.location !== 'body') return;
|
|
var locationName = memberShape.isLocationName ? memberShape.name : name;
|
|
var result = translate(value, memberShape);
|
|
if (result !== undefined) struct[locationName] = result;
|
|
}
|
|
});
|
|
return struct;
|
|
}
|
|
|
|
function translateList(list, shape) {
|
|
var out = [];
|
|
util.arrayEach(list, function(value) {
|
|
var result = translate(value, shape.member);
|
|
if (result !== undefined) out.push(result);
|
|
});
|
|
return out;
|
|
}
|
|
|
|
function translateMap(map, shape) {
|
|
var out = {};
|
|
util.each(map, function(key, value) {
|
|
var result = translate(value, shape.value);
|
|
if (result !== undefined) out[key] = result;
|
|
});
|
|
return out;
|
|
}
|
|
|
|
function translateScalar(value, shape) {
|
|
return shape.toWireFormat(value);
|
|
}
|
|
|
|
module.exports = JsonBuilder;
|
|
|
|
},{"../util":72}],36:[function(require,module,exports){
|
|
var util = require('../util');
|
|
|
|
function JsonParser() { }
|
|
|
|
JsonParser.prototype.parse = function(value, shape) {
|
|
return translate(JSON.parse(value), shape);
|
|
};
|
|
|
|
function translate(value, shape) {
|
|
if (!shape || value === undefined) return undefined;
|
|
|
|
switch (shape.type) {
|
|
case 'structure': return translateStructure(value, shape);
|
|
case 'map': return translateMap(value, shape);
|
|
case 'list': return translateList(value, shape);
|
|
default: return translateScalar(value, shape);
|
|
}
|
|
}
|
|
|
|
function translateStructure(structure, shape) {
|
|
if (structure == null) return undefined;
|
|
|
|
var struct = {};
|
|
var shapeMembers = shape.members;
|
|
util.each(shapeMembers, function(name, memberShape) {
|
|
var locationName = memberShape.isLocationName ? memberShape.name : name;
|
|
if (Object.prototype.hasOwnProperty.call(structure, locationName)) {
|
|
var value = structure[locationName];
|
|
var result = translate(value, memberShape);
|
|
if (result !== undefined) struct[name] = result;
|
|
}
|
|
});
|
|
return struct;
|
|
}
|
|
|
|
function translateList(list, shape) {
|
|
if (list == null) return undefined;
|
|
|
|
var out = [];
|
|
util.arrayEach(list, function(value) {
|
|
var result = translate(value, shape.member);
|
|
if (result === undefined) out.push(null);
|
|
else out.push(result);
|
|
});
|
|
return out;
|
|
}
|
|
|
|
function translateMap(map, shape) {
|
|
if (map == null) return undefined;
|
|
|
|
var out = {};
|
|
util.each(map, function(key, value) {
|
|
var result = translate(value, shape.value);
|
|
if (result === undefined) out[key] = null;
|
|
else out[key] = result;
|
|
});
|
|
return out;
|
|
}
|
|
|
|
function translateScalar(value, shape) {
|
|
return shape.toType(value);
|
|
}
|
|
|
|
module.exports = JsonParser;
|
|
|
|
},{"../util":72}],37:[function(require,module,exports){
|
|
var Collection = require('./collection');
|
|
var Operation = require('./operation');
|
|
var Shape = require('./shape');
|
|
var Paginator = require('./paginator');
|
|
var ResourceWaiter = require('./resource_waiter');
|
|
|
|
var util = require('../util');
|
|
var property = util.property;
|
|
var memoizedProperty = util.memoizedProperty;
|
|
|
|
function Api(api, options) {
|
|
api = api || {};
|
|
options = options || {};
|
|
options.api = this;
|
|
|
|
api.metadata = api.metadata || {};
|
|
|
|
property(this, 'isApi', true, false);
|
|
property(this, 'apiVersion', api.metadata.apiVersion);
|
|
property(this, 'endpointPrefix', api.metadata.endpointPrefix);
|
|
property(this, 'signingName', api.metadata.signingName);
|
|
property(this, 'globalEndpoint', api.metadata.globalEndpoint);
|
|
property(this, 'signatureVersion', api.metadata.signatureVersion);
|
|
property(this, 'jsonVersion', api.metadata.jsonVersion);
|
|
property(this, 'targetPrefix', api.metadata.targetPrefix);
|
|
property(this, 'protocol', api.metadata.protocol);
|
|
property(this, 'timestampFormat', api.metadata.timestampFormat);
|
|
property(this, 'xmlNamespaceUri', api.metadata.xmlNamespace);
|
|
property(this, 'abbreviation', api.metadata.serviceAbbreviation);
|
|
property(this, 'fullName', api.metadata.serviceFullName);
|
|
|
|
memoizedProperty(this, 'className', function() {
|
|
var name = api.metadata.serviceAbbreviation || api.metadata.serviceFullName;
|
|
if (!name) return null;
|
|
|
|
name = name.replace(/^Amazon|AWS\s*|\(.*|\s+|\W+/g, '');
|
|
if (name === 'ElasticLoadBalancing') name = 'ELB';
|
|
return name;
|
|
});
|
|
|
|
property(this, 'operations', new Collection(api.operations, options, function(name, operation) {
|
|
return new Operation(name, operation, options);
|
|
}, util.string.lowerFirst));
|
|
|
|
property(this, 'shapes', new Collection(api.shapes, options, function(name, shape) {
|
|
return Shape.create(shape, options);
|
|
}));
|
|
|
|
property(this, 'paginators', new Collection(api.paginators, options, function(name, paginator) {
|
|
return new Paginator(name, paginator, options);
|
|
}));
|
|
|
|
property(this, 'waiters', new Collection(api.waiters, options, function(name, waiter) {
|
|
return new ResourceWaiter(name, waiter, options);
|
|
}, util.string.lowerFirst));
|
|
|
|
if (options.documentation) {
|
|
property(this, 'documentation', api.documentation);
|
|
property(this, 'documentationUrl', api.documentationUrl);
|
|
}
|
|
}
|
|
|
|
module.exports = Api;
|
|
|
|
},{"../util":72,"./collection":38,"./operation":39,"./paginator":40,"./resource_waiter":41,"./shape":42}],38:[function(require,module,exports){
|
|
var memoizedProperty = require('../util').memoizedProperty;
|
|
|
|
function memoize(name, value, fn, nameTr) {
|
|
memoizedProperty(this, nameTr(name), function() {
|
|
return fn(name, value);
|
|
});
|
|
}
|
|
|
|
function Collection(iterable, options, fn, nameTr) {
|
|
nameTr = nameTr || String;
|
|
var self = this;
|
|
|
|
for (var id in iterable) {
|
|
if (Object.prototype.hasOwnProperty.call(iterable, id)) {
|
|
memoize.call(self, id, iterable[id], fn, nameTr);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = Collection;
|
|
|
|
},{"../util":72}],39:[function(require,module,exports){
|
|
var Shape = require('./shape');
|
|
|
|
var util = require('../util');
|
|
var property = util.property;
|
|
var memoizedProperty = util.memoizedProperty;
|
|
|
|
function Operation(name, operation, options) {
|
|
var self = this;
|
|
options = options || {};
|
|
|
|
property(this, 'name', operation.name || name);
|
|
property(this, 'api', options.api, false);
|
|
|
|
operation.http = operation.http || {};
|
|
property(this, 'httpMethod', operation.http.method || 'POST');
|
|
property(this, 'httpPath', operation.http.requestUri || '/');
|
|
property(this, 'authtype', operation.authtype || '');
|
|
|
|
memoizedProperty(this, 'input', function() {
|
|
if (!operation.input) {
|
|
return new Shape.create({type: 'structure'}, options);
|
|
}
|
|
return Shape.create(operation.input, options);
|
|
});
|
|
|
|
memoizedProperty(this, 'output', function() {
|
|
if (!operation.output) {
|
|
return new Shape.create({type: 'structure'}, options);
|
|
}
|
|
return Shape.create(operation.output, options);
|
|
});
|
|
|
|
memoizedProperty(this, 'errors', function() {
|
|
var list = [];
|
|
if (!operation.errors) return null;
|
|
|
|
for (var i = 0; i < operation.errors.length; i++) {
|
|
list.push(Shape.create(operation.errors[i], options));
|
|
}
|
|
|
|
return list;
|
|
});
|
|
|
|
memoizedProperty(this, 'paginator', function() {
|
|
return options.api.paginators[name];
|
|
});
|
|
|
|
if (options.documentation) {
|
|
property(this, 'documentation', operation.documentation);
|
|
property(this, 'documentationUrl', operation.documentationUrl);
|
|
}
|
|
|
|
memoizedProperty(this, 'idempotentMembers', function() {
|
|
var idempotentMembers = [];
|
|
var input = self.input;
|
|
var members = input.members;
|
|
if (!input.members) {
|
|
return idempotentMembers;
|
|
}
|
|
for (var name in members) {
|
|
if (!members.hasOwnProperty(name)) {
|
|
continue;
|
|
}
|
|
if (members[name].isIdempotent === true) {
|
|
idempotentMembers.push(name);
|
|
}
|
|
}
|
|
return idempotentMembers;
|
|
});
|
|
|
|
}
|
|
|
|
module.exports = Operation;
|
|
|
|
},{"../util":72,"./shape":42}],40:[function(require,module,exports){
|
|
var property = require('../util').property;
|
|
|
|
function Paginator(name, paginator) {
|
|
property(this, 'inputToken', paginator.input_token);
|
|
property(this, 'limitKey', paginator.limit_key);
|
|
property(this, 'moreResults', paginator.more_results);
|
|
property(this, 'outputToken', paginator.output_token);
|
|
property(this, 'resultKey', paginator.result_key);
|
|
}
|
|
|
|
module.exports = Paginator;
|
|
|
|
},{"../util":72}],41:[function(require,module,exports){
|
|
var util = require('../util');
|
|
var property = util.property;
|
|
|
|
function ResourceWaiter(name, waiter, options) {
|
|
options = options || {};
|
|
property(this, 'name', name);
|
|
property(this, 'api', options.api, false);
|
|
|
|
if (waiter.operation) {
|
|
property(this, 'operation', util.string.lowerFirst(waiter.operation));
|
|
}
|
|
|
|
var self = this;
|
|
var keys = [
|
|
'type',
|
|
'description',
|
|
'delay',
|
|
'maxAttempts',
|
|
'acceptors'
|
|
];
|
|
|
|
keys.forEach(function(key) {
|
|
var value = waiter[key];
|
|
if (value) {
|
|
property(self, key, value);
|
|
}
|
|
});
|
|
}
|
|
|
|
module.exports = ResourceWaiter;
|
|
|
|
},{"../util":72}],42:[function(require,module,exports){
|
|
var Collection = require('./collection');
|
|
|
|
var util = require('../util');
|
|
|
|
function property(obj, name, value) {
|
|
if (value !== null && value !== undefined) {
|
|
util.property.apply(this, arguments);
|
|
}
|
|
}
|
|
|
|
function memoizedProperty(obj, name) {
|
|
if (!obj.constructor.prototype[name]) {
|
|
util.memoizedProperty.apply(this, arguments);
|
|
}
|
|
}
|
|
|
|
function Shape(shape, options, memberName) {
|
|
options = options || {};
|
|
|
|
property(this, 'shape', shape.shape);
|
|
property(this, 'api', options.api, false);
|
|
property(this, 'type', shape.type);
|
|
property(this, 'enum', shape.enum);
|
|
property(this, 'min', shape.min);
|
|
property(this, 'max', shape.max);
|
|
property(this, 'pattern', shape.pattern);
|
|
property(this, 'location', shape.location || this.location || 'body');
|
|
property(this, 'name', this.name || shape.xmlName || shape.queryName ||
|
|
shape.locationName || memberName);
|
|
property(this, 'isStreaming', shape.streaming || this.isStreaming || false);
|
|
property(this, 'isComposite', shape.isComposite || false);
|
|
property(this, 'isShape', true, false);
|
|
property(this, 'isQueryName', shape.queryName ? true : false, false);
|
|
property(this, 'isLocationName', shape.locationName ? true : false, false);
|
|
property(this, 'isIdempotent', shape.idempotencyToken === true);
|
|
property(this, 'isNullable', shape.nullable || this.isNullable || false);
|
|
|
|
if (options.documentation) {
|
|
property(this, 'documentation', shape.documentation);
|
|
property(this, 'documentationUrl', shape.documentationUrl);
|
|
}
|
|
|
|
if (shape.xmlAttribute) {
|
|
property(this, 'isXmlAttribute', shape.xmlAttribute || false);
|
|
}
|
|
|
|
property(this, 'defaultValue', null);
|
|
this.toWireFormat = function(value) {
|
|
if (value === undefined) return '';
|
|
if (value === null && !this.isNullable) return '';
|
|
return value;
|
|
};
|
|
this.toType = function(value) { return value; };
|
|
}
|
|
|
|
|
|
Shape.normalizedTypes = {
|
|
character: 'string',
|
|
double: 'float',
|
|
long: 'integer',
|
|
short: 'integer',
|
|
biginteger: 'integer',
|
|
bigdecimal: 'float',
|
|
blob: 'binary'
|
|
};
|
|
|
|
|
|
Shape.types = {
|
|
'structure': StructureShape,
|
|
'list': ListShape,
|
|
'map': MapShape,
|
|
'boolean': BooleanShape,
|
|
'timestamp': TimestampShape,
|
|
'float': FloatShape,
|
|
'integer': IntegerShape,
|
|
'string': StringShape,
|
|
'base64': Base64Shape,
|
|
'binary': BinaryShape,
|
|
'object': ObjectShape
|
|
};
|
|
|
|
Shape.resolve = function resolve(shape, options) {
|
|
if (shape.shape) {
|
|
var refShape = options.api.shapes[shape.shape];
|
|
if (!refShape) {
|
|
throw new Error('Cannot find shape reference: ' + shape.shape);
|
|
}
|
|
|
|
return refShape;
|
|
} else {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
Shape.create = function create(shape, options, memberName) {
|
|
if (shape.isShape) return shape;
|
|
|
|
var refShape = Shape.resolve(shape, options);
|
|
if (refShape) {
|
|
var filteredKeys = Object.keys(shape);
|
|
if (!options.documentation) {
|
|
filteredKeys = filteredKeys.filter(function(name) {
|
|
return !name.match(/documentation/);
|
|
});
|
|
}
|
|
if (filteredKeys === ['shape']) { // no inline customizations
|
|
return refShape;
|
|
}
|
|
|
|
var InlineShape = function() {
|
|
refShape.constructor.call(this, shape, options, memberName);
|
|
};
|
|
InlineShape.prototype = refShape;
|
|
return new InlineShape();
|
|
} else {
|
|
if (!shape.type) {
|
|
if (shape.members) shape.type = 'structure';
|
|
else if (shape.member) shape.type = 'list';
|
|
else if (shape.key) shape.type = 'map';
|
|
else shape.type = 'string';
|
|
}
|
|
|
|
var origType = shape.type;
|
|
if (Shape.normalizedTypes[shape.type]) {
|
|
shape.type = Shape.normalizedTypes[shape.type];
|
|
}
|
|
|
|
if (Shape.types[shape.type]) {
|
|
return new Shape.types[shape.type](shape, options, memberName);
|
|
} else {
|
|
throw new Error('Unrecognized shape type: ' + origType);
|
|
}
|
|
}
|
|
};
|
|
|
|
function CompositeShape(shape) {
|
|
Shape.apply(this, arguments);
|
|
property(this, 'isComposite', true);
|
|
|
|
if (shape.flattened) {
|
|
property(this, 'flattened', shape.flattened || false);
|
|
}
|
|
}
|
|
|
|
function StructureShape(shape, options) {
|
|
var requiredMap = null, firstInit = !this.isShape;
|
|
|
|
CompositeShape.apply(this, arguments);
|
|
|
|
if (firstInit) {
|
|
property(this, 'defaultValue', function() { return {}; });
|
|
property(this, 'members', {});
|
|
property(this, 'memberNames', []);
|
|
property(this, 'required', []);
|
|
property(this, 'isRequired', function() { return false; });
|
|
}
|
|
|
|
if (shape.members) {
|
|
property(this, 'members', new Collection(shape.members, options, function(name, member) {
|
|
return Shape.create(member, options, name);
|
|
}));
|
|
memoizedProperty(this, 'memberNames', function() {
|
|
return shape.xmlOrder || Object.keys(shape.members);
|
|
});
|
|
}
|
|
|
|
if (shape.required) {
|
|
property(this, 'required', shape.required);
|
|
property(this, 'isRequired', function(name) {
|
|
if (!requiredMap) {
|
|
requiredMap = {};
|
|
for (var i = 0; i < shape.required.length; i++) {
|
|
requiredMap[shape.required[i]] = true;
|
|
}
|
|
}
|
|
|
|
return requiredMap[name];
|
|
}, false, true);
|
|
}
|
|
|
|
property(this, 'resultWrapper', shape.resultWrapper || null);
|
|
|
|
if (shape.payload) {
|
|
property(this, 'payload', shape.payload);
|
|
}
|
|
|
|
if (typeof shape.xmlNamespace === 'string') {
|
|
property(this, 'xmlNamespaceUri', shape.xmlNamespace);
|
|
} else if (typeof shape.xmlNamespace === 'object') {
|
|
property(this, 'xmlNamespacePrefix', shape.xmlNamespace.prefix);
|
|
property(this, 'xmlNamespaceUri', shape.xmlNamespace.uri);
|
|
}
|
|
}
|
|
|
|
function ListShape(shape, options) {
|
|
var self = this, firstInit = !this.isShape;
|
|
CompositeShape.apply(this, arguments);
|
|
|
|
if (firstInit) {
|
|
property(this, 'defaultValue', function() { return []; });
|
|
}
|
|
|
|
if (shape.member) {
|
|
memoizedProperty(this, 'member', function() {
|
|
return Shape.create(shape.member, options);
|
|
});
|
|
}
|
|
|
|
if (this.flattened) {
|
|
var oldName = this.name;
|
|
memoizedProperty(this, 'name', function() {
|
|
return self.member.name || oldName;
|
|
});
|
|
}
|
|
}
|
|
|
|
function MapShape(shape, options) {
|
|
var firstInit = !this.isShape;
|
|
CompositeShape.apply(this, arguments);
|
|
|
|
if (firstInit) {
|
|
property(this, 'defaultValue', function() { return {}; });
|
|
property(this, 'key', Shape.create({type: 'string'}, options));
|
|
property(this, 'value', Shape.create({type: 'string'}, options));
|
|
}
|
|
|
|
if (shape.key) {
|
|
memoizedProperty(this, 'key', function() {
|
|
return Shape.create(shape.key, options);
|
|
});
|
|
}
|
|
if (shape.value) {
|
|
memoizedProperty(this, 'value', function() {
|
|
return Shape.create(shape.value, options);
|
|
});
|
|
}
|
|
}
|
|
|
|
function TimestampShape(shape) {
|
|
var self = this;
|
|
Shape.apply(this, arguments);
|
|
|
|
if (this.location === 'header') {
|
|
property(this, 'timestampFormat', 'rfc822');
|
|
} else if (shape.timestampFormat) {
|
|
property(this, 'timestampFormat', shape.timestampFormat);
|
|
} else if (this.api) {
|
|
if (this.api.timestampFormat) {
|
|
property(this, 'timestampFormat', this.api.timestampFormat);
|
|
} else {
|
|
switch (this.api.protocol) {
|
|
case 'json':
|
|
case 'rest-json':
|
|
property(this, 'timestampFormat', 'unixTimestamp');
|
|
break;
|
|
case 'rest-xml':
|
|
case 'query':
|
|
case 'ec2':
|
|
property(this, 'timestampFormat', 'iso8601');
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.toType = function(value) {
|
|
if (value === null || value === undefined) return null;
|
|
if (typeof value.toUTCString === 'function') return value;
|
|
return typeof value === 'string' || typeof value === 'number' ?
|
|
util.date.parseTimestamp(value) : null;
|
|
};
|
|
|
|
this.toWireFormat = function(value) {
|
|
return util.date.format(value, self.timestampFormat);
|
|
};
|
|
}
|
|
|
|
function StringShape() {
|
|
Shape.apply(this, arguments);
|
|
|
|
if (this.api) {
|
|
switch (this.api.protocol) {
|
|
case 'rest-xml':
|
|
case 'query':
|
|
case 'ec2':
|
|
this.toType = function(value) { return value || ''; };
|
|
}
|
|
}
|
|
}
|
|
|
|
function FloatShape() {
|
|
Shape.apply(this, arguments);
|
|
|
|
this.toType = function(value) {
|
|
if (value === null || value === undefined) return null;
|
|
return parseFloat(value);
|
|
};
|
|
this.toWireFormat = this.toType;
|
|
}
|
|
|
|
function IntegerShape() {
|
|
Shape.apply(this, arguments);
|
|
|
|
this.toType = function(value) {
|
|
if (value === null || value === undefined) return null;
|
|
return parseInt(value, 10);
|
|
};
|
|
this.toWireFormat = this.toType;
|
|
}
|
|
|
|
function BinaryShape() {
|
|
Shape.apply(this, arguments);
|
|
this.toType = util.base64.decode;
|
|
this.toWireFormat = util.base64.encode;
|
|
}
|
|
|
|
function Base64Shape() {
|
|
BinaryShape.apply(this, arguments);
|
|
}
|
|
|
|
function BooleanShape() {
|
|
Shape.apply(this, arguments);
|
|
|
|
this.toType = function(value) {
|
|
if (typeof value === 'boolean') return value;
|
|
if (value === null || value === undefined) return null;
|
|
return value === 'true';
|
|
};
|
|
}
|
|
|
|
function ObjectShape() {
|
|
Shape.apply(this, arguments);
|
|
|
|
this.toType = function (value) {
|
|
if (value === null || value === undefined) return null;
|
|
return value;
|
|
};
|
|
this.toWireFormat = this.toType;
|
|
}
|
|
|
|
|
|
Shape.shapes = {
|
|
StructureShape: StructureShape,
|
|
ListShape: ListShape,
|
|
MapShape: MapShape,
|
|
StringShape: StringShape,
|
|
BooleanShape: BooleanShape,
|
|
Base64Shape: Base64Shape
|
|
};
|
|
|
|
module.exports = Shape;
|
|
|
|
},{"../util":72,"./collection":38}],43:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
|
|
|
|
AWS.ParamValidator = AWS.util.inherit({
|
|
|
|
constructor: function ParamValidator(validation) {
|
|
if (validation === true || validation === undefined) {
|
|
validation = {'min': true};
|
|
}
|
|
this.validation = validation;
|
|
},
|
|
|
|
validate: function validate(shape, params, context) {
|
|
this.errors = [];
|
|
this.validateMember(shape, params || {}, context || 'params');
|
|
|
|
if (this.errors.length > 1) {
|
|
var msg = this.errors.join('\n* ');
|
|
msg = 'There were ' + this.errors.length +
|
|
' validation errors:\n* ' + msg;
|
|
throw AWS.util.error(new Error(msg),
|
|
{code: 'MultipleValidationErrors', errors: this.errors});
|
|
} else if (this.errors.length === 1) {
|
|
throw this.errors[0];
|
|
} else {
|
|
return true;
|
|
}
|
|
},
|
|
|
|
fail: function fail(code, message) {
|
|
this.errors.push(AWS.util.error(new Error(message), {code: code}));
|
|
},
|
|
|
|
validateStructure: function validateStructure(shape, params, context) {
|
|
this.validateType(params, context, ['object'], 'structure');
|
|
|
|
var paramName;
|
|
for (var i = 0; shape.required && i < shape.required.length; i++) {
|
|
paramName = shape.required[i];
|
|
var value = params[paramName];
|
|
if (value === undefined || value === null) {
|
|
this.fail('MissingRequiredParameter',
|
|
'Missing required key \'' + paramName + '\' in ' + context);
|
|
}
|
|
}
|
|
|
|
for (paramName in params) {
|
|
if (!Object.prototype.hasOwnProperty.call(params, paramName)) continue;
|
|
|
|
var paramValue = params[paramName],
|
|
memberShape = shape.members[paramName];
|
|
|
|
if (memberShape !== undefined) {
|
|
var memberContext = [context, paramName].join('.');
|
|
this.validateMember(memberShape, paramValue, memberContext);
|
|
} else {
|
|
this.fail('UnexpectedParameter',
|
|
'Unexpected key \'' + paramName + '\' found in ' + context);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
validateMember: function validateMember(shape, param, context) {
|
|
switch (shape.type) {
|
|
case 'structure':
|
|
return this.validateStructure(shape, param, context);
|
|
case 'list':
|
|
return this.validateList(shape, param, context);
|
|
case 'map':
|
|
return this.validateMap(shape, param, context);
|
|
default:
|
|
return this.validateScalar(shape, param, context);
|
|
}
|
|
},
|
|
|
|
validateList: function validateList(shape, params, context) {
|
|
if (this.validateType(params, context, [Array])) {
|
|
this.validateRange(shape, params.length, context, 'list member count');
|
|
for (var i = 0; i < params.length; i++) {
|
|
this.validateMember(shape.member, params[i], context + '[' + i + ']');
|
|
}
|
|
}
|
|
},
|
|
|
|
validateMap: function validateMap(shape, params, context) {
|
|
if (this.validateType(params, context, ['object'], 'map')) {
|
|
var mapCount = 0;
|
|
for (var param in params) {
|
|
if (!Object.prototype.hasOwnProperty.call(params, param)) continue;
|
|
this.validateMember(shape.key, param,
|
|
context + '[key=\'' + param + '\']')
|
|
this.validateMember(shape.value, params[param],
|
|
context + '[\'' + param + '\']');
|
|
mapCount++;
|
|
}
|
|
this.validateRange(shape, mapCount, context, 'map member count');
|
|
}
|
|
},
|
|
|
|
validateScalar: function validateScalar(shape, value, context) {
|
|
switch (shape.type) {
|
|
case null:
|
|
case undefined:
|
|
case 'string':
|
|
return this.validateString(shape, value, context);
|
|
case 'base64':
|
|
case 'binary':
|
|
return this.validatePayload(value, context);
|
|
case 'integer':
|
|
case 'float':
|
|
return this.validateNumber(shape, value, context);
|
|
case 'boolean':
|
|
return this.validateType(value, context, ['boolean']);
|
|
case 'object':
|
|
return this.validateType(value, context, ['object']);
|
|
case 'timestamp':
|
|
return this.validateType(value, context, [Date,
|
|
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/, 'number'],
|
|
'Date object, ISO-8601 string, or a UNIX timestamp');
|
|
default:
|
|
return this.fail('UnkownType', 'Unhandled type ' +
|
|
shape.type + ' for ' + context);
|
|
}
|
|
},
|
|
|
|
validateString: function validateString(shape, value, context) {
|
|
if (this.validateType(value, context, ['string'])) {
|
|
this.validateEnum(shape, value, context);
|
|
this.validateRange(shape, value.length, context, 'string length');
|
|
this.validatePattern(shape, value, context);
|
|
}
|
|
},
|
|
|
|
validatePattern: function validatePattern(shape, value, context) {
|
|
if (this.validation['pattern'] && shape['pattern'] !== undefined) {
|
|
if (!(new RegExp(shape['pattern'])).test(value)) {
|
|
this.fail('PatternMatchError', 'Provided value "' + value + '" '
|
|
+ 'does not match regex pattern /' + shape['pattern'] + '/ for '
|
|
+ context);
|
|
}
|
|
}
|
|
},
|
|
|
|
validateRange: function validateRange(shape, value, context, descriptor) {
|
|
if (this.validation['min']) {
|
|
if (shape['min'] !== undefined && value < shape['min']) {
|
|
this.fail('MinRangeError', 'Expected ' + descriptor + ' >= '
|
|
+ shape['min'] + ', but found ' + value + ' for ' + context);
|
|
}
|
|
}
|
|
if (this.validation['max']) {
|
|
if (shape['max'] !== undefined && value > shape['max']) {
|
|
this.fail('MaxRangeError', 'Expected ' + descriptor + ' <= '
|
|
+ shape['max'] + ', but found ' + value + ' for ' + context);
|
|
}
|
|
}
|
|
},
|
|
|
|
validateEnum: function validateRange(shape, value, context) {
|
|
if (this.validation['enum'] && shape['enum'] !== undefined) {
|
|
if (shape['enum'].indexOf(value) === -1) {
|
|
this.fail('EnumError', 'Found string value of ' + value + ', but '
|
|
+ 'expected ' + shape['enum'].join('|') + ' for ' + context);
|
|
}
|
|
}
|
|
},
|
|
|
|
validateType: function validateType(value, context, acceptedTypes, type) {
|
|
if (value === null || value === undefined) return false;
|
|
|
|
var foundInvalidType = false;
|
|
for (var i = 0; i < acceptedTypes.length; i++) {
|
|
if (typeof acceptedTypes[i] === 'string') {
|
|
if (typeof value === acceptedTypes[i]) return true;
|
|
} else if (acceptedTypes[i] instanceof RegExp) {
|
|
if ((value || '').toString().match(acceptedTypes[i])) return true;
|
|
} else {
|
|
if (value instanceof acceptedTypes[i]) return true;
|
|
if (AWS.util.isType(value, acceptedTypes[i])) return true;
|
|
if (!type && !foundInvalidType) acceptedTypes = acceptedTypes.slice();
|
|
acceptedTypes[i] = AWS.util.typeName(acceptedTypes[i]);
|
|
}
|
|
foundInvalidType = true;
|
|
}
|
|
|
|
var acceptedType = type;
|
|
if (!acceptedType) {
|
|
acceptedType = acceptedTypes.join(', ').replace(/,([^,]+)$/, ', or$1');
|
|
}
|
|
|
|
var vowel = acceptedType.match(/^[aeiou]/i) ? 'n' : '';
|
|
this.fail('InvalidParameterType', 'Expected ' + context + ' to be a' +
|
|
vowel + ' ' + acceptedType);
|
|
return false;
|
|
},
|
|
|
|
validateNumber: function validateNumber(shape, value, context) {
|
|
if (value === null || value === undefined) return;
|
|
if (typeof value === 'string') {
|
|
var castedValue = parseFloat(value);
|
|
if (castedValue.toString() === value) value = castedValue;
|
|
}
|
|
if (this.validateType(value, context, ['number'])) {
|
|
this.validateRange(shape, value, context, 'numeric value');
|
|
}
|
|
},
|
|
|
|
validatePayload: function validatePayload(value, context) {
|
|
if (value === null || value === undefined) return;
|
|
if (typeof value === 'string') return;
|
|
if (value && typeof value.byteLength === 'number') return; // typed arrays
|
|
if (AWS.util.isNode()) { // special check for buffer/stream in Node.js
|
|
var Stream = AWS.util.stream.Stream;
|
|
if (AWS.util.Buffer.isBuffer(value) || value instanceof Stream) return;
|
|
}
|
|
|
|
var types = ['Buffer', 'Stream', 'File', 'Blob', 'ArrayBuffer', 'DataView'];
|
|
if (value) {
|
|
for (var i = 0; i < types.length; i++) {
|
|
if (AWS.util.isType(value, types[i])) return;
|
|
if (AWS.util.typeName(value.constructor) === types[i]) return;
|
|
}
|
|
}
|
|
|
|
this.fail('InvalidParameterType', 'Expected ' + context + ' to be a ' +
|
|
'string, Buffer, Stream, Blob, or typed array object');
|
|
}
|
|
});
|
|
|
|
},{"./core":29}],44:[function(require,module,exports){
|
|
var util = require('../util');
|
|
var JsonBuilder = require('../json/builder');
|
|
var JsonParser = require('../json/parser');
|
|
|
|
function populateHeaders(req) {
|
|
var operation = req.service.api.operations[req.operation];
|
|
util.each(operation.input.members, function (name, member) {
|
|
var value = req.params[name];
|
|
if (value === null || value === undefined) return;
|
|
|
|
if (member.location === 'headers' && member.type === 'map') {
|
|
util.each(value, function(key, memberValue) {
|
|
req.httpRequest.headers[member.name + key] = memberValue;
|
|
});
|
|
} else if (member.location === 'header') {
|
|
value = member.toWireFormat(value).toString();
|
|
req.httpRequest.headers[member.name] = value;
|
|
}
|
|
});
|
|
}
|
|
|
|
function populateBody(req) {
|
|
var builder = new JsonBuilder();
|
|
var input = req.service.api.operations[req.operation].input;
|
|
|
|
if (input.payload) {
|
|
var params = {};
|
|
var payloadShape = input.members[input.payload];
|
|
params = req.params[input.payload];
|
|
if (params === undefined) return;
|
|
|
|
if (payloadShape.type === 'structure') {
|
|
req.httpRequest.headers['Content-Type'] = 'application/json';
|
|
req.httpRequest.body = builder.build(params, payloadShape);
|
|
} else { // non-JSON payload
|
|
req.httpRequest.body = params;
|
|
}
|
|
} else {
|
|
req.httpRequest.headers['Content-Type'] = 'application/json';
|
|
req.httpRequest.body = builder.build(req.params, input);
|
|
}
|
|
}
|
|
|
|
function buildRequest(req) {
|
|
var httpRequest = req.httpRequest;
|
|
var target = req.service.api.targetPrefix + '.' + req.service.api.operations[req.operation].name;
|
|
populateHeaders(req);
|
|
populateBody(req);
|
|
httpRequest.headers['X-Amz-Target'] = target;
|
|
}
|
|
|
|
function extractError(resp) {
|
|
var error = {};
|
|
var httpResponse = resp.httpResponse;
|
|
|
|
error.code = httpResponse.headers['x-amzn-errortype'] || 'UnknownError';
|
|
if (typeof error.code === 'string') {
|
|
error.code = error.code.split(':')[0];
|
|
}
|
|
|
|
if (httpResponse.body.length > 0) {
|
|
var e = JSON.parse(httpResponse.body.toString());
|
|
if (e.__type || e.code || e.error) {
|
|
error.code = (e.__type || e.code || e.error).split('#').pop();
|
|
}
|
|
if (error.code === 'RequestEntityTooLarge') {
|
|
error.message = 'Request body must be less than 1 MB';
|
|
} else {
|
|
error.message = (e.message || e.Message || null);
|
|
}
|
|
} else {
|
|
error.statusCode = httpResponse.statusCode;
|
|
error.message = httpResponse.statusCode.toString();
|
|
}
|
|
|
|
resp.error = util.error(new Error(), error);
|
|
}
|
|
|
|
function extractData(resp) {
|
|
var body = resp.httpResponse.body.toString() || '{}';
|
|
if (resp.request.service.config.convertResponseTypes === false) {
|
|
resp.data = JSON.parse(body);
|
|
} else {
|
|
var operation = resp.request.service.api.operations[resp.request.operation];
|
|
var shape = operation.output || {};
|
|
var parser = new JsonParser();
|
|
resp.data = parser.parse(body, shape);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
buildRequest: buildRequest,
|
|
extractError: extractError,
|
|
extractData: extractData
|
|
};
|
|
|
|
},{"../json/builder":35,"../json/parser":36,"../util":72}],45:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var util = require('../util');
|
|
var QueryParamSerializer = require('../query/query_param_serializer');
|
|
var Shape = require('../model/shape');
|
|
|
|
function buildRequest(req) {
|
|
var operation = req.service.api.operations[req.operation];
|
|
var httpRequest = req.httpRequest;
|
|
httpRequest.headers['Content-Type'] =
|
|
'application/x-www-form-urlencoded; charset=utf-8';
|
|
httpRequest.params = {
|
|
Version: req.service.api.apiVersion,
|
|
Action: operation.name
|
|
};
|
|
|
|
var builder = new QueryParamSerializer();
|
|
builder.serialize(req.params, operation.input, function(name, value) {
|
|
httpRequest.params[name] = value;
|
|
});
|
|
httpRequest.body = util.queryParamsToString(httpRequest.params);
|
|
}
|
|
|
|
function extractError(resp) {
|
|
var data, body = resp.httpResponse.body.toString();
|
|
if (body.match('<UnknownOperationException')) {
|
|
data = {
|
|
Code: 'UnknownOperation',
|
|
Message: 'Unknown operation ' + resp.request.operation
|
|
};
|
|
} else {
|
|
data = new AWS.XML.Parser().parse(body);
|
|
}
|
|
|
|
if (data.requestId && !resp.requestId) resp.requestId = data.requestId;
|
|
if (data.Errors) data = data.Errors;
|
|
if (data.Error) data = data.Error;
|
|
if (data.Code) {
|
|
resp.error = util.error(new Error(), {
|
|
code: data.Code,
|
|
message: data.Message
|
|
});
|
|
} else {
|
|
resp.error = util.error(new Error(), {
|
|
code: resp.httpResponse.statusCode,
|
|
message: null
|
|
});
|
|
}
|
|
}
|
|
|
|
function extractData(resp) {
|
|
var req = resp.request;
|
|
var operation = req.service.api.operations[req.operation];
|
|
var shape = operation.output || {};
|
|
var origRules = shape;
|
|
|
|
if (origRules.resultWrapper) {
|
|
var tmp = Shape.create({type: 'structure'});
|
|
tmp.members[origRules.resultWrapper] = shape;
|
|
tmp.memberNames = [origRules.resultWrapper];
|
|
util.property(shape, 'name', shape.resultWrapper);
|
|
shape = tmp;
|
|
}
|
|
|
|
var parser = new AWS.XML.Parser();
|
|
|
|
if (shape && shape.members && !shape.members._XAMZRequestId) {
|
|
var requestIdShape = Shape.create(
|
|
{ type: 'string' },
|
|
{ api: { protocol: 'query' } },
|
|
'requestId'
|
|
);
|
|
shape.members._XAMZRequestId = requestIdShape;
|
|
}
|
|
|
|
var data = parser.parse(resp.httpResponse.body.toString(), shape);
|
|
resp.requestId = data._XAMZRequestId || data.requestId;
|
|
|
|
if (data._XAMZRequestId) delete data._XAMZRequestId;
|
|
|
|
if (origRules.resultWrapper) {
|
|
if (data[origRules.resultWrapper]) {
|
|
util.update(data, data[origRules.resultWrapper]);
|
|
delete data[origRules.resultWrapper];
|
|
}
|
|
}
|
|
|
|
resp.data = data;
|
|
}
|
|
|
|
module.exports = {
|
|
buildRequest: buildRequest,
|
|
extractError: extractError,
|
|
extractData: extractData
|
|
};
|
|
|
|
},{"../core":29,"../model/shape":42,"../query/query_param_serializer":49,"../util":72}],46:[function(require,module,exports){
|
|
var util = require('../util');
|
|
|
|
function populateMethod(req) {
|
|
req.httpRequest.method = req.service.api.operations[req.operation].httpMethod;
|
|
}
|
|
|
|
function generateURI(endpointPath, operationPath, input, params) {
|
|
var uri = [endpointPath, operationPath].join('/');
|
|
uri = uri.replace(/\/+/g, '/');
|
|
|
|
var queryString = {}, queryStringSet = false;
|
|
util.each(input.members, function (name, member) {
|
|
var paramValue = params[name];
|
|
if (paramValue === null || paramValue === undefined) return;
|
|
if (member.location === 'uri') {
|
|
var regex = new RegExp('\\{' + member.name + '(\\+)?\\}');
|
|
uri = uri.replace(regex, function(_, plus) {
|
|
var fn = plus ? util.uriEscapePath : util.uriEscape;
|
|
return fn(String(paramValue));
|
|
});
|
|
} else if (member.location === 'querystring') {
|
|
queryStringSet = true;
|
|
|
|
if (member.type === 'list') {
|
|
queryString[member.name] = paramValue.map(function(val) {
|
|
return util.uriEscape(String(val));
|
|
});
|
|
} else if (member.type === 'map') {
|
|
util.each(paramValue, function(key, value) {
|
|
if (Array.isArray(value)) {
|
|
queryString[key] = value.map(function(val) {
|
|
return util.uriEscape(String(val));
|
|
});
|
|
} else {
|
|
queryString[key] = util.uriEscape(String(value));
|
|
}
|
|
});
|
|
} else {
|
|
queryString[member.name] = util.uriEscape(String(paramValue));
|
|
}
|
|
}
|
|
});
|
|
|
|
if (queryStringSet) {
|
|
uri += (uri.indexOf('?') >= 0 ? '&' : '?');
|
|
var parts = [];
|
|
util.arrayEach(Object.keys(queryString).sort(), function(key) {
|
|
if (!Array.isArray(queryString[key])) {
|
|
queryString[key] = [queryString[key]];
|
|
}
|
|
for (var i = 0; i < queryString[key].length; i++) {
|
|
parts.push(util.uriEscape(String(key)) + '=' + queryString[key][i]);
|
|
}
|
|
});
|
|
uri += parts.join('&');
|
|
}
|
|
|
|
return uri;
|
|
}
|
|
|
|
function populateURI(req) {
|
|
var operation = req.service.api.operations[req.operation];
|
|
var input = operation.input;
|
|
|
|
var uri = generateURI(req.httpRequest.endpoint.path, operation.httpPath, input, req.params);
|
|
req.httpRequest.path = uri;
|
|
}
|
|
|
|
function populateHeaders(req) {
|
|
var operation = req.service.api.operations[req.operation];
|
|
util.each(operation.input.members, function (name, member) {
|
|
var value = req.params[name];
|
|
if (value === null || value === undefined) return;
|
|
|
|
if (member.location === 'headers' && member.type === 'map') {
|
|
util.each(value, function(key, memberValue) {
|
|
req.httpRequest.headers[member.name + key] = memberValue;
|
|
});
|
|
} else if (member.location === 'header') {
|
|
value = member.toWireFormat(value).toString();
|
|
req.httpRequest.headers[member.name] = value;
|
|
}
|
|
});
|
|
}
|
|
|
|
function buildRequest(req) {
|
|
populateMethod(req);
|
|
populateURI(req);
|
|
populateHeaders(req);
|
|
}
|
|
|
|
function extractError() {
|
|
}
|
|
|
|
function extractData(resp) {
|
|
var req = resp.request;
|
|
var data = {};
|
|
var r = resp.httpResponse;
|
|
var operation = req.service.api.operations[req.operation];
|
|
var output = operation.output;
|
|
|
|
var headers = {};
|
|
util.each(r.headers, function (k, v) {
|
|
headers[k.toLowerCase()] = v;
|
|
});
|
|
|
|
util.each(output.members, function(name, member) {
|
|
var header = (member.name || name).toLowerCase();
|
|
if (member.location === 'headers' && member.type === 'map') {
|
|
data[name] = {};
|
|
var location = member.isLocationName ? member.name : '';
|
|
var pattern = new RegExp('^' + location + '(.+)', 'i');
|
|
util.each(r.headers, function (k, v) {
|
|
var result = k.match(pattern);
|
|
if (result !== null) {
|
|
data[name][result[1]] = v;
|
|
}
|
|
});
|
|
} else if (member.location === 'header') {
|
|
if (headers[header] !== undefined) {
|
|
data[name] = headers[header];
|
|
}
|
|
} else if (member.location === 'statusCode') {
|
|
data[name] = parseInt(r.statusCode, 10);
|
|
}
|
|
});
|
|
|
|
resp.data = data;
|
|
}
|
|
|
|
module.exports = {
|
|
buildRequest: buildRequest,
|
|
extractError: extractError,
|
|
extractData: extractData,
|
|
generateURI: generateURI
|
|
};
|
|
|
|
},{"../util":72}],47:[function(require,module,exports){
|
|
var util = require('../util');
|
|
var Rest = require('./rest');
|
|
var Json = require('./json');
|
|
var JsonBuilder = require('../json/builder');
|
|
var JsonParser = require('../json/parser');
|
|
|
|
function populateBody(req) {
|
|
var builder = new JsonBuilder();
|
|
var input = req.service.api.operations[req.operation].input;
|
|
|
|
if (input.payload) {
|
|
var params = {};
|
|
var payloadShape = input.members[input.payload];
|
|
params = req.params[input.payload];
|
|
if (params === undefined) return;
|
|
|
|
if (payloadShape.type === 'structure') {
|
|
req.httpRequest.body = builder.build(params, payloadShape);
|
|
} else { // non-JSON payload
|
|
req.httpRequest.body = params;
|
|
}
|
|
} else {
|
|
req.httpRequest.body = builder.build(req.params, input);
|
|
}
|
|
}
|
|
|
|
function buildRequest(req) {
|
|
Rest.buildRequest(req);
|
|
|
|
if (['GET', 'HEAD', 'DELETE'].indexOf(req.httpRequest.method) < 0) {
|
|
populateBody(req);
|
|
}
|
|
}
|
|
|
|
function extractError(resp) {
|
|
Json.extractError(resp);
|
|
}
|
|
|
|
function extractData(resp) {
|
|
Rest.extractData(resp);
|
|
|
|
var req = resp.request;
|
|
var rules = req.service.api.operations[req.operation].output || {};
|
|
if (rules.payload) {
|
|
var payloadMember = rules.members[rules.payload];
|
|
var body = resp.httpResponse.body;
|
|
if (payloadMember.isStreaming) {
|
|
resp.data[rules.payload] = body;
|
|
} else if (payloadMember.type === 'structure' || payloadMember.type === 'list') {
|
|
var parser = new JsonParser();
|
|
resp.data[rules.payload] = parser.parse(body, payloadMember);
|
|
} else {
|
|
resp.data[rules.payload] = body.toString();
|
|
}
|
|
} else {
|
|
var data = resp.data;
|
|
Json.extractData(resp);
|
|
resp.data = util.merge(data, resp.data);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
buildRequest: buildRequest,
|
|
extractError: extractError,
|
|
extractData: extractData
|
|
};
|
|
|
|
},{"../json/builder":35,"../json/parser":36,"../util":72,"./json":44,"./rest":46}],48:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var util = require('../util');
|
|
var Rest = require('./rest');
|
|
|
|
function populateBody(req) {
|
|
var input = req.service.api.operations[req.operation].input;
|
|
var builder = new AWS.XML.Builder();
|
|
var params = req.params;
|
|
|
|
var payload = input.payload;
|
|
if (payload) {
|
|
var payloadMember = input.members[payload];
|
|
params = params[payload];
|
|
if (params === undefined) return;
|
|
|
|
if (payloadMember.type === 'structure') {
|
|
var rootElement = payloadMember.name;
|
|
req.httpRequest.body = builder.toXML(params, payloadMember, rootElement, true);
|
|
} else { // non-xml payload
|
|
req.httpRequest.body = params;
|
|
}
|
|
} else {
|
|
req.httpRequest.body = builder.toXML(params, input, input.name ||
|
|
input.shape || util.string.upperFirst(req.operation) + 'Request');
|
|
}
|
|
}
|
|
|
|
function buildRequest(req) {
|
|
Rest.buildRequest(req);
|
|
|
|
if (['GET', 'HEAD'].indexOf(req.httpRequest.method) < 0) {
|
|
populateBody(req);
|
|
}
|
|
}
|
|
|
|
function extractError(resp) {
|
|
Rest.extractError(resp);
|
|
|
|
var data = new AWS.XML.Parser().parse(resp.httpResponse.body.toString());
|
|
if (data.Errors) data = data.Errors;
|
|
if (data.Error) data = data.Error;
|
|
if (data.Code) {
|
|
resp.error = util.error(new Error(), {
|
|
code: data.Code,
|
|
message: data.Message
|
|
});
|
|
} else {
|
|
resp.error = util.error(new Error(), {
|
|
code: resp.httpResponse.statusCode,
|
|
message: null
|
|
});
|
|
}
|
|
}
|
|
|
|
function extractData(resp) {
|
|
Rest.extractData(resp);
|
|
|
|
var parser;
|
|
var req = resp.request;
|
|
var body = resp.httpResponse.body;
|
|
var operation = req.service.api.operations[req.operation];
|
|
var output = operation.output;
|
|
|
|
var payload = output.payload;
|
|
if (payload) {
|
|
var payloadMember = output.members[payload];
|
|
if (payloadMember.isStreaming) {
|
|
resp.data[payload] = body;
|
|
} else if (payloadMember.type === 'structure') {
|
|
parser = new AWS.XML.Parser();
|
|
resp.data[payload] = parser.parse(body.toString(), payloadMember);
|
|
} else {
|
|
resp.data[payload] = body.toString();
|
|
}
|
|
} else if (body.length > 0) {
|
|
parser = new AWS.XML.Parser();
|
|
var data = parser.parse(body.toString(), output);
|
|
util.update(resp.data, data);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
buildRequest: buildRequest,
|
|
extractError: extractError,
|
|
extractData: extractData
|
|
};
|
|
|
|
},{"../core":29,"../util":72,"./rest":46}],49:[function(require,module,exports){
|
|
var util = require('../util');
|
|
|
|
function QueryParamSerializer() {
|
|
}
|
|
|
|
QueryParamSerializer.prototype.serialize = function(params, shape, fn) {
|
|
serializeStructure('', params, shape, fn);
|
|
};
|
|
|
|
function ucfirst(shape) {
|
|
if (shape.isQueryName || shape.api.protocol !== 'ec2') {
|
|
return shape.name;
|
|
} else {
|
|
return shape.name[0].toUpperCase() + shape.name.substr(1);
|
|
}
|
|
}
|
|
|
|
function serializeStructure(prefix, struct, rules, fn) {
|
|
util.each(rules.members, function(name, member) {
|
|
var value = struct[name];
|
|
if (value === null || value === undefined) return;
|
|
|
|
var memberName = ucfirst(member);
|
|
memberName = prefix ? prefix + '.' + memberName : memberName;
|
|
serializeMember(memberName, value, member, fn);
|
|
});
|
|
}
|
|
|
|
function serializeMap(name, map, rules, fn) {
|
|
var i = 1;
|
|
util.each(map, function (key, value) {
|
|
var prefix = rules.flattened ? '.' : '.entry.';
|
|
var position = prefix + (i++) + '.';
|
|
var keyName = position + (rules.key.name || 'key');
|
|
var valueName = position + (rules.value.name || 'value');
|
|
serializeMember(name + keyName, key, rules.key, fn);
|
|
serializeMember(name + valueName, value, rules.value, fn);
|
|
});
|
|
}
|
|
|
|
function serializeList(name, list, rules, fn) {
|
|
var memberRules = rules.member || {};
|
|
|
|
if (list.length === 0) {
|
|
fn.call(this, name, null);
|
|
return;
|
|
}
|
|
|
|
util.arrayEach(list, function (v, n) {
|
|
var suffix = '.' + (n + 1);
|
|
if (rules.api.protocol === 'ec2') {
|
|
suffix = suffix + ''; // make linter happy
|
|
} else if (rules.flattened) {
|
|
if (memberRules.name) {
|
|
var parts = name.split('.');
|
|
parts.pop();
|
|
parts.push(ucfirst(memberRules));
|
|
name = parts.join('.');
|
|
}
|
|
} else {
|
|
suffix = '.member' + suffix;
|
|
}
|
|
serializeMember(name + suffix, v, memberRules, fn);
|
|
});
|
|
}
|
|
|
|
function serializeMember(name, value, rules, fn) {
|
|
if (value === null || value === undefined) return;
|
|
if (rules.type === 'structure') {
|
|
serializeStructure(name, value, rules, fn);
|
|
} else if (rules.type === 'list') {
|
|
serializeList(name, value, rules, fn);
|
|
} else if (rules.type === 'map') {
|
|
serializeMap(name, value, rules, fn);
|
|
} else {
|
|
fn(name, rules.toWireFormat(value).toString());
|
|
}
|
|
}
|
|
|
|
module.exports = QueryParamSerializer;
|
|
|
|
},{"../util":72}],50:[function(require,module,exports){
|
|
module.exports={
|
|
"rules": {
|
|
"local/*": {
|
|
"endpoint": "http://localhost:8080",
|
|
"wsendpoint": "ws://localhost:8090"
|
|
},
|
|
"internal/*": {
|
|
"endpoint": "http://security:8080",
|
|
"wsendpoint": "ws://socket:8090"
|
|
},
|
|
"mock-region/*": {
|
|
"endpoint": "{service}.{region}.api.jibo.com",
|
|
"wsendpoint": "ws://socket:8090"
|
|
},
|
|
"*/*": "globalSSL"
|
|
},
|
|
|
|
"patterns": {
|
|
"globalSSL": {
|
|
"endpoint": "https://{region}.jibo.com",
|
|
"wsendpoint": "wss://{region}-socket.jibo.com",
|
|
"globalEndpoint": true
|
|
},
|
|
"global": {
|
|
"endpoint": "http://{region}.jibo.com:8080",
|
|
"wsendpoint": "ws://{region}-socket.jibo.com:8090",
|
|
"globalEndpoint": true
|
|
}
|
|
}
|
|
}
|
|
|
|
},{}],51:[function(require,module,exports){
|
|
var util = require('./util');
|
|
var regionConfig = require('./region_config.json');
|
|
|
|
function generateRegionPrefix(region) {
|
|
if (!region) return null;
|
|
|
|
var parts = region.split('-');
|
|
if (parts.length < 3) return null;
|
|
return parts.slice(0, parts.length - 2).join('-') + '-*';
|
|
}
|
|
|
|
function derivedKeys(service) {
|
|
var region = service.config.region;
|
|
var regionPrefix = generateRegionPrefix(region);
|
|
var endpointPrefix = service.api.endpointPrefix;
|
|
|
|
return [
|
|
[region, endpointPrefix],
|
|
[regionPrefix, endpointPrefix],
|
|
[region, '*'],
|
|
[regionPrefix, '*'],
|
|
['*', endpointPrefix],
|
|
['*', '*']
|
|
].map(function(item) {
|
|
return item[0] && item[1] ? item.join('/') : null;
|
|
});
|
|
}
|
|
|
|
function applyConfig(service, config) {
|
|
util.each(config, function(key, value) {
|
|
if (key === 'globalEndpoint') return;
|
|
if (service.config[key] === undefined || service.config[key] === null) {
|
|
service.config[key] = value;
|
|
}
|
|
});
|
|
}
|
|
|
|
function configureEndpoint(service) {
|
|
var keys = derivedKeys(service);
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var key = keys[i];
|
|
if (!key) continue;
|
|
|
|
if (Object.prototype.hasOwnProperty.call(regionConfig.rules, key)) {
|
|
var config = regionConfig.rules[key];
|
|
if (typeof config === 'string') {
|
|
config = regionConfig.patterns[config];
|
|
}
|
|
|
|
if (service.config.useDualstack && util.isDualstackAvailable(service)) {
|
|
config = util.copy(config);
|
|
config.endpoint = '{service}.dualstack.{region}.amazonaws.com';
|
|
}
|
|
|
|
service.isGlobalEndpoint = !!config.globalEndpoint;
|
|
|
|
if (!config.signatureVersion) config.signatureVersion = 'v4';
|
|
|
|
applyConfig(service, config);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = configureEndpoint;
|
|
|
|
},{"./region_config.json":50,"./util":72}],52:[function(require,module,exports){
|
|
(function (process){
|
|
var AWS = require('./core');
|
|
var AcceptorStateMachine = require('./state_machine');
|
|
var inherit = AWS.util.inherit;
|
|
var domain = AWS.util.domain;
|
|
var jmespath = require('jmespath');
|
|
|
|
|
|
var hardErrorStates = {success: 1, error: 1, complete: 1};
|
|
|
|
function isTerminalState(machine) {
|
|
return Object.prototype.hasOwnProperty.call(hardErrorStates, machine._asm.currentState);
|
|
}
|
|
|
|
var fsm = new AcceptorStateMachine();
|
|
fsm.setupStates = function() {
|
|
var transition = function(_, done) {
|
|
var self = this;
|
|
self._haltHandlersOnError = false;
|
|
|
|
self.emit(self._asm.currentState, function(err) {
|
|
if (err) {
|
|
if (isTerminalState(self)) {
|
|
if (domain && self.domain instanceof domain.Domain) {
|
|
err.domainEmitter = self;
|
|
err.domain = self.domain;
|
|
err.domainThrown = false;
|
|
self.domain.emit('error', err);
|
|
} else {
|
|
throw err;
|
|
}
|
|
} else {
|
|
self.response.error = err;
|
|
done(err);
|
|
}
|
|
} else {
|
|
done(self.response.error);
|
|
}
|
|
});
|
|
|
|
};
|
|
|
|
this.addState('validate', 'build', 'error', transition);
|
|
this.addState('build', 'afterBuild', 'restart', transition);
|
|
this.addState('afterBuild', 'sign', 'restart', transition);
|
|
this.addState('sign', 'send', 'retry', transition);
|
|
this.addState('retry', 'afterRetry', 'afterRetry', transition);
|
|
this.addState('afterRetry', 'sign', 'error', transition);
|
|
this.addState('send', 'validateResponse', 'retry', transition);
|
|
this.addState('validateResponse', 'extractData', 'extractError', transition);
|
|
this.addState('extractError', 'extractData', 'retry', transition);
|
|
this.addState('extractData', 'success', 'retry', transition);
|
|
this.addState('restart', 'build', 'error', transition);
|
|
this.addState('success', 'complete', 'complete', transition);
|
|
this.addState('error', 'complete', 'complete', transition);
|
|
this.addState('complete', null, null, transition);
|
|
};
|
|
fsm.setupStates();
|
|
|
|
|
|
AWS.Request = inherit({
|
|
|
|
|
|
constructor: function Request(service, operation, params) {
|
|
var endpoint = service.endpoint;
|
|
var region = service.config.region;
|
|
var customUserAgent = service.config.customUserAgent;
|
|
|
|
if (service.isGlobalEndpoint) region = 'us-east-1';
|
|
|
|
this.domain = domain && domain.active;
|
|
this.service = service;
|
|
this.operation = operation;
|
|
this.params = params || {};
|
|
this.httpRequest = new AWS.HttpRequest(endpoint, region, customUserAgent);
|
|
this.startTime = AWS.util.date.getDate();
|
|
|
|
this.response = new AWS.Response(this);
|
|
this._asm = new AcceptorStateMachine(fsm.states, 'validate');
|
|
this._haltHandlersOnError = false;
|
|
|
|
AWS.SequentialExecutor.call(this);
|
|
this.emit = this.emitEvent;
|
|
},
|
|
|
|
|
|
|
|
|
|
send: function send(callback) {
|
|
if (callback) {
|
|
this.on('complete', function (resp) {
|
|
callback.call(resp, resp.error, resp.data);
|
|
});
|
|
}
|
|
this.runTo();
|
|
|
|
return this.response;
|
|
},
|
|
|
|
|
|
|
|
|
|
build: function build(callback) {
|
|
return this.runTo('send', callback);
|
|
},
|
|
|
|
|
|
runTo: function runTo(state, done) {
|
|
this._asm.runTo(state, done, this);
|
|
return this;
|
|
},
|
|
|
|
|
|
abort: function abort() {
|
|
this.removeAllListeners('validateResponse');
|
|
this.removeAllListeners('extractError');
|
|
this.on('validateResponse', function addAbortedError(resp) {
|
|
resp.error = AWS.util.error(new Error('Request aborted by user'), {
|
|
code: 'RequestAbortedError', retryable: false
|
|
});
|
|
});
|
|
|
|
if (this.httpRequest.stream) { // abort HTTP stream
|
|
this.httpRequest.stream.abort();
|
|
if (this.httpRequest._abortCallback) {
|
|
this.httpRequest._abortCallback();
|
|
} else {
|
|
this.removeAllListeners('send'); // haven't sent yet, so let's not
|
|
}
|
|
}
|
|
|
|
return this;
|
|
},
|
|
|
|
|
|
eachPage: function eachPage(callback) {
|
|
callback = AWS.util.fn.makeAsync(callback, 3);
|
|
|
|
function wrappedCallback(response) {
|
|
callback.call(response, response.error, response.data, function (result) {
|
|
if (result === false) return;
|
|
|
|
if (response.hasNextPage()) {
|
|
response.nextPage().on('complete', wrappedCallback).send();
|
|
} else {
|
|
callback.call(response, null, null, AWS.util.fn.noop);
|
|
}
|
|
});
|
|
}
|
|
|
|
this.on('complete', wrappedCallback).send();
|
|
},
|
|
|
|
|
|
eachItem: function eachItem(callback) {
|
|
var self = this;
|
|
function wrappedCallback(err, data) {
|
|
if (err) return callback(err, null);
|
|
if (data === null) return callback(null, null);
|
|
|
|
var config = self.service.paginationConfig(self.operation);
|
|
var resultKey = config.resultKey;
|
|
if (Array.isArray(resultKey)) resultKey = resultKey[0];
|
|
var items = jmespath.search(data, resultKey);
|
|
var continueIteration = true;
|
|
AWS.util.arrayEach(items, function(item) {
|
|
continueIteration = callback(null, item);
|
|
if (continueIteration === false) {
|
|
return AWS.util.abort;
|
|
}
|
|
});
|
|
return continueIteration;
|
|
}
|
|
|
|
this.eachPage(wrappedCallback);
|
|
},
|
|
|
|
|
|
isPageable: function isPageable() {
|
|
return this.service.paginationConfig(this.operation) ? true : false;
|
|
},
|
|
|
|
|
|
createReadStream: function createReadStream() {
|
|
var streams = AWS.util.stream;
|
|
var req = this;
|
|
var stream = null;
|
|
|
|
if (AWS.HttpClient.streamsApiVersion === 2) {
|
|
stream = new streams.PassThrough();
|
|
req.send();
|
|
} else {
|
|
stream = new streams.Stream();
|
|
stream.readable = true;
|
|
|
|
stream.sent = false;
|
|
stream.on('newListener', function(event) {
|
|
if (!stream.sent && event === 'data') {
|
|
stream.sent = true;
|
|
process.nextTick(function() { req.send(); });
|
|
}
|
|
});
|
|
}
|
|
|
|
this.on('httpHeaders', function streamHeaders(statusCode, headers, resp) {
|
|
if (statusCode < 300) {
|
|
req.removeListener('httpData', AWS.EventListeners.Core.HTTP_DATA);
|
|
req.removeListener('httpError', AWS.EventListeners.Core.HTTP_ERROR);
|
|
req.on('httpError', function streamHttpError(error) {
|
|
resp.error = error;
|
|
resp.error.retryable = false;
|
|
});
|
|
|
|
var shouldCheckContentLength = false;
|
|
var expectedLen;
|
|
if (req.httpRequest.method !== 'HEAD') {
|
|
expectedLen = parseInt(headers['content-length'], 10);
|
|
}
|
|
if (expectedLen !== undefined && !isNaN(expectedLen) && expectedLen >= 0) {
|
|
shouldCheckContentLength = true;
|
|
var receivedLen = 0;
|
|
}
|
|
|
|
var checkContentLengthAndEmit = function checkContentLengthAndEmit() {
|
|
if (shouldCheckContentLength && receivedLen !== expectedLen) {
|
|
stream.emit('error', AWS.util.error(
|
|
new Error('Stream content length mismatch. Received ' +
|
|
receivedLen + ' of ' + expectedLen + ' bytes.'),
|
|
{ code: 'StreamContentLengthMismatch' }
|
|
));
|
|
} else if (AWS.HttpClient.streamsApiVersion === 2) {
|
|
stream.end();
|
|
} else {
|
|
stream.emit('end')
|
|
}
|
|
}
|
|
|
|
var httpStream = resp.httpResponse.createUnbufferedStream();
|
|
|
|
if (AWS.HttpClient.streamsApiVersion === 2) {
|
|
if (shouldCheckContentLength) {
|
|
var lengthAccumulator = new streams.PassThrough();
|
|
lengthAccumulator._write = function(chunk) {
|
|
if (chunk && chunk.length) {
|
|
receivedLen += chunk.length;
|
|
}
|
|
return streams.PassThrough.prototype._write.apply(this, arguments);
|
|
};
|
|
|
|
lengthAccumulator.on('end', checkContentLengthAndEmit);
|
|
httpStream.pipe(lengthAccumulator).pipe(stream, { end: false });
|
|
} else {
|
|
httpStream.pipe(stream);
|
|
}
|
|
} else {
|
|
|
|
if (shouldCheckContentLength) {
|
|
httpStream.on('data', function(arg) {
|
|
if (arg && arg.length) {
|
|
receivedLen += arg.length;
|
|
}
|
|
});
|
|
}
|
|
|
|
httpStream.on('data', function(arg) {
|
|
stream.emit('data', arg);
|
|
});
|
|
httpStream.on('end', checkContentLengthAndEmit);
|
|
}
|
|
|
|
httpStream.on('error', function(err) {
|
|
shouldCheckContentLength = false;
|
|
stream.emit('error', err);
|
|
});
|
|
}
|
|
});
|
|
|
|
this.on('error', function(err) {
|
|
stream.emit('error', err);
|
|
});
|
|
|
|
return stream;
|
|
},
|
|
|
|
|
|
emitEvent: function emit(eventName, args, done) {
|
|
if (typeof args === 'function') { done = args; args = null; }
|
|
if (!done) done = function() { };
|
|
if (!args) args = this.eventParameters(eventName, this.response);
|
|
|
|
var origEmit = AWS.SequentialExecutor.prototype.emit;
|
|
origEmit.call(this, eventName, args, function (err) {
|
|
if (err) this.response.error = err;
|
|
done.call(this, err);
|
|
});
|
|
},
|
|
|
|
|
|
eventParameters: function eventParameters(eventName) {
|
|
switch (eventName) {
|
|
case 'restart':
|
|
case 'validate':
|
|
case 'sign':
|
|
case 'build':
|
|
case 'afterValidate':
|
|
case 'afterBuild':
|
|
return [this];
|
|
case 'error':
|
|
return [this.response.error, this.response];
|
|
default:
|
|
return [this.response];
|
|
}
|
|
},
|
|
|
|
|
|
presign: function presign(expires, callback) {
|
|
if (!callback && typeof expires === 'function') {
|
|
callback = expires;
|
|
expires = null;
|
|
}
|
|
return new AWS.Signers.Presign().sign(this.toGet(), expires, callback);
|
|
},
|
|
|
|
|
|
isPresigned: function isPresigned() {
|
|
return Object.prototype.hasOwnProperty.call(this.httpRequest.headers, 'presigned-expires');
|
|
},
|
|
|
|
|
|
toUnauthenticated: function toUnauthenticated() {
|
|
this.removeListener('validate', AWS.EventListeners.Core.VALIDATE_CREDENTIALS);
|
|
this.removeListener('sign', AWS.EventListeners.Core.SIGN);
|
|
return this;
|
|
},
|
|
|
|
|
|
toGet: function toGet() {
|
|
if (this.service.api.protocol === 'query' ||
|
|
this.service.api.protocol === 'ec2') {
|
|
this.removeListener('build', this.buildAsGet);
|
|
this.addListener('build', this.buildAsGet);
|
|
}
|
|
return this;
|
|
},
|
|
|
|
|
|
buildAsGet: function buildAsGet(request) {
|
|
request.httpRequest.method = 'GET';
|
|
request.httpRequest.path = request.service.endpoint.path +
|
|
'?' + request.httpRequest.body;
|
|
request.httpRequest.body = '';
|
|
|
|
delete request.httpRequest.headers['Content-Length'];
|
|
delete request.httpRequest.headers['Content-Type'];
|
|
},
|
|
|
|
|
|
haltHandlersOnError: function haltHandlersOnError() {
|
|
this._haltHandlersOnError = true;
|
|
}
|
|
});
|
|
|
|
|
|
AWS.Request.addPromisesToClass = function addPromisesToClass(PromiseDependency) {
|
|
this.prototype.promise = function promise() {
|
|
var self = this;
|
|
return new PromiseDependency(function(resolve, reject) {
|
|
self.on('complete', function(resp) {
|
|
if (resp.error) {
|
|
reject(resp.error);
|
|
} else {
|
|
resolve(resp.data);
|
|
}
|
|
});
|
|
self.runTo();
|
|
});
|
|
};
|
|
};
|
|
|
|
|
|
AWS.Request.deletePromisesFromClass = function deletePromisesFromClass() {
|
|
delete this.prototype.promise;
|
|
};
|
|
|
|
AWS.util.addPromises(AWS.Request);
|
|
|
|
AWS.util.mixin(AWS.Request, AWS.SequentialExecutor);
|
|
|
|
}).call(this,require('_process'))
|
|
},{"./core":29,"./state_machine":71,"_process":274,"jmespath":193}],53:[function(require,module,exports){
|
|
|
|
|
|
var AWS = require('./core');
|
|
var inherit = AWS.util.inherit;
|
|
var jmespath = require('jmespath');
|
|
|
|
|
|
function CHECK_ACCEPTORS(resp) {
|
|
var waiter = resp.request._waiter;
|
|
var acceptors = waiter.config.acceptors;
|
|
var acceptorMatched = false;
|
|
var state = 'retry';
|
|
|
|
acceptors.forEach(function(acceptor) {
|
|
if (!acceptorMatched) {
|
|
var matcher = waiter.matchers[acceptor.matcher];
|
|
if (matcher && matcher(resp, acceptor.expected, acceptor.argument)) {
|
|
acceptorMatched = true;
|
|
state = acceptor.state;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (!acceptorMatched && resp.error) state = 'failure';
|
|
|
|
if (state === 'success') {
|
|
waiter.setSuccess(resp);
|
|
} else {
|
|
waiter.setError(resp, state === 'retry');
|
|
}
|
|
}
|
|
|
|
|
|
AWS.ResourceWaiter = inherit({
|
|
|
|
constructor: function constructor(service, state) {
|
|
this.service = service;
|
|
this.state = state;
|
|
this.loadWaiterConfig(this.state);
|
|
},
|
|
|
|
service: null,
|
|
|
|
state: null,
|
|
|
|
config: null,
|
|
|
|
matchers: {
|
|
path: function(resp, expected, argument) {
|
|
var result = jmespath.search(resp.data, argument);
|
|
return jmespath.strictDeepEqual(result,expected);
|
|
},
|
|
|
|
pathAll: function(resp, expected, argument) {
|
|
var results = jmespath.search(resp.data, argument);
|
|
if (!Array.isArray(results)) results = [results];
|
|
var numResults = results.length;
|
|
if (!numResults) return false;
|
|
for (var ind = 0 ; ind < numResults; ind++) {
|
|
if (!jmespath.strictDeepEqual(results[ind], expected)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
|
|
pathAny: function(resp, expected, argument) {
|
|
var results = jmespath.search(resp.data, argument);
|
|
if (!Array.isArray(results)) results = [results];
|
|
var numResults = results.length;
|
|
for (var ind = 0 ; ind < numResults; ind++) {
|
|
if (jmespath.strictDeepEqual(results[ind], expected)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
status: function(resp, expected) {
|
|
var statusCode = resp.httpResponse.statusCode;
|
|
return (typeof statusCode === 'number') && (statusCode === expected);
|
|
},
|
|
|
|
error: function(resp, expected) {
|
|
if (typeof expected === 'string' && resp.error) {
|
|
return expected === resp.error.code;
|
|
}
|
|
return expected === !!resp.error;
|
|
}
|
|
},
|
|
|
|
listeners: new AWS.SequentialExecutor().addNamedListeners(function(add) {
|
|
add('RETRY_CHECK', 'retry', function(resp) {
|
|
var waiter = resp.request._waiter;
|
|
if (resp.error && resp.error.code === 'ResourceNotReady') {
|
|
resp.error.retryDelay = (waiter.config.delay || 0) * 1000;
|
|
}
|
|
});
|
|
|
|
add('CHECK_OUTPUT', 'extractData', CHECK_ACCEPTORS);
|
|
|
|
add('CHECK_ERROR', 'extractError', CHECK_ACCEPTORS);
|
|
}),
|
|
|
|
|
|
wait: function wait(params, callback) {
|
|
if (typeof params === 'function') {
|
|
callback = params; params = undefined;
|
|
}
|
|
|
|
var request = this.service.makeRequest(this.config.operation, params);
|
|
request._waiter = this;
|
|
request.response.maxRetries = this.config.maxAttempts;
|
|
request.addListeners(this.listeners);
|
|
|
|
if (callback) request.send(callback);
|
|
return request;
|
|
},
|
|
|
|
setSuccess: function setSuccess(resp) {
|
|
resp.error = null;
|
|
resp.data = resp.data || {};
|
|
resp.request.removeAllListeners('extractData');
|
|
},
|
|
|
|
setError: function setError(resp, retryable) {
|
|
resp.data = null;
|
|
resp.error = AWS.util.error(resp.error || new Error(), {
|
|
code: 'ResourceNotReady',
|
|
message: 'Resource is not in the state ' + this.state,
|
|
retryable: retryable
|
|
});
|
|
},
|
|
|
|
|
|
loadWaiterConfig: function loadWaiterConfig(state) {
|
|
if (!this.service.api.waiters[state]) {
|
|
throw new AWS.util.error(new Error(), {
|
|
code: 'StateNotFoundError',
|
|
message: 'State ' + state + ' not found.'
|
|
});
|
|
}
|
|
|
|
this.config = this.service.api.waiters[state];
|
|
}
|
|
});
|
|
|
|
},{"./core":29,"jmespath":193}],54:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
var inherit = AWS.util.inherit;
|
|
var jmespath = require('jmespath');
|
|
|
|
|
|
AWS.Response = inherit({
|
|
|
|
|
|
constructor: function Response(request) {
|
|
this.request = request;
|
|
this.data = null;
|
|
this.error = null;
|
|
this.retryCount = 0;
|
|
this.redirectCount = 0;
|
|
this.httpResponse = new AWS.HttpResponse();
|
|
if (request) {
|
|
this.maxRetries = request.service.numRetries();
|
|
this.maxRedirects = request.service.config.maxRedirects;
|
|
}
|
|
},
|
|
|
|
|
|
nextPage: function nextPage(callback) {
|
|
var config;
|
|
var service = this.request.service;
|
|
var operation = this.request.operation;
|
|
try {
|
|
config = service.paginationConfig(operation, true);
|
|
} catch (e) { this.error = e; }
|
|
|
|
if (!this.hasNextPage()) {
|
|
if (callback) callback(this.error, null);
|
|
else if (this.error) throw this.error;
|
|
return null;
|
|
}
|
|
|
|
var params = AWS.util.copy(this.request.params);
|
|
if (!this.nextPageTokens) {
|
|
return callback ? callback(null, null) : null;
|
|
} else {
|
|
var inputTokens = config.inputToken;
|
|
if (typeof inputTokens === 'string') inputTokens = [inputTokens];
|
|
for (var i = 0; i < inputTokens.length; i++) {
|
|
params[inputTokens[i]] = this.nextPageTokens[i];
|
|
}
|
|
return service.makeRequest(this.request.operation, params, callback);
|
|
}
|
|
},
|
|
|
|
|
|
hasNextPage: function hasNextPage() {
|
|
this.cacheNextPageTokens();
|
|
if (this.nextPageTokens) return true;
|
|
if (this.nextPageTokens === undefined) return undefined;
|
|
else return false;
|
|
},
|
|
|
|
|
|
cacheNextPageTokens: function cacheNextPageTokens() {
|
|
if (Object.prototype.hasOwnProperty.call(this, 'nextPageTokens')) return this.nextPageTokens;
|
|
this.nextPageTokens = undefined;
|
|
|
|
var config = this.request.service.paginationConfig(this.request.operation);
|
|
if (!config) return this.nextPageTokens;
|
|
|
|
this.nextPageTokens = null;
|
|
if (config.moreResults) {
|
|
if (!jmespath.search(this.data, config.moreResults)) {
|
|
return this.nextPageTokens;
|
|
}
|
|
}
|
|
|
|
var exprs = config.outputToken;
|
|
if (typeof exprs === 'string') exprs = [exprs];
|
|
AWS.util.arrayEach.call(this, exprs, function (expr) {
|
|
var output = jmespath.search(this.data, expr);
|
|
if (output) {
|
|
this.nextPageTokens = this.nextPageTokens || [];
|
|
this.nextPageTokens.push(output);
|
|
}
|
|
});
|
|
|
|
return this.nextPageTokens;
|
|
}
|
|
|
|
});
|
|
|
|
},{"./core":29,"jmespath":193}],55:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
|
|
|
|
AWS.SequentialExecutor = AWS.util.inherit({
|
|
|
|
constructor: function SequentialExecutor() {
|
|
this._events = {};
|
|
},
|
|
|
|
|
|
listeners: function listeners(eventName) {
|
|
return this._events[eventName] ? this._events[eventName].slice(0) : [];
|
|
},
|
|
|
|
on: function on(eventName, listener) {
|
|
if (this._events[eventName]) {
|
|
this._events[eventName].push(listener);
|
|
} else {
|
|
this._events[eventName] = [listener];
|
|
}
|
|
return this;
|
|
},
|
|
|
|
|
|
onAsync: function onAsync(eventName, listener) {
|
|
listener._isAsync = true;
|
|
return this.on(eventName, listener);
|
|
},
|
|
|
|
removeListener: function removeListener(eventName, listener) {
|
|
var listeners = this._events[eventName];
|
|
if (listeners) {
|
|
var length = listeners.length;
|
|
var position = -1;
|
|
for (var i = 0; i < length; ++i) {
|
|
if (listeners[i] === listener) {
|
|
position = i;
|
|
}
|
|
}
|
|
if (position > -1) {
|
|
listeners.splice(position, 1);
|
|
}
|
|
}
|
|
return this;
|
|
},
|
|
|
|
removeAllListeners: function removeAllListeners(eventName) {
|
|
if (eventName) {
|
|
delete this._events[eventName];
|
|
} else {
|
|
this._events = {};
|
|
}
|
|
return this;
|
|
},
|
|
|
|
|
|
emit: function emit(eventName, eventArgs, doneCallback) {
|
|
if (!doneCallback) doneCallback = function() { };
|
|
var listeners = this.listeners(eventName);
|
|
var count = listeners.length;
|
|
this.callListeners(listeners, eventArgs, doneCallback);
|
|
return count > 0;
|
|
},
|
|
|
|
|
|
callListeners: function callListeners(listeners, args, doneCallback, prevError) {
|
|
var self = this;
|
|
var error = prevError || null;
|
|
|
|
function callNextListener(err) {
|
|
if (err) {
|
|
error = AWS.util.error(error || new Error(), err);
|
|
if (self._haltHandlersOnError) {
|
|
return doneCallback.call(self, error);
|
|
}
|
|
}
|
|
self.callListeners(listeners, args, doneCallback, error);
|
|
}
|
|
|
|
while (listeners.length > 0) {
|
|
var listener = listeners.shift();
|
|
if (listener._isAsync) { // asynchronous listener
|
|
listener.apply(self, args.concat([callNextListener]));
|
|
return; // stop here, callNextListener will continue
|
|
} else { // synchronous listener
|
|
try {
|
|
listener.apply(self, args);
|
|
} catch (err) {
|
|
error = AWS.util.error(error || new Error(), err);
|
|
}
|
|
if (error && self._haltHandlersOnError) {
|
|
doneCallback.call(self, error);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
doneCallback.call(self, error);
|
|
},
|
|
|
|
|
|
addListeners: function addListeners(listeners) {
|
|
var self = this;
|
|
|
|
if (listeners._events) listeners = listeners._events;
|
|
|
|
AWS.util.each(listeners, function(event, callbacks) {
|
|
if (typeof callbacks === 'function') callbacks = [callbacks];
|
|
AWS.util.arrayEach(callbacks, function(callback) {
|
|
self.on(event, callback);
|
|
});
|
|
});
|
|
|
|
return self;
|
|
},
|
|
|
|
|
|
addNamedListener: function addNamedListener(name, eventName, callback) {
|
|
this[name] = callback;
|
|
this.addListener(eventName, callback);
|
|
return this;
|
|
},
|
|
|
|
|
|
addNamedAsyncListener: function addNamedAsyncListener(name, eventName, callback) {
|
|
callback._isAsync = true;
|
|
return this.addNamedListener(name, eventName, callback);
|
|
},
|
|
|
|
|
|
addNamedListeners: function addNamedListeners(callback) {
|
|
var self = this;
|
|
callback(
|
|
function() {
|
|
self.addNamedListener.apply(self, arguments);
|
|
},
|
|
function() {
|
|
self.addNamedAsyncListener.apply(self, arguments);
|
|
}
|
|
);
|
|
return this;
|
|
}
|
|
});
|
|
|
|
|
|
AWS.SequentialExecutor.prototype.addListener = AWS.SequentialExecutor.prototype.on;
|
|
|
|
module.exports = AWS.SequentialExecutor;
|
|
|
|
},{"./core":29}],56:[function(require,module,exports){
|
|
var AWS = require('./core');
|
|
var Api = require('./model/api');
|
|
var regionConfig = require('./region_config');
|
|
var inherit = AWS.util.inherit;
|
|
var clientCount = 0;
|
|
|
|
|
|
AWS.Service = inherit({
|
|
|
|
constructor: function Service(config) {
|
|
if (!this.loadServiceClass) {
|
|
throw AWS.util.error(new Error(),
|
|
'Service must be constructed with `new\' operator');
|
|
}
|
|
var ServiceClass = this.loadServiceClass(config || {});
|
|
if (ServiceClass) {
|
|
var originalConfig = AWS.util.copy(config);
|
|
var svc = new ServiceClass(config);
|
|
Object.defineProperty(svc, '_originalConfig', {
|
|
get: function() { return originalConfig; },
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
svc._clientId = ++clientCount;
|
|
return svc;
|
|
}
|
|
this.initialize(config);
|
|
},
|
|
|
|
|
|
initialize: function initialize(config) {
|
|
var svcConfig = AWS.config[this.serviceIdentifier];
|
|
|
|
this.config = new AWS.Config(AWS.config);
|
|
if (svcConfig) this.config.update(svcConfig, true);
|
|
if (config) this.config.update(config, true);
|
|
|
|
this.validateService();
|
|
if (!this.config.endpoint) regionConfig(this);
|
|
|
|
this.config.endpoint = this.endpointFromTemplate(this.config.endpoint);
|
|
this.setEndpoint(this.config.endpoint);
|
|
},
|
|
|
|
|
|
validateService: function validateService() {
|
|
},
|
|
|
|
|
|
loadServiceClass: function loadServiceClass(serviceConfig) {
|
|
var config = serviceConfig;
|
|
if (!AWS.util.isEmpty(this.api)) {
|
|
return null;
|
|
} else if (config.apiConfig) {
|
|
return AWS.Service.defineServiceApi(this.constructor, config.apiConfig);
|
|
} else if (!this.constructor.services) {
|
|
return null;
|
|
} else {
|
|
config = new AWS.Config(AWS.config);
|
|
config.update(serviceConfig, true);
|
|
var version = config.apiVersions[this.constructor.serviceIdentifier];
|
|
version = version || config.apiVersion;
|
|
return this.getLatestServiceClass(version);
|
|
}
|
|
},
|
|
|
|
|
|
getLatestServiceClass: function getLatestServiceClass(version) {
|
|
version = this.getLatestServiceVersion(version);
|
|
if (this.constructor.services[version] === null) {
|
|
AWS.Service.defineServiceApi(this.constructor, version);
|
|
}
|
|
|
|
return this.constructor.services[version];
|
|
},
|
|
|
|
|
|
getLatestServiceVersion: function getLatestServiceVersion(version) {
|
|
if (!this.constructor.services || this.constructor.services.length === 0) {
|
|
throw new Error('No services defined on ' +
|
|
this.constructor.serviceIdentifier);
|
|
}
|
|
|
|
if (!version) {
|
|
version = 'latest';
|
|
} else if (AWS.util.isType(version, Date)) {
|
|
version = AWS.util.date.iso8601(version).split('T')[0];
|
|
}
|
|
|
|
if (Object.hasOwnProperty(this.constructor.services, version)) {
|
|
return version;
|
|
}
|
|
|
|
var keys = Object.keys(this.constructor.services).sort();
|
|
var selectedVersion = null;
|
|
for (var i = keys.length - 1; i >= 0; i--) {
|
|
if (keys[i][keys[i].length - 1] !== '*') {
|
|
selectedVersion = keys[i];
|
|
}
|
|
if (keys[i].substr(0, 10) <= version) {
|
|
return selectedVersion;
|
|
}
|
|
}
|
|
|
|
throw new Error('Could not find ' + this.constructor.serviceIdentifier +
|
|
' API to satisfy version constraint `' + version + '\'');
|
|
},
|
|
|
|
|
|
api: {},
|
|
|
|
|
|
defaultRetryCount: 3,
|
|
|
|
|
|
customizeRequests: function customizeRequests(callback) {
|
|
if (!callback) {
|
|
this.customRequestHandler = null;
|
|
} else if (typeof callback === 'function') {
|
|
this.customRequestHandler = callback;
|
|
} else {
|
|
throw new Error('Invalid callback type \'' + typeof callback + '\' provided in customizeRequests');
|
|
}
|
|
},
|
|
|
|
|
|
makeRequest: function makeRequest(operation, params, callback) {
|
|
if (typeof params === 'function') {
|
|
callback = params;
|
|
params = null;
|
|
}
|
|
|
|
params = params || {};
|
|
if (this.config.params) { // copy only toplevel bound params
|
|
var rules = this.api.operations[operation];
|
|
if (rules) {
|
|
params = AWS.util.copy(params);
|
|
AWS.util.each(this.config.params, function(key, value) {
|
|
if (rules.input.members[key]) {
|
|
if (params[key] === undefined || params[key] === null) {
|
|
params[key] = value;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
var request = new AWS.Request(this, operation, params);
|
|
this.addAllRequestListeners(request);
|
|
|
|
if (callback) request.send(callback);
|
|
return request;
|
|
},
|
|
|
|
|
|
makeUnauthenticatedRequest: function makeUnauthenticatedRequest(operation, params, callback) {
|
|
if (typeof params === 'function') {
|
|
callback = params;
|
|
params = {};
|
|
}
|
|
|
|
var request = this.makeRequest(operation, params).toUnauthenticated();
|
|
return callback ? request.send(callback) : request;
|
|
},
|
|
|
|
|
|
waitFor: function waitFor(state, params, callback) {
|
|
var waiter = new AWS.ResourceWaiter(this, state);
|
|
return waiter.wait(params, callback);
|
|
},
|
|
|
|
|
|
addAllRequestListeners: function addAllRequestListeners(request) {
|
|
var list = [AWS.events, AWS.EventListeners.Core, this.serviceInterface(),
|
|
AWS.EventListeners.CorePost];
|
|
for (var i = 0; i < list.length; i++) {
|
|
if (list[i]) request.addListeners(list[i]);
|
|
}
|
|
|
|
if (!this.config.paramValidation) {
|
|
request.removeListener('validate',
|
|
AWS.EventListeners.Core.VALIDATE_PARAMETERS);
|
|
}
|
|
|
|
if (this.config.logger) { // add logging events
|
|
request.addListeners(AWS.EventListeners.Logger);
|
|
}
|
|
|
|
this.setupRequestListeners(request);
|
|
if (typeof this.constructor.prototype.customRequestHandler === 'function') {
|
|
this.constructor.prototype.customRequestHandler(request);
|
|
}
|
|
if (Object.prototype.hasOwnProperty.call(this, 'customRequestHandler') && typeof this.customRequestHandler === 'function') {
|
|
this.customRequestHandler(request);
|
|
}
|
|
},
|
|
|
|
|
|
setupRequestListeners: function setupRequestListeners() {
|
|
},
|
|
|
|
|
|
getSignerClass: function getSignerClass() {
|
|
var version;
|
|
if (this.config.signatureVersion) {
|
|
version = this.config.signatureVersion;
|
|
} else {
|
|
version = this.api.signatureVersion;
|
|
}
|
|
return AWS.Signers.RequestSigner.getVersion(version);
|
|
},
|
|
|
|
|
|
serviceInterface: function serviceInterface() {
|
|
switch (this.api.protocol) {
|
|
case 'ec2': return AWS.EventListeners.Query;
|
|
case 'query': return AWS.EventListeners.Query;
|
|
case 'json': return AWS.EventListeners.Json;
|
|
case 'rest-json': return AWS.EventListeners.RestJson;
|
|
case 'rest-xml': return AWS.EventListeners.RestXml;
|
|
}
|
|
if (this.api.protocol) {
|
|
throw new Error('Invalid service `protocol\' ' +
|
|
this.api.protocol + ' in API config');
|
|
}
|
|
},
|
|
|
|
|
|
successfulResponse: function successfulResponse(resp) {
|
|
return resp.httpResponse.statusCode < 300;
|
|
},
|
|
|
|
|
|
numRetries: function numRetries() {
|
|
if (this.config.maxRetries !== undefined) {
|
|
return this.config.maxRetries;
|
|
} else {
|
|
return this.defaultRetryCount;
|
|
}
|
|
},
|
|
|
|
|
|
retryDelays: function retryDelays(retryCount) {
|
|
return AWS.util.calculateRetryDelay(retryCount, this.config.retryDelayOptions);
|
|
},
|
|
|
|
|
|
retryableError: function retryableError(error) {
|
|
if (this.networkingError(error)) return true;
|
|
if (this.expiredCredentialsError(error)) return true;
|
|
if (this.throttledError(error)) return true;
|
|
if (error.statusCode >= 500) return true;
|
|
return false;
|
|
},
|
|
|
|
|
|
networkingError: function networkingError(error) {
|
|
return error.code === 'NetworkingError';
|
|
},
|
|
|
|
|
|
expiredCredentialsError: function expiredCredentialsError(error) {
|
|
return (error.code === 'ExpiredTokenException');
|
|
},
|
|
|
|
|
|
clockSkewError: function clockSkewError(error) {
|
|
switch (error.code) {
|
|
case 'RequestTimeTooSkewed':
|
|
case 'RequestExpired':
|
|
case 'InvalidSignatureException':
|
|
case 'SignatureDoesNotMatch':
|
|
case 'AuthFailure':
|
|
case 'RequestInTheFuture':
|
|
return true;
|
|
default: return false;
|
|
}
|
|
},
|
|
|
|
|
|
throttledError: function throttledError(error) {
|
|
switch (error.code) {
|
|
case 'ProvisionedThroughputExceededException':
|
|
case 'Throttling':
|
|
case 'ThrottlingException':
|
|
case 'RequestLimitExceeded':
|
|
case 'RequestThrottled':
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
},
|
|
|
|
|
|
endpointFromTemplate: function endpointFromTemplate(endpoint) {
|
|
if (typeof endpoint !== 'string') return endpoint;
|
|
|
|
var e = endpoint;
|
|
e = e.replace(/\{service\}/g, this.api.endpointPrefix);
|
|
e = e.replace(/\{region\}/g, this.config.region);
|
|
e = e.replace(/\{scheme\}/g, this.config.sslEnabled ? 'https' : 'http');
|
|
return e;
|
|
},
|
|
|
|
|
|
setEndpoint: function setEndpoint(endpoint) {
|
|
this.endpoint = new AWS.Endpoint(endpoint, this.config);
|
|
},
|
|
|
|
|
|
paginationConfig: function paginationConfig(operation, throwException) {
|
|
var paginator = this.api.operations[operation].paginator;
|
|
if (!paginator) {
|
|
if (throwException) {
|
|
var e = new Error();
|
|
throw AWS.util.error(e, 'No pagination configuration for ' + operation);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
return paginator;
|
|
}
|
|
});
|
|
|
|
AWS.util.update(AWS.Service, {
|
|
|
|
|
|
defineMethods: function defineMethods(svc) {
|
|
AWS.util.each(svc.prototype.api.operations, function iterator(method) {
|
|
if (svc.prototype[method]) return;
|
|
var operation = svc.prototype.api.operations[method];
|
|
if (operation.authtype === 'none') {
|
|
svc.prototype[method] = function (params, callback) {
|
|
return this.makeUnauthenticatedRequest(method, params, callback);
|
|
};
|
|
} else {
|
|
svc.prototype[method] = function (params, callback) {
|
|
return this.makeRequest(method, params, callback);
|
|
};
|
|
}
|
|
});
|
|
},
|
|
|
|
|
|
defineService: function defineService(serviceIdentifier, versions, features) {
|
|
AWS.Service._serviceMap[serviceIdentifier] = true;
|
|
if (!Array.isArray(versions)) {
|
|
features = versions;
|
|
versions = [];
|
|
}
|
|
|
|
var svc = inherit(AWS.Service, features || {});
|
|
|
|
if (typeof serviceIdentifier === 'string') {
|
|
AWS.Service.addVersions(svc, versions);
|
|
|
|
var identifier = svc.serviceIdentifier || serviceIdentifier;
|
|
svc.serviceIdentifier = identifier;
|
|
} else { // defineService called with an API
|
|
svc.prototype.api = serviceIdentifier;
|
|
AWS.Service.defineMethods(svc);
|
|
}
|
|
|
|
return svc;
|
|
},
|
|
|
|
|
|
addVersions: function addVersions(svc, versions) {
|
|
if (!Array.isArray(versions)) versions = [versions];
|
|
|
|
svc.services = svc.services || {};
|
|
for (var i = 0; i < versions.length; i++) {
|
|
if (svc.services[versions[i]] === undefined) {
|
|
svc.services[versions[i]] = null;
|
|
}
|
|
}
|
|
|
|
svc.apiVersions = Object.keys(svc.services).sort();
|
|
},
|
|
|
|
|
|
defineServiceApi: function defineServiceApi(superclass, version, apiConfig) {
|
|
var svc = inherit(superclass, {
|
|
serviceIdentifier: superclass.serviceIdentifier
|
|
});
|
|
|
|
function setApi(api) {
|
|
if (api.isApi) {
|
|
svc.prototype.api = api;
|
|
} else {
|
|
svc.prototype.api = new Api(api);
|
|
}
|
|
}
|
|
|
|
if (typeof version === 'string') {
|
|
if (apiConfig) {
|
|
setApi(apiConfig);
|
|
} else {
|
|
try {
|
|
setApi(AWS.apiLoader(superclass.serviceIdentifier, version));
|
|
} catch (err) {
|
|
throw AWS.util.error(err, {
|
|
message: 'Could not find API configuration ' +
|
|
superclass.serviceIdentifier + '-' + version
|
|
});
|
|
}
|
|
}
|
|
if (!Object.prototype.hasOwnProperty.call(superclass.services, version)) {
|
|
superclass.apiVersions = superclass.apiVersions.concat(version).sort();
|
|
}
|
|
superclass.services[version] = svc;
|
|
} else {
|
|
setApi(version);
|
|
}
|
|
|
|
AWS.Service.defineMethods(svc);
|
|
return svc;
|
|
},
|
|
|
|
|
|
hasService: function(identifier) {
|
|
return Object.prototype.hasOwnProperty.call(AWS.Service._serviceMap, identifier);
|
|
},
|
|
|
|
|
|
_serviceMap: {}
|
|
});
|
|
|
|
module.exports = AWS.Service;
|
|
},{"./core":29,"./model/api":37,"./region_config":51}],57:[function(require,module,exports){
|
|
var Jibo = require('../core');
|
|
|
|
['checkEmail', 'create', 'login', 'resendActivationCode', 'activateByCode', 'confirmEmailReset',
|
|
'sendPasswordReset', 'passwordResetByCode', 'getAccountByAccessToken', 'facebookConnect'].forEach(function(method) {
|
|
Jibo.Account.prototype[method] = function(params, callback) {
|
|
return this.makeUnauthenticatedRequest(method, params, callback);
|
|
};
|
|
});
|
|
|
|
var FIXED_KEY = 'jibokey';
|
|
|
|
Jibo.Account.prototype.encryptQr = Jibo.Account.prototype.decryptQr = function(source, key) {
|
|
key = key || FIXED_KEY;
|
|
var result = '';
|
|
for (var i = 0; i < source.length; i++) {
|
|
var encodedChar = source.charCodeAt(i) ^ key.charCodeAt(i % key.length);
|
|
result = result + String.fromCharCode(encodedChar);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
},{"../core":29}],58:[function(require,module,exports){
|
|
|
|
},{}],59:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var Jibo = require('../core');
|
|
var NodeRSA = require('node-rsa');
|
|
var crypto = require('crypto');
|
|
var constants = require('constants');
|
|
var Storage = require('./storage');
|
|
var storage = new Storage();
|
|
var CIPHER_NAME = 'aes-256-cbc';
|
|
var RSA_KEY_SIZE = 2048;
|
|
var SYMM_KEY_SIZE = 32;
|
|
|
|
Jibo.Key.prototype.storage = storage;
|
|
|
|
Jibo.Key.prototype.createRsaKeys = function(callback) {
|
|
var key = new NodeRSA({ b: RSA_KEY_SIZE });
|
|
callback(null, {
|
|
PrivateKey: key.exportKey('private'),
|
|
PublicKey: key.exportKey('public')
|
|
});
|
|
};
|
|
|
|
Jibo.Key.prototype.encryptCommonKey = function(params, callback) {
|
|
if (!params.PublicKey) {
|
|
return callback('Public key is required');
|
|
}
|
|
if (!params.Body) {
|
|
return callback('Body is required');
|
|
}
|
|
this.encryptRsa({ Body: params.Body, Key: params.PublicKey }, callback);
|
|
};
|
|
|
|
Jibo.Key.prototype.decryptCommonKey = function(params, callback) {
|
|
if (!params.PrivateKey) {
|
|
return callback('Private key is required');
|
|
}
|
|
if (!params.Body) {
|
|
return callback('Body is required');
|
|
}
|
|
this.decryptRsa({ Body: params.Body, Key: params.PrivateKey }, callback);
|
|
};
|
|
|
|
Jibo.Key.prototype.encryptRsa = function(params, callback) {
|
|
callback(null, crypto.publicEncrypt({
|
|
key: params.Key,
|
|
padding: constants.RSA_PKCS1_PADDING
|
|
}, new Buffer(params.Body, 'base64')));
|
|
};
|
|
|
|
Jibo.Key.prototype.decryptRsa = function(params, callback) {
|
|
callback(null, crypto.privateDecrypt({
|
|
key: params.Key,
|
|
padding: constants.RSA_PKCS1_PADDING
|
|
}, new Buffer(params.Body, 'base64')));
|
|
};
|
|
|
|
Jibo.Key.prototype.getIv = function(key) {
|
|
var positions = [2, 4, 6, 8, 31, 29, 27, 25, 9, 11, 13, 15, 24, 22, 20, 18];
|
|
var iv = new Buffer(positions.length);
|
|
for (var i = 0; i < positions.length; i++) {
|
|
iv[i] = key[positions[i]];
|
|
}
|
|
return iv;
|
|
};
|
|
|
|
Jibo.Key.prototype.encryptSymmetric = function(params, callback) {
|
|
if (!params.Key) {
|
|
return callback('Key is required');
|
|
}
|
|
if (!params.Body) {
|
|
return callback('Body is required');
|
|
}
|
|
var binaryKey = new Buffer(params.Key, 'base64');
|
|
var cipher = crypto.createCipheriv(CIPHER_NAME, binaryKey, this.getIv(binaryKey));
|
|
var crypted = cipher.update(params.Body, 'utf8', 'hex');
|
|
crypted += cipher.final('hex');
|
|
return callback(null, crypted);
|
|
};
|
|
|
|
Jibo.Key.prototype.encryptSymmetricStream = function(params) {
|
|
if (!params.Key) {
|
|
throw new Error('Key is required');
|
|
}
|
|
if (!params.Body) {
|
|
throw new Error('Body is required');
|
|
}
|
|
var binaryKey = new Buffer(params.Key, 'base64');
|
|
var stream = crypto.createCipheriv(CIPHER_NAME, binaryKey, this.getIv(binaryKey));
|
|
return params.Body.pipe(stream);
|
|
};
|
|
|
|
Jibo.Key.prototype.decryptSymmetric = function(params, callback) {
|
|
if (!params.Key) {
|
|
return callback('Key is required');
|
|
}
|
|
if (!params.Body) {
|
|
return callback('Body is required');
|
|
}
|
|
var binaryKey = new Buffer(params.Key, 'base64');
|
|
var decipher = crypto.createDecipheriv(CIPHER_NAME, binaryKey, this.getIv(binaryKey));
|
|
var dec = decipher.update(params.Body, 'hex', 'utf8');
|
|
dec += decipher.final('utf8');
|
|
callback(null, dec);
|
|
};
|
|
|
|
Jibo.Key.prototype.decryptSymmetricStream = function(params) {
|
|
if (!params.Key) {
|
|
throw new Error('Key is required');
|
|
}
|
|
if (!params.Body) {
|
|
throw new Error('Body is required');
|
|
}
|
|
var binaryKey = new Buffer(params.Key, 'base64');
|
|
var stream = crypto.createDecipheriv(CIPHER_NAME, binaryKey, this.getIv(binaryKey));
|
|
return params.Body.pipe(stream);
|
|
};
|
|
|
|
Jibo.Key.prototype.loadOrCreateKeyPair = function(callback) {
|
|
var keyClientContext = this;
|
|
this.storage.load('keypair', function(pairErr, pairResult) {
|
|
if (pairErr) {
|
|
return keyClientContext.createRsaKeys(function(createErr, createResult) {
|
|
if (createErr) {
|
|
return callback(createErr);
|
|
}
|
|
var jsonResult = JSON.stringify(createResult);
|
|
keyClientContext.storage.save('keypair', jsonResult, function(saveErr) {
|
|
if (saveErr) {
|
|
return callback(saveErr);
|
|
}
|
|
callback(null, createResult);
|
|
});
|
|
});
|
|
}
|
|
var parsedResult = {};
|
|
try {
|
|
parsedResult = JSON.parse(pairResult);
|
|
} catch (e) {
|
|
return callback('Cannot read previously saved key pair');
|
|
}
|
|
callback(null, parsedResult);
|
|
});
|
|
};
|
|
|
|
Jibo.Key.prototype.addPemHeader = function(key) {
|
|
var cleanKey = this.removePemHeader(key);
|
|
var keyInChunks = key.match(/.{1,64}/g);
|
|
return '-----BEGIN PUBLIC KEY-----\n' + keyInChunks.join('\n') + '\n-----END PUBLIC KEY-----';
|
|
};
|
|
|
|
Jibo.Key.prototype.removePemHeader = function(key) {
|
|
return key.replace('-----BEGIN PUBLIC KEY-----', '').replace('-----END PUBLIC KEY-----', '').replace(/\n/g, '');
|
|
};
|
|
|
|
Jibo.Key.prototype.requestSymmetricKey = function(params, callback) {
|
|
if (!params.loopId) {
|
|
return callback('loopId parameter is required');
|
|
}
|
|
var keyClientContext = this;
|
|
this.loadOrCreateKeyPair(function(pairErr, pairResult) {
|
|
if (pairErr) {
|
|
return callback(pairErr);
|
|
}
|
|
keyClientContext.createRequest({
|
|
publicKey: keyClientContext.removePemHeader(pairResult.PublicKey),
|
|
loopId: params.loopId
|
|
}, callback);
|
|
});
|
|
};
|
|
|
|
Jibo.Key.prototype.shareSymmetricKey = function(params, callback) {
|
|
if (!params.loopId) {
|
|
return callback('loopId is required parameter');
|
|
}
|
|
if (!params.id) {
|
|
return callback('id is required parameter');
|
|
}
|
|
var keyClientContext = this;
|
|
this.storage.load('symmetric-' + params.loopId, function(symmErr, symmResult) {
|
|
if (symmErr) {
|
|
return callback(symmErr);
|
|
}
|
|
keyClientContext.getRequest({
|
|
id: params.id
|
|
}, function(getErr, getResult) {
|
|
if (getErr) {
|
|
return callback(getErr);
|
|
}
|
|
keyClientContext.encryptCommonKey({
|
|
Body: symmResult,
|
|
PublicKey: keyClientContext.addPemHeader(getResult.publicKey)
|
|
}, function(commonErr, commonResult) {
|
|
if (commonErr) {
|
|
return callback(commonErr);
|
|
}
|
|
keyClientContext.share({
|
|
id: params.id,
|
|
encryptedKey: commonResult.toString('base64')
|
|
}, callback);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
Jibo.Key.prototype.createSymmetricKey = function(params, callback) {
|
|
if (!params.loopId) {
|
|
return callback('loopId is required parameter');
|
|
}
|
|
var keyClientContext = this;
|
|
this.storage.load('symmetric-' + params.loopId, function(symmErr, symmResult) {
|
|
if (!symmErr && symmResult) {
|
|
return callback('Symmetric key already exists');
|
|
}
|
|
crypto.randomBytes(SYMM_KEY_SIZE, function(err, buffer) {
|
|
if (err) {
|
|
return callback(err);
|
|
}
|
|
var token = buffer.toString('base64');
|
|
keyClientContext.storage.save('symmetric-' + params.loopId, token, function(saveErr) {
|
|
if (saveErr) {
|
|
return callback(saveErr);
|
|
}
|
|
callback(null, token);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
Jibo.Key.prototype.loadSymmetricKey = function(params, callback) {
|
|
if (!params.loopId) {
|
|
return callback('loopId is required parameter');
|
|
}
|
|
this.storage.load('symmetric-' + params.loopId, callback);
|
|
};
|
|
|
|
Jibo.Key.prototype.loadOrCreateSymmetricKey = function(params, callback) {
|
|
var keyClientContext = this;
|
|
this.loadSymmetricKey(params, function(loadErr, loadResult) {
|
|
if (!loadErr && loadResult) {
|
|
return callback(null, loadResult);
|
|
}
|
|
keyClientContext.createSymmetricKey(params, callback);
|
|
})
|
|
};
|
|
|
|
Jibo.Key.prototype.saveSymmetricKey = function(params, callback) {
|
|
if (!params.loopId) {
|
|
return callback('loopId is required parameter');
|
|
}
|
|
if (!params.id) {
|
|
return callback('id is required parameter');
|
|
}
|
|
var keyClientContext = this;
|
|
this.getRequest({
|
|
id: params.id
|
|
}, function(getErr, getResult) {
|
|
if (getErr) {
|
|
return callback(getErr);
|
|
}
|
|
keyClientContext.loadOrCreateKeyPair(function(pairErr, pairResult) {
|
|
if (pairErr) {
|
|
return callback(pairErr);
|
|
}
|
|
var encryptedKey = new Buffer(getResult.encryptedKey, 'base64');
|
|
keyClientContext.decryptCommonKey({
|
|
Body: encryptedKey,
|
|
PrivateKey: pairResult.PrivateKey
|
|
}, function(decErr, decResult) {
|
|
if (decErr) {
|
|
return callback(decErr);
|
|
}
|
|
keyClientContext.storage.save('symmetric-' + params.loopId, decResult.toString('base64'), callback);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../core":29,"./storage":63,"buffer":130,"constants":132,"crypto":128,"node-rsa":247}],60:[function(require,module,exports){
|
|
var Jibo = require('../core');
|
|
|
|
['updateAgreementStatus'].forEach(function(method) {
|
|
Jibo.Loop.prototype[method] = function(params, callback) {
|
|
return this.makeUnauthenticatedRequest(method, params, callback);
|
|
};
|
|
});
|
|
},{"../core":29}],61:[function(require,module,exports){
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var util = require('util');
|
|
var WebSocket = typeof window !== 'undefined' && window.WebSocket;
|
|
if (!WebSocket) {
|
|
try {
|
|
WebSocket = require('@jibo/ws');
|
|
} catch (e) {
|
|
}
|
|
}
|
|
var Jibo = require('../core');
|
|
|
|
function NotificationEmiter(options) {
|
|
EventEmitter.call(this);
|
|
options.reconnectInterval = options.reconnectInterval || 1000 * 10
|
|
var ws;
|
|
var self = this;
|
|
var forceClosing = false;
|
|
(function connect() {
|
|
if (forceClosing) {
|
|
console.log('closing connection')
|
|
return;
|
|
}
|
|
console.log('trying to connect:', options.url);
|
|
ws = new WebSocket(options.url);
|
|
ws.on('open', function() {
|
|
self.emit('open')
|
|
});
|
|
ws.on('pong', function(data) {
|
|
self.emit('pong', data)
|
|
});
|
|
ws.on('message', function(data, flags) {
|
|
var parsedData = data;
|
|
try {
|
|
parsedData = JSON.parse(data);
|
|
self.emit('message', parsedData, flags);
|
|
} catch (e) {
|
|
self.emit('error', e);
|
|
}
|
|
if (parsedData.error) {
|
|
self.emit('error', parsedData.error);
|
|
}
|
|
});
|
|
ws.on('close', function(code, message) {
|
|
self.emit('close', code, message);
|
|
setTimeout(connect, options.reconnectInterval);
|
|
});
|
|
ws.on('error', function(error) {
|
|
self.emit('websocket error', error);
|
|
setTimeout(connect, options.reconnectInterval);
|
|
});
|
|
})();
|
|
|
|
self.close = function() {
|
|
forceClosing = true;
|
|
ws.close()
|
|
}
|
|
self.ping = function(data) {
|
|
ws.ping(data);
|
|
}
|
|
}
|
|
util.inherits(NotificationEmiter, EventEmitter);
|
|
|
|
|
|
Jibo.util.update(Jibo.Notification.prototype, {
|
|
connect: function(options, callback) {
|
|
var wsEndpoint = this.endpointFromTemplate(this.config.wsendpoint);
|
|
this.newRobotToken(options, function(err, result) {
|
|
if (err) {
|
|
return callback(err);
|
|
}
|
|
|
|
var notificationHub = new NotificationEmiter({
|
|
url: wsEndpoint +'/'+ result.token
|
|
});
|
|
callback(null, notificationHub);
|
|
});
|
|
}
|
|
});
|
|
|
|
},{"../core":29,"@jibo/ws":75,"events":172,"util":320}],62:[function(require,module,exports){
|
|
var Jibo = require('../core');
|
|
|
|
['getStatus', 'setupRobot'].forEach(function(method) {
|
|
Jibo.OOBE.prototype[method] = function(params, callback) {
|
|
return this.makeUnauthenticatedRequest(method, params, callback);
|
|
};
|
|
});
|
|
|
|
},{"../core":29}],63:[function(require,module,exports){
|
|
(function (__dirname){
|
|
var Jibo = require('../core');
|
|
var fs = require('fs');
|
|
|
|
Jibo.Storage = function() {};
|
|
|
|
Jibo.Storage.prototype.load = function(name, callback) {
|
|
fs.readFile(__dirname + '/' + name + '.json', { encoding: 'utf8'}, callback);
|
|
};
|
|
|
|
Jibo.Storage.prototype.save = function(name, body, callback) {
|
|
fs.writeFile(__dirname + '/' + name + '.json', body, callback);
|
|
};
|
|
|
|
module.exports = Jibo.Storage;
|
|
|
|
}).call(this,"/lib/services")
|
|
},{"../core":29,"fs":100}],64:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
var expiresHeader = 'presigned-expires';
|
|
|
|
|
|
function signedUrlBuilder(request) {
|
|
var expires = request.httpRequest.headers[expiresHeader];
|
|
var signerClass = request.service.getSignerClass(request);
|
|
|
|
delete request.httpRequest.headers['User-Agent'];
|
|
delete request.httpRequest.headers['X-Amz-User-Agent'];
|
|
|
|
if (signerClass === AWS.Signers.V4) {
|
|
if (expires > 604800) { // one week expiry is invalid
|
|
var message = 'Presigning does not support expiry time greater ' +
|
|
'than a week with SigV4 signing.';
|
|
throw AWS.util.error(new Error(), {
|
|
code: 'InvalidExpiryTime', message: message, retryable: false
|
|
});
|
|
}
|
|
request.httpRequest.headers[expiresHeader] = expires;
|
|
} else if (signerClass === AWS.Signers.S3) {
|
|
request.httpRequest.headers[expiresHeader] = parseInt(
|
|
AWS.util.date.unixTimestamp() + expires, 10).toString();
|
|
} else {
|
|
throw AWS.util.error(new Error(), {
|
|
message: 'Presigning only supports S3 or SigV4 signing.',
|
|
code: 'UnsupportedSigner', retryable: false
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
function signedUrlSigner(request) {
|
|
var endpoint = request.httpRequest.endpoint;
|
|
var parsedUrl = AWS.util.urlParse(request.httpRequest.path);
|
|
var queryParams = {};
|
|
|
|
if (parsedUrl.search) {
|
|
queryParams = AWS.util.queryStringParse(parsedUrl.search.substr(1));
|
|
}
|
|
|
|
AWS.util.each(request.httpRequest.headers, function (key, value) {
|
|
if (key === expiresHeader) key = 'Expires';
|
|
if (key.indexOf('x-amz-meta-') === 0) {
|
|
delete queryParams[key];
|
|
key = key.toLowerCase();
|
|
}
|
|
queryParams[key] = value;
|
|
});
|
|
delete request.httpRequest.headers[expiresHeader];
|
|
|
|
var auth = queryParams['Authorization'].split(' ');
|
|
if (auth[0] === 'AWS') {
|
|
auth = auth[1].split(':');
|
|
queryParams['AWSAccessKeyId'] = auth[0];
|
|
queryParams['Signature'] = auth[1];
|
|
} else if (auth[0] === 'AWS4-HMAC-SHA256') { // SigV4 signing
|
|
auth.shift();
|
|
var rest = auth.join(' ');
|
|
var signature = rest.match(/Signature=(.*?)(?:,|\s|\r?\n|$)/)[1];
|
|
queryParams['X-Amz-Signature'] = signature;
|
|
delete queryParams['Expires'];
|
|
}
|
|
delete queryParams['Authorization'];
|
|
delete queryParams['Host'];
|
|
|
|
endpoint.pathname = parsedUrl.pathname;
|
|
endpoint.search = AWS.util.queryParamsToString(queryParams);
|
|
}
|
|
|
|
|
|
AWS.Signers.Presign = inherit({
|
|
|
|
sign: function sign(request, expireTime, callback) {
|
|
request.httpRequest.headers[expiresHeader] = expireTime || 3600;
|
|
request.on('build', signedUrlBuilder);
|
|
request.on('sign', signedUrlSigner);
|
|
request.removeListener('afterBuild',
|
|
AWS.EventListeners.Core.SET_CONTENT_LENGTH);
|
|
request.removeListener('afterBuild',
|
|
AWS.EventListeners.Core.COMPUTE_SHA256);
|
|
|
|
request.emit('beforePresign', [request]);
|
|
|
|
if (callback) {
|
|
request.build(function() {
|
|
if (this.response.error) callback(this.response.error);
|
|
else {
|
|
callback(null, AWS.util.urlFormat(request.httpRequest.endpoint));
|
|
}
|
|
});
|
|
} else {
|
|
request.build();
|
|
if (request.response.error) throw request.response.error;
|
|
return AWS.util.urlFormat(request.httpRequest.endpoint);
|
|
}
|
|
}
|
|
});
|
|
|
|
module.exports = AWS.Signers.Presign;
|
|
|
|
},{"../core":29}],65:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
AWS.Signers.RequestSigner = inherit({
|
|
constructor: function RequestSigner(request) {
|
|
this.request = request;
|
|
},
|
|
|
|
setServiceClientId: function setServiceClientId(id) {
|
|
this.serviceClientId = id;
|
|
},
|
|
|
|
getServiceClientId: function getServiceClientId() {
|
|
return this.serviceClientId;
|
|
}
|
|
});
|
|
|
|
AWS.Signers.RequestSigner.getVersion = function getVersion(version) {
|
|
switch (version) {
|
|
case 'v2': return AWS.Signers.V2;
|
|
case 'v3': return AWS.Signers.V3;
|
|
case 'v4': return AWS.Signers.V4;
|
|
case 's3': return AWS.Signers.S3;
|
|
case 'v3https': return AWS.Signers.V3Https;
|
|
}
|
|
throw new Error('Unknown signing version ' + version);
|
|
};
|
|
|
|
require('./v2');
|
|
require('./v3');
|
|
require('./v3https');
|
|
require('./v4');
|
|
require('./s3');
|
|
require('./presign');
|
|
|
|
},{"../core":29,"./presign":64,"./s3":66,"./v2":67,"./v3":68,"./v3https":69,"./v4":70}],66:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
AWS.Signers.S3 = inherit(AWS.Signers.RequestSigner, {
|
|
|
|
subResources: {
|
|
'acl': 1,
|
|
'accelerate': 1,
|
|
'analytics': 1,
|
|
'cors': 1,
|
|
'lifecycle': 1,
|
|
'delete': 1,
|
|
'inventory': 1,
|
|
'location': 1,
|
|
'logging': 1,
|
|
'metrics': 1,
|
|
'notification': 1,
|
|
'partNumber': 1,
|
|
'policy': 1,
|
|
'requestPayment': 1,
|
|
'replication': 1,
|
|
'restore': 1,
|
|
'tagging': 1,
|
|
'torrent': 1,
|
|
'uploadId': 1,
|
|
'uploads': 1,
|
|
'versionId': 1,
|
|
'versioning': 1,
|
|
'versions': 1,
|
|
'website': 1
|
|
},
|
|
|
|
responseHeaders: {
|
|
'response-content-type': 1,
|
|
'response-content-language': 1,
|
|
'response-expires': 1,
|
|
'response-cache-control': 1,
|
|
'response-content-disposition': 1,
|
|
'response-content-encoding': 1
|
|
},
|
|
|
|
addAuthorization: function addAuthorization(credentials, date) {
|
|
if (!this.request.headers['presigned-expires']) {
|
|
this.request.headers['X-Amz-Date'] = AWS.util.date.rfc822(date);
|
|
}
|
|
|
|
if (credentials.sessionToken) {
|
|
this.request.headers['x-amz-security-token'] = credentials.sessionToken;
|
|
}
|
|
|
|
var signature = this.sign(credentials.secretAccessKey, this.stringToSign());
|
|
var auth = 'AWS ' + credentials.accessKeyId + ':' + signature;
|
|
|
|
this.request.headers['Authorization'] = auth;
|
|
},
|
|
|
|
stringToSign: function stringToSign() {
|
|
var r = this.request;
|
|
|
|
var parts = [];
|
|
parts.push(r.method);
|
|
parts.push(r.headers['Content-MD5'] || '');
|
|
parts.push(r.headers['Content-Type'] || '');
|
|
|
|
parts.push(r.headers['presigned-expires'] || '');
|
|
|
|
var headers = this.canonicalizedAmzHeaders();
|
|
if (headers) parts.push(headers);
|
|
parts.push(this.canonicalizedResource());
|
|
|
|
return parts.join('\n');
|
|
|
|
},
|
|
|
|
canonicalizedAmzHeaders: function canonicalizedAmzHeaders() {
|
|
|
|
var amzHeaders = [];
|
|
|
|
AWS.util.each(this.request.headers, function (name) {
|
|
if (name.match(/^x-amz-/i))
|
|
amzHeaders.push(name);
|
|
});
|
|
|
|
amzHeaders.sort(function (a, b) {
|
|
return a.toLowerCase() < b.toLowerCase() ? -1 : 1;
|
|
});
|
|
|
|
var parts = [];
|
|
AWS.util.arrayEach.call(this, amzHeaders, function (name) {
|
|
parts.push(name.toLowerCase() + ':' + String(this.request.headers[name]));
|
|
});
|
|
|
|
return parts.join('\n');
|
|
|
|
},
|
|
|
|
canonicalizedResource: function canonicalizedResource() {
|
|
|
|
var r = this.request;
|
|
|
|
var parts = r.path.split('?');
|
|
var path = parts[0];
|
|
var querystring = parts[1];
|
|
|
|
var resource = '';
|
|
|
|
if (r.virtualHostedBucket)
|
|
resource += '/' + r.virtualHostedBucket;
|
|
|
|
resource += path;
|
|
|
|
if (querystring) {
|
|
|
|
var resources = [];
|
|
|
|
AWS.util.arrayEach.call(this, querystring.split('&'), function (param) {
|
|
var name = param.split('=')[0];
|
|
var value = param.split('=')[1];
|
|
if (this.subResources[name] || this.responseHeaders[name]) {
|
|
var subresource = { name: name };
|
|
if (value !== undefined) {
|
|
if (this.subResources[name]) {
|
|
subresource.value = value;
|
|
} else {
|
|
subresource.value = decodeURIComponent(value);
|
|
}
|
|
}
|
|
resources.push(subresource);
|
|
}
|
|
});
|
|
|
|
resources.sort(function (a, b) { return a.name < b.name ? -1 : 1; });
|
|
|
|
if (resources.length) {
|
|
|
|
querystring = [];
|
|
AWS.util.arrayEach(resources, function (res) {
|
|
if (res.value === undefined) {
|
|
querystring.push(res.name);
|
|
} else {
|
|
querystring.push(res.name + '=' + res.value);
|
|
}
|
|
});
|
|
|
|
resource += '?' + querystring.join('&');
|
|
}
|
|
|
|
}
|
|
|
|
return resource;
|
|
|
|
},
|
|
|
|
sign: function sign(secret, string) {
|
|
return AWS.util.crypto.hmac(secret, string, 'base64', 'sha1');
|
|
}
|
|
});
|
|
|
|
module.exports = AWS.Signers.S3;
|
|
|
|
},{"../core":29}],67:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
AWS.Signers.V2 = inherit(AWS.Signers.RequestSigner, {
|
|
addAuthorization: function addAuthorization(credentials, date) {
|
|
|
|
if (!date) date = AWS.util.date.getDate();
|
|
|
|
var r = this.request;
|
|
|
|
r.params.Timestamp = AWS.util.date.iso8601(date);
|
|
r.params.SignatureVersion = '2';
|
|
r.params.SignatureMethod = 'HmacSHA256';
|
|
r.params.AWSAccessKeyId = credentials.accessKeyId;
|
|
|
|
if (credentials.sessionToken) {
|
|
r.params.SecurityToken = credentials.sessionToken;
|
|
}
|
|
|
|
delete r.params.Signature; // delete old Signature for re-signing
|
|
r.params.Signature = this.signature(credentials);
|
|
|
|
r.body = AWS.util.queryParamsToString(r.params);
|
|
r.headers['Content-Length'] = r.body.length;
|
|
},
|
|
|
|
signature: function signature(credentials) {
|
|
return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64');
|
|
},
|
|
|
|
stringToSign: function stringToSign() {
|
|
var parts = [];
|
|
parts.push(this.request.method);
|
|
parts.push(this.request.endpoint.host.toLowerCase());
|
|
parts.push(this.request.pathname());
|
|
parts.push(AWS.util.queryParamsToString(this.request.params));
|
|
return parts.join('\n');
|
|
}
|
|
|
|
});
|
|
|
|
module.exports = AWS.Signers.V2;
|
|
|
|
},{"../core":29}],68:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
AWS.Signers.V3 = inherit(AWS.Signers.RequestSigner, {
|
|
addAuthorization: function addAuthorization(credentials, date) {
|
|
|
|
var datetime = AWS.util.date.rfc822(date);
|
|
|
|
this.request.headers['X-Amz-Date'] = datetime;
|
|
|
|
if (credentials.sessionToken) {
|
|
this.request.headers['x-amz-security-token'] = credentials.sessionToken;
|
|
}
|
|
|
|
this.request.headers['X-Amzn-Authorization'] =
|
|
this.authorization(credentials, datetime);
|
|
|
|
},
|
|
|
|
authorization: function authorization(credentials) {
|
|
return 'AWS3 ' +
|
|
'AWSAccessKeyId=' + credentials.accessKeyId + ',' +
|
|
'Algorithm=HmacSHA256,' +
|
|
'SignedHeaders=' + this.signedHeaders() + ',' +
|
|
'Signature=' + this.signature(credentials);
|
|
},
|
|
|
|
signedHeaders: function signedHeaders() {
|
|
var headers = [];
|
|
AWS.util.arrayEach(this.headersToSign(), function iterator(h) {
|
|
headers.push(h.toLowerCase());
|
|
});
|
|
return headers.sort().join(';');
|
|
},
|
|
|
|
canonicalHeaders: function canonicalHeaders() {
|
|
var headers = this.request.headers;
|
|
var parts = [];
|
|
AWS.util.arrayEach(this.headersToSign(), function iterator(h) {
|
|
parts.push(h.toLowerCase().trim() + ':' + String(headers[h]).trim());
|
|
});
|
|
return parts.sort().join('\n') + '\n';
|
|
},
|
|
|
|
headersToSign: function headersToSign() {
|
|
var headers = [];
|
|
AWS.util.each(this.request.headers, function iterator(k) {
|
|
if (k === 'Host' || k === 'Content-Encoding' || k.match(/^X-Amz/i)) {
|
|
headers.push(k);
|
|
}
|
|
});
|
|
return headers;
|
|
},
|
|
|
|
signature: function signature(credentials) {
|
|
return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64');
|
|
},
|
|
|
|
stringToSign: function stringToSign() {
|
|
var parts = [];
|
|
parts.push(this.request.method);
|
|
parts.push('/');
|
|
parts.push('');
|
|
parts.push(this.canonicalHeaders());
|
|
parts.push(this.request.body);
|
|
return AWS.util.crypto.sha256(parts.join('\n'));
|
|
}
|
|
|
|
});
|
|
|
|
module.exports = AWS.Signers.V3;
|
|
|
|
},{"../core":29}],69:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
require('./v3');
|
|
|
|
|
|
AWS.Signers.V3Https = inherit(AWS.Signers.V3, {
|
|
authorization: function authorization(credentials) {
|
|
return 'AWS3-HTTPS ' +
|
|
'AWSAccessKeyId=' + credentials.accessKeyId + ',' +
|
|
'Algorithm=HmacSHA256,' +
|
|
'Signature=' + this.signature(credentials);
|
|
},
|
|
|
|
stringToSign: function stringToSign() {
|
|
return this.request.headers['X-Amz-Date'];
|
|
}
|
|
});
|
|
|
|
module.exports = AWS.Signers.V3Https;
|
|
|
|
},{"../core":29,"./v3":68}],70:[function(require,module,exports){
|
|
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
|
|
var cachedSecret = {};
|
|
|
|
|
|
var cacheQueue = [];
|
|
|
|
|
|
var maxCacheEntries = 50;
|
|
|
|
|
|
var expiresHeader = 'presigned-expires';
|
|
|
|
|
|
AWS.Signers.V4 = inherit(AWS.Signers.RequestSigner, {
|
|
constructor: function V4(request, serviceName, signatureCache) {
|
|
AWS.Signers.RequestSigner.call(this, request);
|
|
this.serviceName = serviceName;
|
|
this.signatureCache = signatureCache;
|
|
},
|
|
|
|
algorithm: 'AWS4-HMAC-SHA256',
|
|
|
|
addAuthorization: function addAuthorization(credentials, date) {
|
|
var datetime = AWS.util.date.iso8601(date).replace(/[:\-]|\.\d{3}/g, '');
|
|
|
|
if (this.isPresigned()) {
|
|
this.updateForPresigned(credentials, datetime);
|
|
} else {
|
|
this.addHeaders(credentials, datetime);
|
|
}
|
|
|
|
this.request.headers['Authorization'] =
|
|
this.authorization(credentials, datetime);
|
|
},
|
|
|
|
addHeaders: function addHeaders(credentials, datetime) {
|
|
this.request.headers['X-Amz-Date'] = datetime;
|
|
if (credentials.sessionToken) {
|
|
this.request.headers['x-amz-security-token'] = credentials.sessionToken;
|
|
}
|
|
},
|
|
|
|
updateForPresigned: function updateForPresigned(credentials, datetime) {
|
|
var credString = this.credentialString(datetime);
|
|
var qs = {
|
|
'X-Amz-Date': datetime,
|
|
'X-Amz-Algorithm': this.algorithm,
|
|
'X-Amz-Credential': credentials.accessKeyId + '/' + credString,
|
|
'X-Amz-Expires': this.request.headers[expiresHeader],
|
|
'X-Amz-SignedHeaders': this.signedHeaders()
|
|
};
|
|
|
|
if (credentials.sessionToken) {
|
|
qs['X-Amz-Security-Token'] = credentials.sessionToken;
|
|
}
|
|
|
|
if (this.request.headers['Content-Type']) {
|
|
qs['Content-Type'] = this.request.headers['Content-Type'];
|
|
}
|
|
if (this.request.headers['Content-MD5']) {
|
|
qs['Content-MD5'] = this.request.headers['Content-MD5'];
|
|
}
|
|
if (this.request.headers['Cache-Control']) {
|
|
qs['Cache-Control'] = this.request.headers['Cache-Control'];
|
|
}
|
|
|
|
AWS.util.each.call(this, this.request.headers, function(key, value) {
|
|
if (key === expiresHeader) return;
|
|
if (this.isSignableHeader(key)) {
|
|
var lowerKey = key.toLowerCase();
|
|
if (lowerKey.indexOf('x-amz-meta-') === 0) {
|
|
qs[lowerKey] = value;
|
|
} else if (lowerKey.indexOf('x-amz-') === 0) {
|
|
qs[key] = value;
|
|
}
|
|
}
|
|
});
|
|
|
|
var sep = this.request.path.indexOf('?') >= 0 ? '&' : '?';
|
|
this.request.path += sep + AWS.util.queryParamsToString(qs);
|
|
},
|
|
|
|
authorization: function authorization(credentials, datetime) {
|
|
var parts = [];
|
|
var credString = this.credentialString(datetime);
|
|
parts.push(this.algorithm + ' Credential=' +
|
|
credentials.accessKeyId + '/' + credString);
|
|
parts.push('SignedHeaders=' + this.signedHeaders());
|
|
parts.push('Signature=' + this.signature(credentials, datetime));
|
|
return parts.join(', ');
|
|
},
|
|
|
|
signature: function signature(credentials, datetime) {
|
|
var cache = null;
|
|
var cacheIdentifier = this.serviceName + (this.getServiceClientId() ? '_' + this.getServiceClientId() : '');
|
|
if (this.signatureCache) {
|
|
var cache = cachedSecret[cacheIdentifier];
|
|
if (!cache) {
|
|
cacheQueue.push(cacheIdentifier);
|
|
if (cacheQueue.length > maxCacheEntries) {
|
|
delete cachedSecret[cacheQueue.shift()];
|
|
}
|
|
}
|
|
|
|
}
|
|
var date = datetime.substr(0, 8);
|
|
|
|
if (!cache ||
|
|
cache.akid !== credentials.accessKeyId ||
|
|
cache.region !== this.request.region ||
|
|
cache.date !== date) {
|
|
|
|
var kSecret = credentials.secretAccessKey;
|
|
var kDate = AWS.util.crypto.hmac('AWS4' + kSecret, date, 'buffer');
|
|
var kRegion = AWS.util.crypto.hmac(kDate, this.request.region, 'buffer');
|
|
var kService = AWS.util.crypto.hmac(kRegion, this.serviceName, 'buffer');
|
|
var kCredentials = AWS.util.crypto.hmac(kService, 'aws4_request', 'buffer');
|
|
|
|
if (!this.signatureCache) {
|
|
return AWS.util.crypto.hmac(kCredentials, this.stringToSign(datetime), 'hex');
|
|
}
|
|
|
|
cachedSecret[cacheIdentifier] = {
|
|
region: this.request.region, date: date,
|
|
key: kCredentials, akid: credentials.accessKeyId
|
|
};
|
|
}
|
|
|
|
var key = cachedSecret[cacheIdentifier].key;
|
|
return AWS.util.crypto.hmac(key, this.stringToSign(datetime), 'hex');
|
|
},
|
|
|
|
stringToSign: function stringToSign(datetime) {
|
|
var parts = [];
|
|
parts.push('AWS4-HMAC-SHA256');
|
|
parts.push(datetime);
|
|
parts.push(this.credentialString(datetime));
|
|
parts.push(this.hexEncodedHash(this.canonicalString()));
|
|
return parts.join('\n');
|
|
},
|
|
|
|
canonicalString: function canonicalString() {
|
|
var parts = [], pathname = this.request.pathname();
|
|
if (this.serviceName !== 's3') pathname = AWS.util.uriEscapePath(pathname);
|
|
|
|
parts.push(this.request.method);
|
|
parts.push(pathname);
|
|
parts.push(this.request.search());
|
|
parts.push(this.canonicalHeaders() + '\n');
|
|
parts.push(this.signedHeaders());
|
|
parts.push(this.hexEncodedBodyHash());
|
|
return parts.join('\n');
|
|
},
|
|
|
|
canonicalHeaders: function canonicalHeaders() {
|
|
var headers = [];
|
|
AWS.util.each.call(this, this.request.headers, function (key, item) {
|
|
headers.push([key, item]);
|
|
});
|
|
headers.sort(function (a, b) {
|
|
return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : 1;
|
|
});
|
|
var parts = [];
|
|
AWS.util.arrayEach.call(this, headers, function (item) {
|
|
var key = item[0].toLowerCase();
|
|
if (this.isSignableHeader(key)) {
|
|
parts.push(key + ':' +
|
|
this.canonicalHeaderValues(item[1].toString()));
|
|
}
|
|
});
|
|
return parts.join('\n');
|
|
},
|
|
|
|
canonicalHeaderValues: function canonicalHeaderValues(values) {
|
|
return values.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '');
|
|
},
|
|
|
|
signedHeaders: function signedHeaders() {
|
|
var keys = [];
|
|
AWS.util.each.call(this, this.request.headers, function (key) {
|
|
key = key.toLowerCase();
|
|
if (this.isSignableHeader(key)) keys.push(key);
|
|
});
|
|
return keys.sort().join(';');
|
|
},
|
|
|
|
credentialString: function credentialString(datetime) {
|
|
var parts = [];
|
|
parts.push(datetime.substr(0, 8));
|
|
parts.push(this.request.region);
|
|
parts.push(this.serviceName);
|
|
parts.push('aws4_request');
|
|
return parts.join('/');
|
|
},
|
|
|
|
hexEncodedHash: function hash(string) {
|
|
return AWS.util.crypto.sha256(string, 'hex');
|
|
},
|
|
|
|
hexEncodedBodyHash: function hexEncodedBodyHash() {
|
|
if (this.isPresigned() && this.serviceName === 's3' && !this.request.body) {
|
|
return 'UNSIGNED-PAYLOAD';
|
|
} else if (this.request.headers['X-Amz-Content-Sha256']) {
|
|
return this.request.headers['X-Amz-Content-Sha256'];
|
|
} else {
|
|
return this.hexEncodedHash(this.request.body || '');
|
|
}
|
|
},
|
|
|
|
unsignableHeaders: [
|
|
'authorization',
|
|
'content-type',
|
|
'content-length',
|
|
'user-agent',
|
|
expiresHeader,
|
|
'expect',
|
|
'x-amzn-trace-id'
|
|
],
|
|
|
|
isSignableHeader: function isSignableHeader(key) {
|
|
if (key.toLowerCase().indexOf('x-amz-') === 0) return true;
|
|
return this.unsignableHeaders.indexOf(key) < 0;
|
|
},
|
|
|
|
isPresigned: function isPresigned() {
|
|
return this.request.headers[expiresHeader] ? true : false;
|
|
}
|
|
|
|
});
|
|
|
|
module.exports = AWS.Signers.V4;
|
|
|
|
},{"../core":29}],71:[function(require,module,exports){
|
|
function AcceptorStateMachine(states, state) {
|
|
this.currentState = state || null;
|
|
this.states = states || {};
|
|
}
|
|
|
|
AcceptorStateMachine.prototype.runTo = function runTo(finalState, done, bindObject, inputError) {
|
|
if (typeof finalState === 'function') {
|
|
inputError = bindObject; bindObject = done;
|
|
done = finalState; finalState = null;
|
|
}
|
|
|
|
var self = this;
|
|
var state = self.states[self.currentState];
|
|
state.fn.call(bindObject || self, inputError, function(err) {
|
|
if (err) {
|
|
if (state.fail) self.currentState = state.fail;
|
|
else return done ? done.call(bindObject, err) : null;
|
|
} else {
|
|
if (state.accept) self.currentState = state.accept;
|
|
else return done ? done.call(bindObject) : null;
|
|
}
|
|
if (self.currentState === finalState) {
|
|
return done ? done.call(bindObject, err) : null;
|
|
}
|
|
|
|
self.runTo(finalState, done, bindObject, err);
|
|
});
|
|
};
|
|
|
|
AcceptorStateMachine.prototype.addState = function addState(name, acceptState, failState, fn) {
|
|
if (typeof acceptState === 'function') {
|
|
fn = acceptState; acceptState = null; failState = null;
|
|
} else if (typeof failState === 'function') {
|
|
fn = failState; failState = null;
|
|
}
|
|
|
|
if (!this.currentState) this.currentState = name;
|
|
this.states[name] = { accept: acceptState, fail: failState, fn: fn };
|
|
return this;
|
|
};
|
|
|
|
module.exports = AcceptorStateMachine;
|
|
|
|
},{}],72:[function(require,module,exports){
|
|
(function (process){
|
|
|
|
var AWS;
|
|
|
|
|
|
var util = {
|
|
engine: function engine() {
|
|
if (util.isBrowser() && typeof navigator !== 'undefined') {
|
|
return navigator.userAgent;
|
|
} else {
|
|
var engine = process.platform + '/' + process.version;
|
|
if (process.env.AWS_EXECUTION_ENV) {
|
|
engine += ' exec-env/' + process.env.AWS_EXECUTION_ENV;
|
|
}
|
|
return engine;
|
|
}
|
|
},
|
|
|
|
userAgent: function userAgent() {
|
|
var name = util.isBrowser() ? 'js' : 'nodejs';
|
|
var agent = 'jibo-server-client-' + name + '/' + require('./core').VERSION;
|
|
if (name === 'nodejs') agent += ' ' + util.engine();
|
|
return agent;
|
|
},
|
|
|
|
isBrowser: function isBrowser() { return process && process.browser; },
|
|
isNode: function isNode() { return !util.isBrowser(); },
|
|
uriEscape: function uriEscape(string) {
|
|
var output = encodeURIComponent(string);
|
|
output = output.replace(/[^A-Za-z0-9_.~\-%]+/g, escape);
|
|
|
|
output = output.replace(/[*]/g, function(ch) {
|
|
return '%' + ch.charCodeAt(0).toString(16).toUpperCase();
|
|
});
|
|
|
|
return output;
|
|
},
|
|
|
|
uriEscapePath: function uriEscapePath(string) {
|
|
var parts = [];
|
|
util.arrayEach(string.split('/'), function (part) {
|
|
parts.push(util.uriEscape(part));
|
|
});
|
|
return parts.join('/');
|
|
},
|
|
|
|
urlParse: function urlParse(url) {
|
|
return util.url.parse(url);
|
|
},
|
|
|
|
urlFormat: function urlFormat(url) {
|
|
return util.url.format(url);
|
|
},
|
|
|
|
queryStringParse: function queryStringParse(qs) {
|
|
return util.querystring.parse(qs);
|
|
},
|
|
|
|
queryParamsToString: function queryParamsToString(params) {
|
|
var items = [];
|
|
var escape = util.uriEscape;
|
|
var sortedKeys = Object.keys(params).sort();
|
|
|
|
util.arrayEach(sortedKeys, function(name) {
|
|
var value = params[name];
|
|
var ename = escape(name);
|
|
var result = ename + '=';
|
|
if (Array.isArray(value)) {
|
|
var vals = [];
|
|
util.arrayEach(value, function(item) { vals.push(escape(item)); });
|
|
result = ename + '=' + vals.sort().join('&' + ename + '=');
|
|
} else if (value !== undefined && value !== null) {
|
|
result = ename + '=' + escape(value);
|
|
}
|
|
items.push(result);
|
|
});
|
|
|
|
return items.join('&');
|
|
},
|
|
|
|
readFileSync: function readFileSync(path) {
|
|
if (util.isBrowser()) return null;
|
|
return require('fs').readFileSync(path, 'utf-8');
|
|
},
|
|
|
|
base64: {
|
|
encode: function encode64(string) {
|
|
if (typeof string === 'number') {
|
|
throw util.error(new Error('Cannot base64 encode number ' + string));
|
|
}
|
|
var buf = (typeof util.Buffer.from === 'function' && util.Buffer.from !== Uint8Array.from) ? util.Buffer.from(string) : new util.Buffer(string);
|
|
return buf.toString('base64');
|
|
},
|
|
|
|
decode: function decode64(string) {
|
|
if (typeof string === 'number') {
|
|
throw util.error(new Error('Cannot base64 decode number ' + string));
|
|
}
|
|
return (typeof util.Buffer.from === 'function' && util.Buffer.from !== Uint8Array.from) ? util.Buffer.from(string, 'base64') : new util.Buffer(string, 'base64');
|
|
}
|
|
|
|
},
|
|
|
|
buffer: {
|
|
toStream: function toStream(buffer) {
|
|
if (!util.Buffer.isBuffer(buffer)) buffer = new util.Buffer(buffer);
|
|
|
|
var readable = new (util.stream.Readable)();
|
|
var pos = 0;
|
|
readable._read = function(size) {
|
|
if (pos >= buffer.length) return readable.push(null);
|
|
|
|
var end = pos + size;
|
|
if (end > buffer.length) end = buffer.length;
|
|
readable.push(buffer.slice(pos, end));
|
|
pos = end;
|
|
};
|
|
|
|
return readable;
|
|
},
|
|
|
|
|
|
concat: function(buffers) {
|
|
var length = 0,
|
|
offset = 0,
|
|
buffer = null, i;
|
|
|
|
for (i = 0; i < buffers.length; i++) {
|
|
length += buffers[i].length;
|
|
}
|
|
|
|
buffer = new util.Buffer(length);
|
|
|
|
for (i = 0; i < buffers.length; i++) {
|
|
buffers[i].copy(buffer, offset);
|
|
offset += buffers[i].length;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
},
|
|
|
|
string: {
|
|
byteLength: function byteLength(string) {
|
|
if (string === null || string === undefined) return 0;
|
|
if (typeof string === 'string') string = new util.Buffer(string);
|
|
|
|
if (typeof string.byteLength === 'number') {
|
|
return string.byteLength;
|
|
} else if (typeof string.length === 'number') {
|
|
return string.length;
|
|
} else if (typeof string.size === 'number') {
|
|
return string.size;
|
|
} else if (typeof string.path === 'string') {
|
|
return require('fs').lstatSync(string.path).size;
|
|
} else {
|
|
throw util.error(new Error('Cannot determine length of ' + string),
|
|
{ object: string });
|
|
}
|
|
},
|
|
|
|
upperFirst: function upperFirst(string) {
|
|
return string[0].toUpperCase() + string.substr(1);
|
|
},
|
|
|
|
lowerFirst: function lowerFirst(string) {
|
|
return string[0].toLowerCase() + string.substr(1);
|
|
}
|
|
},
|
|
|
|
ini: {
|
|
parse: function string(ini) {
|
|
var currentSection, map = {};
|
|
util.arrayEach(ini.split(/\r?\n/), function(line) {
|
|
line = line.split(/(^|\s)[;#]/)[0]; // remove comments
|
|
var section = line.match(/^\s*\[([^\[\]]+)\]\s*$/);
|
|
if (section) {
|
|
currentSection = section[1];
|
|
} else if (currentSection) {
|
|
var item = line.match(/^\s*(.+?)\s*=\s*(.+?)\s*$/);
|
|
if (item) {
|
|
map[currentSection] = map[currentSection] || {};
|
|
map[currentSection][item[1]] = item[2];
|
|
}
|
|
}
|
|
});
|
|
|
|
return map;
|
|
}
|
|
},
|
|
|
|
fn: {
|
|
noop: function() {},
|
|
|
|
|
|
makeAsync: function makeAsync(fn, expectedArgs) {
|
|
if (expectedArgs && expectedArgs <= fn.length) {
|
|
return fn;
|
|
}
|
|
|
|
return function() {
|
|
var args = Array.prototype.slice.call(arguments, 0);
|
|
var callback = args.pop();
|
|
var result = fn.apply(null, args);
|
|
callback(result);
|
|
};
|
|
}
|
|
},
|
|
|
|
|
|
date: {
|
|
|
|
|
|
getDate: function getDate() {
|
|
if (!AWS) AWS = require('./core');
|
|
if (AWS.config.systemClockOffset) { // use offset when non-zero
|
|
return new Date(new Date().getTime() + AWS.config.systemClockOffset);
|
|
} else {
|
|
return new Date();
|
|
}
|
|
},
|
|
|
|
|
|
iso8601: function iso8601(date) {
|
|
if (date === undefined) { date = util.date.getDate(); }
|
|
return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
},
|
|
|
|
|
|
rfc822: function rfc822(date) {
|
|
if (date === undefined) { date = util.date.getDate(); }
|
|
return date.toUTCString();
|
|
},
|
|
|
|
|
|
unixTimestamp: function unixTimestamp(date) {
|
|
if (date === undefined) { date = util.date.getDate(); }
|
|
return date.getTime() / 1000;
|
|
},
|
|
|
|
|
|
from: function format(date) {
|
|
if (typeof date === 'number') {
|
|
return new Date(date * 1000); // unix timestamp
|
|
} else {
|
|
return new Date(date);
|
|
}
|
|
},
|
|
|
|
|
|
format: function format(date, formatter) {
|
|
if (!formatter) formatter = 'iso8601';
|
|
return util.date[formatter](util.date.from(date));
|
|
},
|
|
|
|
parseTimestamp: function parseTimestamp(value) {
|
|
if (typeof value === 'number') { // unix timestamp (number)
|
|
return new Date(value * 1000);
|
|
} else if (value.match(/^\d+$/)) { // unix timestamp
|
|
return new Date(value * 1000);
|
|
} else if (value.match(/^\d{4}/)) { // iso8601
|
|
return new Date(value);
|
|
} else if (value.match(/^\w{3},/)) { // rfc822
|
|
return new Date(value);
|
|
} else {
|
|
throw util.error(
|
|
new Error('unhandled timestamp format: ' + value),
|
|
{code: 'TimestampParserError'});
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
crypto: {
|
|
crc32Table: [
|
|
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419,
|
|
0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4,
|
|
0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,
|
|
0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
|
|
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856,
|
|
0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
|
|
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
|
|
0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
|
|
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3,
|
|
0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A,
|
|
0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599,
|
|
0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
|
|
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190,
|
|
0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
|
|
0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E,
|
|
0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
|
|
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED,
|
|
0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
|
|
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,
|
|
0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
|
|
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A,
|
|
0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,
|
|
0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010,
|
|
0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
|
|
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17,
|
|
0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6,
|
|
0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615,
|
|
0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
|
|
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344,
|
|
0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
|
|
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,
|
|
0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
|
|
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1,
|
|
0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C,
|
|
0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,
|
|
0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
|
|
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE,
|
|
0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,
|
|
0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C,
|
|
0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
|
|
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B,
|
|
0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
|
|
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,
|
|
0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
|
|
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278,
|
|
0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,
|
|
0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66,
|
|
0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
|
|
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605,
|
|
0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8,
|
|
0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B,
|
|
0x2D02EF8D],
|
|
|
|
crc32: function crc32(data) {
|
|
var tbl = util.crypto.crc32Table;
|
|
var crc = 0 ^ -1;
|
|
|
|
if (typeof data === 'string') {
|
|
data = new util.Buffer(data);
|
|
}
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
var code = data.readUInt8(i);
|
|
crc = (crc >>> 8) ^ tbl[(crc ^ code) & 0xFF];
|
|
}
|
|
return (crc ^ -1) >>> 0;
|
|
},
|
|
|
|
hmac: function hmac(key, string, digest, fn) {
|
|
if (!digest) digest = 'binary';
|
|
if (digest === 'buffer') { digest = undefined; }
|
|
if (!fn) fn = 'sha256';
|
|
if (typeof string === 'string') string = new util.Buffer(string);
|
|
return util.crypto.lib.createHmac(fn, key).update(string).digest(digest);
|
|
},
|
|
|
|
md5: function md5(data, digest, callback) {
|
|
return util.crypto.hash('md5', data, digest, callback);
|
|
},
|
|
|
|
sha256: function sha256(data, digest, callback) {
|
|
return util.crypto.hash('sha256', data, digest, callback);
|
|
},
|
|
|
|
hash: function(algorithm, data, digest, callback) {
|
|
var hash = util.crypto.createHash(algorithm);
|
|
if (!digest) { digest = 'binary'; }
|
|
if (digest === 'buffer') { digest = undefined; }
|
|
if (typeof data === 'string') data = new util.Buffer(data);
|
|
var sliceFn = util.arraySliceFn(data);
|
|
var isBuffer = util.Buffer.isBuffer(data);
|
|
if (util.isBrowser() && typeof ArrayBuffer !== 'undefined' && data && data.buffer instanceof ArrayBuffer) isBuffer = true;
|
|
|
|
if (callback && typeof data === 'object' &&
|
|
typeof data.on === 'function' && !isBuffer) {
|
|
data.on('data', function(chunk) { hash.update(chunk); });
|
|
data.on('error', function(err) { callback(err); });
|
|
data.on('end', function() { callback(null, hash.digest(digest)); });
|
|
} else if (callback && sliceFn && !isBuffer &&
|
|
typeof FileReader !== 'undefined') {
|
|
var index = 0, size = 1024 * 512;
|
|
var reader = new FileReader();
|
|
reader.onerror = function() {
|
|
callback(new Error('Failed to read data.'));
|
|
};
|
|
reader.onload = function() {
|
|
var buf = new util.Buffer(new Uint8Array(reader.result));
|
|
hash.update(buf);
|
|
index += buf.length;
|
|
reader._continueReading();
|
|
};
|
|
reader._continueReading = function() {
|
|
if (index >= data.size) {
|
|
callback(null, hash.digest(digest));
|
|
return;
|
|
}
|
|
|
|
var back = index + size;
|
|
if (back > data.size) back = data.size;
|
|
reader.readAsArrayBuffer(sliceFn.call(data, index, back));
|
|
};
|
|
|
|
reader._continueReading();
|
|
} else {
|
|
if (util.isBrowser() && typeof data === 'object' && !isBuffer) {
|
|
data = new util.Buffer(new Uint8Array(data));
|
|
}
|
|
var out = hash.update(data).digest(digest);
|
|
if (callback) callback(null, out);
|
|
return out;
|
|
}
|
|
},
|
|
|
|
toHex: function toHex(data) {
|
|
var out = [];
|
|
for (var i = 0; i < data.length; i++) {
|
|
out.push(('0' + data.charCodeAt(i).toString(16)).substr(-2, 2));
|
|
}
|
|
return out.join('');
|
|
},
|
|
|
|
createHash: function createHash(algorithm) {
|
|
return util.crypto.lib.createHash(algorithm);
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
abort: {},
|
|
|
|
each: function each(object, iterFunction) {
|
|
for (var key in object) {
|
|
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
var ret = iterFunction.call(this, key, object[key]);
|
|
if (ret === util.abort) break;
|
|
}
|
|
}
|
|
},
|
|
|
|
arrayEach: function arrayEach(array, iterFunction) {
|
|
for (var idx in array) {
|
|
if (Object.prototype.hasOwnProperty.call(array, idx)) {
|
|
var ret = iterFunction.call(this, array[idx], parseInt(idx, 10));
|
|
if (ret === util.abort) break;
|
|
}
|
|
}
|
|
},
|
|
|
|
update: function update(obj1, obj2) {
|
|
util.each(obj2, function iterator(key, item) {
|
|
obj1[key] = item;
|
|
});
|
|
return obj1;
|
|
},
|
|
|
|
merge: function merge(obj1, obj2) {
|
|
return util.update(util.copy(obj1), obj2);
|
|
},
|
|
|
|
copy: function copy(object) {
|
|
if (object === null || object === undefined) return object;
|
|
var dupe = {};
|
|
for (var key in object) {
|
|
dupe[key] = object[key];
|
|
}
|
|
return dupe;
|
|
},
|
|
|
|
isEmpty: function isEmpty(obj) {
|
|
for (var prop in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
|
|
arraySliceFn: function arraySliceFn(obj) {
|
|
var fn = obj.slice || obj.webkitSlice || obj.mozSlice;
|
|
return typeof fn === 'function' ? fn : null;
|
|
},
|
|
|
|
isType: function isType(obj, type) {
|
|
if (typeof type === 'function') type = util.typeName(type);
|
|
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
|
|
},
|
|
|
|
typeName: function typeName(type) {
|
|
if (Object.prototype.hasOwnProperty.call(type, 'name')) return type.name;
|
|
var str = type.toString();
|
|
var match = str.match(/^\s*function (.+)\(/);
|
|
return match ? match[1] : str;
|
|
},
|
|
|
|
error: function error(err, options) {
|
|
var originalError = null;
|
|
if (typeof err.message === 'string' && err.message !== '') {
|
|
if (typeof options === 'string' || (options && options.message)) {
|
|
originalError = util.copy(err);
|
|
originalError.message = err.message;
|
|
}
|
|
}
|
|
err.message = err.message || null;
|
|
|
|
if (typeof options === 'string') {
|
|
err.message = options;
|
|
} else if (typeof options === 'object' && options !== null) {
|
|
util.update(err, options);
|
|
if (options.message)
|
|
err.message = options.message;
|
|
if (options.code || options.name)
|
|
err.code = options.code || options.name;
|
|
if (options.stack)
|
|
err.stack = options.stack;
|
|
}
|
|
|
|
if (typeof Object.defineProperty === 'function') {
|
|
Object.defineProperty(err, 'name', {writable: true, enumerable: false});
|
|
Object.defineProperty(err, 'message', {enumerable: true});
|
|
}
|
|
|
|
err.name = options && options.name || err.name || err.code || 'Error';
|
|
err.time = new Date();
|
|
|
|
if (originalError) err.originalError = originalError;
|
|
|
|
return err;
|
|
},
|
|
|
|
|
|
inherit: function inherit(klass, features) {
|
|
var newObject = null;
|
|
if (features === undefined) {
|
|
features = klass;
|
|
klass = Object;
|
|
newObject = {};
|
|
} else {
|
|
var ctor = function ConstructorWrapper() {};
|
|
ctor.prototype = klass.prototype;
|
|
newObject = new ctor();
|
|
}
|
|
|
|
if (features.constructor === Object) {
|
|
features.constructor = function() {
|
|
if (klass !== Object) {
|
|
return klass.apply(this, arguments);
|
|
}
|
|
};
|
|
}
|
|
|
|
features.constructor.prototype = newObject;
|
|
util.update(features.constructor.prototype, features);
|
|
features.constructor.__super__ = klass;
|
|
return features.constructor;
|
|
},
|
|
|
|
|
|
mixin: function mixin() {
|
|
var klass = arguments[0];
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
for (var prop in arguments[i].prototype) {
|
|
var fn = arguments[i].prototype[prop];
|
|
if (prop !== 'constructor') {
|
|
klass.prototype[prop] = fn;
|
|
}
|
|
}
|
|
}
|
|
return klass;
|
|
},
|
|
|
|
|
|
hideProperties: function hideProperties(obj, props) {
|
|
if (typeof Object.defineProperty !== 'function') return;
|
|
|
|
util.arrayEach(props, function (key) {
|
|
Object.defineProperty(obj, key, {
|
|
enumerable: false, writable: true, configurable: true });
|
|
});
|
|
},
|
|
|
|
|
|
property: function property(obj, name, value, enumerable, isValue) {
|
|
var opts = {
|
|
configurable: true,
|
|
enumerable: enumerable !== undefined ? enumerable : true
|
|
};
|
|
if (typeof value === 'function' && !isValue) {
|
|
opts.get = value;
|
|
}
|
|
else {
|
|
opts.value = value; opts.writable = true;
|
|
}
|
|
|
|
Object.defineProperty(obj, name, opts);
|
|
},
|
|
|
|
|
|
memoizedProperty: function memoizedProperty(obj, name, get, enumerable) {
|
|
var cachedValue = null;
|
|
|
|
util.property(obj, name, function() {
|
|
if (cachedValue === null) {
|
|
cachedValue = get();
|
|
}
|
|
return cachedValue;
|
|
}, enumerable);
|
|
},
|
|
|
|
|
|
hoistPayloadMember: function hoistPayloadMember(resp) {
|
|
var req = resp.request;
|
|
var operation = req.operation;
|
|
var output = req.service.api.operations[operation].output;
|
|
if (output.payload) {
|
|
var payloadMember = output.members[output.payload];
|
|
var responsePayload = resp.data[output.payload];
|
|
if (payloadMember.type === 'structure') {
|
|
util.each(responsePayload, function(key, value) {
|
|
util.property(resp.data, key, value, false);
|
|
});
|
|
}
|
|
}
|
|
},
|
|
|
|
|
|
computeSha256: function computeSha256(body, done) {
|
|
if (util.isNode()) {
|
|
var Stream = util.stream.Stream;
|
|
var fs = require('fs');
|
|
if (body instanceof Stream) {
|
|
if (typeof body.path === 'string') { // assume file object
|
|
var settings = {};
|
|
if (typeof body.start === 'number') {
|
|
settings.start = body.start;
|
|
}
|
|
if (typeof body.end === 'number') {
|
|
settings.end = body.end;
|
|
}
|
|
body = fs.createReadStream(body.path, settings);
|
|
} else {
|
|
return done(null, 'UNSIGNED-PAYLOAD');
|
|
}
|
|
}
|
|
}
|
|
|
|
util.crypto.sha256(body, 'hex', function(err, sha) {
|
|
if (err) done(err);
|
|
else done(null, sha);
|
|
});
|
|
},
|
|
|
|
|
|
isClockSkewed: function isClockSkewed(serverTime) {
|
|
if (serverTime) {
|
|
util.property(AWS.config, 'isClockSkewed',
|
|
Math.abs(new Date().getTime() - serverTime) >= 300000, false);
|
|
return AWS.config.isClockSkewed;
|
|
}
|
|
},
|
|
|
|
applyClockOffset: function applyClockOffset(serverTime) {
|
|
if (serverTime)
|
|
AWS.config.systemClockOffset = serverTime - new Date().getTime();
|
|
},
|
|
|
|
|
|
extractRequestId: function extractRequestId(resp) {
|
|
var requestId = resp.httpResponse.headers['x-amz-request-id'] ||
|
|
resp.httpResponse.headers['x-amzn-requestid'];
|
|
|
|
if (!requestId && resp.data && resp.data.ResponseMetadata) {
|
|
requestId = resp.data.ResponseMetadata.RequestId;
|
|
}
|
|
|
|
if (requestId) {
|
|
resp.requestId = requestId;
|
|
}
|
|
|
|
if (resp.error) {
|
|
resp.error.requestId = requestId;
|
|
}
|
|
},
|
|
|
|
|
|
addPromises: function addPromises(constructors, PromiseDependency) {
|
|
if (PromiseDependency === undefined && AWS && AWS.config) {
|
|
PromiseDependency = AWS.config.getPromisesDependency();
|
|
}
|
|
if (PromiseDependency === undefined && typeof Promise !== 'undefined') {
|
|
PromiseDependency = Promise;
|
|
}
|
|
if (typeof PromiseDependency !== 'function') var deletePromises = true;
|
|
if (!Array.isArray(constructors)) constructors = [constructors];
|
|
|
|
for (var ind = 0; ind < constructors.length; ind++) {
|
|
var constructor = constructors[ind];
|
|
if (deletePromises) {
|
|
if (constructor.deletePromisesFromClass) {
|
|
constructor.deletePromisesFromClass();
|
|
}
|
|
} else if (constructor.addPromisesToClass) {
|
|
constructor.addPromisesToClass(PromiseDependency);
|
|
}
|
|
}
|
|
},
|
|
|
|
|
|
promisifyMethod: function promisifyMethod(methodName, PromiseDependency) {
|
|
return function promise() {
|
|
var self = this;
|
|
return new PromiseDependency(function(resolve, reject) {
|
|
self[methodName](function(err, data) {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve(data);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
},
|
|
|
|
|
|
isDualstackAvailable: function isDualstackAvailable(service) {
|
|
if (!service) return false;
|
|
var metadata = require('../apis/metadata.json');
|
|
if (typeof service !== 'string') service = service.serviceIdentifier;
|
|
if (typeof service !== 'string' || !metadata.hasOwnProperty(service)) return false;
|
|
return !!metadata[service].dualstackAvailable;
|
|
},
|
|
|
|
|
|
calculateRetryDelay: function calculateRetryDelay(retryCount, retryDelayOptions) {
|
|
if (!retryDelayOptions) retryDelayOptions = {};
|
|
var customBackoff = retryDelayOptions.customBackoff || null;
|
|
if (typeof customBackoff === 'function') {
|
|
return customBackoff(retryCount);
|
|
}
|
|
var base = retryDelayOptions.base || 100;
|
|
var delay = Math.random() * (Math.pow(2, retryCount) * base);
|
|
return delay;
|
|
},
|
|
|
|
|
|
handleRequestWithRetries: function handleRequestWithRetries(httpRequest, options, cb) {
|
|
if (!options) options = {};
|
|
var http = AWS.HttpClient.getInstance();
|
|
var httpOptions = options.httpOptions || {};
|
|
var retryCount = 0;
|
|
|
|
var errCallback = function(err) {
|
|
var maxRetries = options.maxRetries || 0;
|
|
if (err && err.code === 'TimeoutError') err.retryable = true;
|
|
if (err && err.retryable && retryCount < maxRetries) {
|
|
retryCount++;
|
|
var delay = util.calculateRetryDelay(retryCount, options.retryDelayOptions);
|
|
setTimeout(sendRequest, delay + (err.retryAfter || 0));
|
|
} else {
|
|
cb(err);
|
|
}
|
|
};
|
|
|
|
var sendRequest = function() {
|
|
var data = '';
|
|
http.handleRequest(httpRequest, httpOptions, function(httpResponse) {
|
|
httpResponse.on('data', function(chunk) { data += chunk.toString(); });
|
|
httpResponse.on('end', function() {
|
|
var statusCode = httpResponse.statusCode;
|
|
if (statusCode < 300) {
|
|
cb(null, data);
|
|
} else {
|
|
var retryAfter = parseInt(httpResponse.headers['retry-after'], 10) * 1000 || 0;
|
|
var err = util.error(new Error(),
|
|
{ retryable: statusCode >= 500 || statusCode === 429 }
|
|
);
|
|
if (retryAfter && err.retryable) err.retryAfter = retryAfter;
|
|
errCallback(err);
|
|
}
|
|
});
|
|
}, errCallback);
|
|
};
|
|
|
|
process.nextTick(sendRequest);
|
|
}
|
|
|
|
};
|
|
|
|
module.exports = util;
|
|
|
|
}).call(this,require('_process'))
|
|
},{"../apis/metadata.json":13,"./core":29,"_process":274,"fs":100}],73:[function(require,module,exports){
|
|
var util = require('../util');
|
|
var Shape = require('../model/shape');
|
|
|
|
function DomXmlParser() { }
|
|
|
|
DomXmlParser.prototype.parse = function(xml, shape) {
|
|
if (xml.replace(/^\s+/, '') === '') return {};
|
|
|
|
var result, error;
|
|
try {
|
|
if (window.DOMParser) {
|
|
try {
|
|
var parser = new DOMParser();
|
|
result = parser.parseFromString(xml, 'text/xml');
|
|
} catch (syntaxError) {
|
|
throw util.error(new Error('Parse error in document'),
|
|
{
|
|
originalError: syntaxError,
|
|
code: 'XMLParserError',
|
|
retryable: true
|
|
});
|
|
}
|
|
|
|
if (result.documentElement === null) {
|
|
throw util.error(new Error('Cannot parse empty document.'),
|
|
{
|
|
code: 'XMLParserError',
|
|
retryable: true
|
|
});
|
|
}
|
|
|
|
var isError = result.getElementsByTagName('parsererror')[0];
|
|
if (isError && (isError.parentNode === result ||
|
|
isError.parentNode.nodeName === 'body' ||
|
|
isError.parentNode.parentNode === result ||
|
|
isError.parentNode.parentNode.nodeName === 'body')) {
|
|
var errorElement = isError.getElementsByTagName('div')[0] || isError;
|
|
throw util.error(new Error(errorElement.textContent || 'Parser error in document'),
|
|
{
|
|
code: 'XMLParserError',
|
|
retryable: true
|
|
});
|
|
}
|
|
} else if (window.ActiveXObject) {
|
|
result = new window.ActiveXObject('Microsoft.XMLDOM');
|
|
result.async = false;
|
|
|
|
if (!result.loadXML(xml)) {
|
|
throw util.error(new Error('Parse error in document'),
|
|
{
|
|
code: 'XMLParserError',
|
|
retryable: true
|
|
});
|
|
}
|
|
} else {
|
|
throw new Error('Cannot load XML parser');
|
|
}
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
|
|
if (result && result.documentElement && !error) {
|
|
var data = parseXml(result.documentElement, shape);
|
|
var metadata = result.getElementsByTagName('ResponseMetadata')[0];
|
|
if (metadata) {
|
|
data.ResponseMetadata = parseXml(metadata, {});
|
|
}
|
|
return data;
|
|
} else if (error) {
|
|
throw util.error(error || new Error(), {code: 'XMLParserError', retryable: true});
|
|
} else { // empty xml document
|
|
return {};
|
|
}
|
|
};
|
|
|
|
function parseXml(xml, shape) {
|
|
if (!shape) shape = {};
|
|
switch (shape.type) {
|
|
case 'structure': return parseStructure(xml, shape);
|
|
case 'map': return parseMap(xml, shape);
|
|
case 'list': return parseList(xml, shape);
|
|
case undefined: case null: return parseUnknown(xml);
|
|
default: return parseScalar(xml, shape);
|
|
}
|
|
}
|
|
|
|
function parseStructure(xml, shape) {
|
|
var data = {};
|
|
if (xml === null) return data;
|
|
|
|
util.each(shape.members, function(memberName, memberShape) {
|
|
if (memberShape.isXmlAttribute) {
|
|
if (Object.prototype.hasOwnProperty.call(xml.attributes, memberShape.name)) {
|
|
var value = xml.attributes[memberShape.name].value;
|
|
data[memberName] = parseXml({textContent: value}, memberShape);
|
|
}
|
|
} else {
|
|
var xmlChild = memberShape.flattened ? xml :
|
|
xml.getElementsByTagName(memberShape.name)[0];
|
|
if (xmlChild) {
|
|
data[memberName] = parseXml(xmlChild, memberShape);
|
|
} else if (!memberShape.flattened && memberShape.type === 'list') {
|
|
data[memberName] = memberShape.defaultValue;
|
|
}
|
|
}
|
|
});
|
|
|
|
return data;
|
|
}
|
|
|
|
function parseMap(xml, shape) {
|
|
var data = {};
|
|
var xmlKey = shape.key.name || 'key';
|
|
var xmlValue = shape.value.name || 'value';
|
|
var tagName = shape.flattened ? shape.name : 'entry';
|
|
|
|
var child = xml.firstElementChild;
|
|
while (child) {
|
|
if (child.nodeName === tagName) {
|
|
var key = child.getElementsByTagName(xmlKey)[0].textContent;
|
|
var value = child.getElementsByTagName(xmlValue)[0];
|
|
data[key] = parseXml(value, shape.value);
|
|
}
|
|
child = child.nextElementSibling;
|
|
}
|
|
return data;
|
|
}
|
|
|
|
function parseList(xml, shape) {
|
|
var data = [];
|
|
var tagName = shape.flattened ? shape.name : (shape.member.name || 'member');
|
|
|
|
var child = xml.firstElementChild;
|
|
while (child) {
|
|
if (child.nodeName === tagName) {
|
|
data.push(parseXml(child, shape.member));
|
|
}
|
|
child = child.nextElementSibling;
|
|
}
|
|
return data;
|
|
}
|
|
|
|
function parseScalar(xml, shape) {
|
|
if (xml.getAttribute) {
|
|
var encoding = xml.getAttribute('encoding');
|
|
if (encoding === 'base64') {
|
|
shape = new Shape.create({type: encoding});
|
|
}
|
|
}
|
|
|
|
var text = xml.textContent;
|
|
if (text === '') text = null;
|
|
if (typeof shape.toType === 'function') {
|
|
return shape.toType(text);
|
|
} else {
|
|
return text;
|
|
}
|
|
}
|
|
|
|
function parseUnknown(xml) {
|
|
if (xml === undefined || xml === null) return '';
|
|
|
|
if (!xml.firstElementChild) {
|
|
if (xml.parentNode.parentNode === null) return {};
|
|
if (xml.childNodes.length === 0) return '';
|
|
else return xml.textContent;
|
|
}
|
|
|
|
var shape = {type: 'structure', members: {}};
|
|
var child = xml.firstElementChild;
|
|
while (child) {
|
|
var tag = child.nodeName;
|
|
if (Object.prototype.hasOwnProperty.call(shape.members, tag)) {
|
|
shape.members[tag].type = 'list';
|
|
} else {
|
|
shape.members[tag] = {name: tag};
|
|
}
|
|
child = child.nextElementSibling;
|
|
}
|
|
return parseStructure(xml, shape);
|
|
}
|
|
|
|
module.exports = DomXmlParser;
|
|
|
|
},{"../model/shape":42,"../util":72}],74:[function(require,module,exports){
|
|
var util = require('../util');
|
|
var builder = require('xmlbuilder');
|
|
|
|
function XmlBuilder() { }
|
|
|
|
XmlBuilder.prototype.toXML = function(params, shape, rootElement, noEmpty) {
|
|
var xml = builder.create(rootElement);
|
|
applyNamespaces(xml, shape);
|
|
serialize(xml, params, shape);
|
|
return xml.children.length > 0 || noEmpty ? xml.root().toString() : '';
|
|
};
|
|
|
|
function serialize(xml, value, shape) {
|
|
switch (shape.type) {
|
|
case 'structure': return serializeStructure(xml, value, shape);
|
|
case 'map': return serializeMap(xml, value, shape);
|
|
case 'list': return serializeList(xml, value, shape);
|
|
default: return serializeScalar(xml, value, shape);
|
|
}
|
|
}
|
|
|
|
function serializeStructure(xml, params, shape) {
|
|
util.arrayEach(shape.memberNames, function(memberName) {
|
|
var memberShape = shape.members[memberName];
|
|
if (memberShape.location !== 'body') return;
|
|
|
|
var value = params[memberName];
|
|
var name = memberShape.name;
|
|
if (value !== undefined && value !== null) {
|
|
if (memberShape.isXmlAttribute) {
|
|
xml.att(name, value);
|
|
} else if (memberShape.flattened) {
|
|
serialize(xml, value, memberShape);
|
|
} else {
|
|
var element = xml.ele(name);
|
|
applyNamespaces(element, memberShape);
|
|
serialize(element, value, memberShape);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function serializeMap(xml, map, shape) {
|
|
var xmlKey = shape.key.name || 'key';
|
|
var xmlValue = shape.value.name || 'value';
|
|
|
|
util.each(map, function(key, value) {
|
|
var entry = xml.ele(shape.flattened ? shape.name : 'entry');
|
|
serialize(entry.ele(xmlKey), key, shape.key);
|
|
serialize(entry.ele(xmlValue), value, shape.value);
|
|
});
|
|
}
|
|
|
|
function serializeList(xml, list, shape) {
|
|
if (shape.flattened) {
|
|
util.arrayEach(list, function(value) {
|
|
var name = shape.member.name || shape.name;
|
|
var element = xml.ele(name);
|
|
serialize(element, value, shape.member);
|
|
});
|
|
} else {
|
|
util.arrayEach(list, function(value) {
|
|
var name = shape.member.name || 'member';
|
|
var element = xml.ele(name);
|
|
serialize(element, value, shape.member);
|
|
});
|
|
}
|
|
}
|
|
|
|
function serializeScalar(xml, value, shape) {
|
|
xml.txt(shape.toWireFormat(value));
|
|
}
|
|
|
|
function applyNamespaces(xml, shape) {
|
|
var uri, prefix = 'xmlns';
|
|
if (shape.xmlNamespaceUri) {
|
|
uri = shape.xmlNamespaceUri;
|
|
if (shape.xmlNamespacePrefix) prefix += ':' + shape.xmlNamespacePrefix;
|
|
} else if (xml.isRoot && shape.api.xmlNamespaceUri) {
|
|
uri = shape.api.xmlNamespaceUri;
|
|
}
|
|
|
|
if (uri) xml.att(prefix, uri);
|
|
}
|
|
|
|
module.exports = XmlBuilder;
|
|
|
|
},{"../util":72,"xmlbuilder":340}],75:[function(require,module,exports){
|
|
|
|
|
|
|
|
var global = (function() { return this; })();
|
|
|
|
|
|
|
|
var WebSocket = global.WebSocket || global.MozWebSocket;
|
|
|
|
|
|
|
|
module.exports = WebSocket ? ws : null;
|
|
|
|
|
|
|
|
function ws(uri, protocols, opts) {
|
|
var instance;
|
|
if (protocols) {
|
|
instance = new WebSocket(uri, protocols);
|
|
} else {
|
|
instance = new WebSocket(uri);
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
if (WebSocket) ws.prototype = WebSocket.prototype;
|
|
|
|
},{}],76:[function(require,module,exports){
|
|
var asn1 = exports;
|
|
|
|
asn1.bignum = require('bn.js');
|
|
|
|
asn1.define = require('./asn1/api').define;
|
|
asn1.base = require('./asn1/base');
|
|
asn1.constants = require('./asn1/constants');
|
|
asn1.decoders = require('./asn1/decoders');
|
|
asn1.encoders = require('./asn1/encoders');
|
|
|
|
},{"./asn1/api":77,"./asn1/base":79,"./asn1/constants":83,"./asn1/decoders":85,"./asn1/encoders":88,"bn.js":98}],77:[function(require,module,exports){
|
|
var asn1 = require('../asn1');
|
|
var inherits = require('inherits');
|
|
|
|
var api = exports;
|
|
|
|
api.define = function define(name, body) {
|
|
return new Entity(name, body);
|
|
};
|
|
|
|
function Entity(name, body) {
|
|
this.name = name;
|
|
this.body = body;
|
|
|
|
this.decoders = {};
|
|
this.encoders = {};
|
|
};
|
|
|
|
Entity.prototype._createNamed = function createNamed(base) {
|
|
var named;
|
|
try {
|
|
named = require('vm').runInThisContext(
|
|
'(function ' + this.name + '(entity) {\n' +
|
|
' this._initNamed(entity);\n' +
|
|
'})'
|
|
);
|
|
} catch (e) {
|
|
named = function (entity) {
|
|
this._initNamed(entity);
|
|
};
|
|
}
|
|
inherits(named, base);
|
|
named.prototype._initNamed = function initnamed(entity) {
|
|
base.call(this, entity);
|
|
};
|
|
|
|
return new named(this);
|
|
};
|
|
|
|
Entity.prototype._getDecoder = function _getDecoder(enc) {
|
|
enc = enc || 'der';
|
|
if (!this.decoders.hasOwnProperty(enc))
|
|
this.decoders[enc] = this._createNamed(asn1.decoders[enc]);
|
|
return this.decoders[enc];
|
|
};
|
|
|
|
Entity.prototype.decode = function decode(data, enc, options) {
|
|
return this._getDecoder(enc).decode(data, options);
|
|
};
|
|
|
|
Entity.prototype._getEncoder = function _getEncoder(enc) {
|
|
enc = enc || 'der';
|
|
if (!this.encoders.hasOwnProperty(enc))
|
|
this.encoders[enc] = this._createNamed(asn1.encoders[enc]);
|
|
return this.encoders[enc];
|
|
};
|
|
|
|
Entity.prototype.encode = function encode(data, enc, /* internal */ reporter) {
|
|
return this._getEncoder(enc).encode(data, reporter);
|
|
};
|
|
|
|
},{"../asn1":76,"inherits":190,"vm":323}],78:[function(require,module,exports){
|
|
var inherits = require('inherits');
|
|
var Reporter = require('../base').Reporter;
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
function DecoderBuffer(base, options) {
|
|
Reporter.call(this, options);
|
|
if (!Buffer.isBuffer(base)) {
|
|
this.error('Input not Buffer');
|
|
return;
|
|
}
|
|
|
|
this.base = base;
|
|
this.offset = 0;
|
|
this.length = base.length;
|
|
}
|
|
inherits(DecoderBuffer, Reporter);
|
|
exports.DecoderBuffer = DecoderBuffer;
|
|
|
|
DecoderBuffer.prototype.save = function save() {
|
|
return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
|
|
};
|
|
|
|
DecoderBuffer.prototype.restore = function restore(save) {
|
|
var res = new DecoderBuffer(this.base);
|
|
res.offset = save.offset;
|
|
res.length = this.offset;
|
|
|
|
this.offset = save.offset;
|
|
Reporter.prototype.restore.call(this, save.reporter);
|
|
|
|
return res;
|
|
};
|
|
|
|
DecoderBuffer.prototype.isEmpty = function isEmpty() {
|
|
return this.offset === this.length;
|
|
};
|
|
|
|
DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
|
|
if (this.offset + 1 <= this.length)
|
|
return this.base.readUInt8(this.offset++, true);
|
|
else
|
|
return this.error(fail || 'DecoderBuffer overrun');
|
|
}
|
|
|
|
DecoderBuffer.prototype.skip = function skip(bytes, fail) {
|
|
if (!(this.offset + bytes <= this.length))
|
|
return this.error(fail || 'DecoderBuffer overrun');
|
|
|
|
var res = new DecoderBuffer(this.base);
|
|
|
|
res._reporterState = this._reporterState;
|
|
|
|
res.offset = this.offset;
|
|
res.length = this.offset + bytes;
|
|
this.offset += bytes;
|
|
return res;
|
|
}
|
|
|
|
DecoderBuffer.prototype.raw = function raw(save) {
|
|
return this.base.slice(save ? save.offset : this.offset, this.length);
|
|
}
|
|
|
|
function EncoderBuffer(value, reporter) {
|
|
if (Array.isArray(value)) {
|
|
this.length = 0;
|
|
this.value = value.map(function(item) {
|
|
if (!(item instanceof EncoderBuffer))
|
|
item = new EncoderBuffer(item, reporter);
|
|
this.length += item.length;
|
|
return item;
|
|
}, this);
|
|
} else if (typeof value === 'number') {
|
|
if (!(0 <= value && value <= 0xff))
|
|
return reporter.error('non-byte EncoderBuffer value');
|
|
this.value = value;
|
|
this.length = 1;
|
|
} else if (typeof value === 'string') {
|
|
this.value = value;
|
|
this.length = Buffer.byteLength(value);
|
|
} else if (Buffer.isBuffer(value)) {
|
|
this.value = value;
|
|
this.length = value.length;
|
|
} else {
|
|
return reporter.error('Unsupported type: ' + typeof value);
|
|
}
|
|
}
|
|
exports.EncoderBuffer = EncoderBuffer;
|
|
|
|
EncoderBuffer.prototype.join = function join(out, offset) {
|
|
if (!out)
|
|
out = new Buffer(this.length);
|
|
if (!offset)
|
|
offset = 0;
|
|
|
|
if (this.length === 0)
|
|
return out;
|
|
|
|
if (Array.isArray(this.value)) {
|
|
this.value.forEach(function(item) {
|
|
item.join(out, offset);
|
|
offset += item.length;
|
|
});
|
|
} else {
|
|
if (typeof this.value === 'number')
|
|
out[offset] = this.value;
|
|
else if (typeof this.value === 'string')
|
|
out.write(this.value, offset);
|
|
else if (Buffer.isBuffer(this.value))
|
|
this.value.copy(out, offset);
|
|
offset += this.length;
|
|
}
|
|
|
|
return out;
|
|
};
|
|
|
|
},{"../base":79,"buffer":130,"inherits":190}],79:[function(require,module,exports){
|
|
var base = exports;
|
|
|
|
base.Reporter = require('./reporter').Reporter;
|
|
base.DecoderBuffer = require('./buffer').DecoderBuffer;
|
|
base.EncoderBuffer = require('./buffer').EncoderBuffer;
|
|
base.Node = require('./node');
|
|
|
|
},{"./buffer":78,"./node":80,"./reporter":81}],80:[function(require,module,exports){
|
|
var Reporter = require('../base').Reporter;
|
|
var EncoderBuffer = require('../base').EncoderBuffer;
|
|
var DecoderBuffer = require('../base').DecoderBuffer;
|
|
var assert = require('minimalistic-assert');
|
|
|
|
var tags = [
|
|
'seq', 'seqof', 'set', 'setof', 'objid', 'bool',
|
|
'gentime', 'utctime', 'null_', 'enum', 'int', 'objDesc',
|
|
'bitstr', 'bmpstr', 'charstr', 'genstr', 'graphstr', 'ia5str', 'iso646str',
|
|
'numstr', 'octstr', 'printstr', 't61str', 'unistr', 'utf8str', 'videostr'
|
|
];
|
|
|
|
var methods = [
|
|
'key', 'obj', 'use', 'optional', 'explicit', 'implicit', 'def', 'choice',
|
|
'any', 'contains'
|
|
].concat(tags);
|
|
|
|
var overrided = [
|
|
'_peekTag', '_decodeTag', '_use',
|
|
'_decodeStr', '_decodeObjid', '_decodeTime',
|
|
'_decodeNull', '_decodeInt', '_decodeBool', '_decodeList',
|
|
|
|
'_encodeComposite', '_encodeStr', '_encodeObjid', '_encodeTime',
|
|
'_encodeNull', '_encodeInt', '_encodeBool'
|
|
];
|
|
|
|
function Node(enc, parent) {
|
|
var state = {};
|
|
this._baseState = state;
|
|
|
|
state.enc = enc;
|
|
|
|
state.parent = parent || null;
|
|
state.children = null;
|
|
|
|
state.tag = null;
|
|
state.args = null;
|
|
state.reverseArgs = null;
|
|
state.choice = null;
|
|
state.optional = false;
|
|
state.any = false;
|
|
state.obj = false;
|
|
state.use = null;
|
|
state.useDecoder = null;
|
|
state.key = null;
|
|
state['default'] = null;
|
|
state.explicit = null;
|
|
state.implicit = null;
|
|
state.contains = null;
|
|
|
|
if (!state.parent) {
|
|
state.children = [];
|
|
this._wrap();
|
|
}
|
|
}
|
|
module.exports = Node;
|
|
|
|
var stateProps = [
|
|
'enc', 'parent', 'children', 'tag', 'args', 'reverseArgs', 'choice',
|
|
'optional', 'any', 'obj', 'use', 'alteredUse', 'key', 'default', 'explicit',
|
|
'implicit', 'contains'
|
|
];
|
|
|
|
Node.prototype.clone = function clone() {
|
|
var state = this._baseState;
|
|
var cstate = {};
|
|
stateProps.forEach(function(prop) {
|
|
cstate[prop] = state[prop];
|
|
});
|
|
var res = new this.constructor(cstate.parent);
|
|
res._baseState = cstate;
|
|
return res;
|
|
};
|
|
|
|
Node.prototype._wrap = function wrap() {
|
|
var state = this._baseState;
|
|
methods.forEach(function(method) {
|
|
this[method] = function _wrappedMethod() {
|
|
var clone = new this.constructor(this);
|
|
state.children.push(clone);
|
|
return clone[method].apply(clone, arguments);
|
|
};
|
|
}, this);
|
|
};
|
|
|
|
Node.prototype._init = function init(body) {
|
|
var state = this._baseState;
|
|
|
|
assert(state.parent === null);
|
|
body.call(this);
|
|
|
|
state.children = state.children.filter(function(child) {
|
|
return child._baseState.parent === this;
|
|
}, this);
|
|
assert.equal(state.children.length, 1, 'Root node can have only one child');
|
|
};
|
|
|
|
Node.prototype._useArgs = function useArgs(args) {
|
|
var state = this._baseState;
|
|
|
|
var children = args.filter(function(arg) {
|
|
return arg instanceof this.constructor;
|
|
}, this);
|
|
args = args.filter(function(arg) {
|
|
return !(arg instanceof this.constructor);
|
|
}, this);
|
|
|
|
if (children.length !== 0) {
|
|
assert(state.children === null);
|
|
state.children = children;
|
|
|
|
children.forEach(function(child) {
|
|
child._baseState.parent = this;
|
|
}, this);
|
|
}
|
|
if (args.length !== 0) {
|
|
assert(state.args === null);
|
|
state.args = args;
|
|
state.reverseArgs = args.map(function(arg) {
|
|
if (typeof arg !== 'object' || arg.constructor !== Object)
|
|
return arg;
|
|
|
|
var res = {};
|
|
Object.keys(arg).forEach(function(key) {
|
|
if (key == (key | 0))
|
|
key |= 0;
|
|
var value = arg[key];
|
|
res[value] = key;
|
|
});
|
|
return res;
|
|
});
|
|
}
|
|
};
|
|
|
|
|
|
overrided.forEach(function(method) {
|
|
Node.prototype[method] = function _overrided() {
|
|
var state = this._baseState;
|
|
throw new Error(method + ' not implemented for encoding: ' + state.enc);
|
|
};
|
|
});
|
|
|
|
|
|
tags.forEach(function(tag) {
|
|
Node.prototype[tag] = function _tagMethod() {
|
|
var state = this._baseState;
|
|
var args = Array.prototype.slice.call(arguments);
|
|
|
|
assert(state.tag === null);
|
|
state.tag = tag;
|
|
|
|
this._useArgs(args);
|
|
|
|
return this;
|
|
};
|
|
});
|
|
|
|
Node.prototype.use = function use(item) {
|
|
assert(item);
|
|
var state = this._baseState;
|
|
|
|
assert(state.use === null);
|
|
state.use = item;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.optional = function optional() {
|
|
var state = this._baseState;
|
|
|
|
state.optional = true;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.def = function def(val) {
|
|
var state = this._baseState;
|
|
|
|
assert(state['default'] === null);
|
|
state['default'] = val;
|
|
state.optional = true;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.explicit = function explicit(num) {
|
|
var state = this._baseState;
|
|
|
|
assert(state.explicit === null && state.implicit === null);
|
|
state.explicit = num;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.implicit = function implicit(num) {
|
|
var state = this._baseState;
|
|
|
|
assert(state.explicit === null && state.implicit === null);
|
|
state.implicit = num;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.obj = function obj() {
|
|
var state = this._baseState;
|
|
var args = Array.prototype.slice.call(arguments);
|
|
|
|
state.obj = true;
|
|
|
|
if (args.length !== 0)
|
|
this._useArgs(args);
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.key = function key(newKey) {
|
|
var state = this._baseState;
|
|
|
|
assert(state.key === null);
|
|
state.key = newKey;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.any = function any() {
|
|
var state = this._baseState;
|
|
|
|
state.any = true;
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.choice = function choice(obj) {
|
|
var state = this._baseState;
|
|
|
|
assert(state.choice === null);
|
|
state.choice = obj;
|
|
this._useArgs(Object.keys(obj).map(function(key) {
|
|
return obj[key];
|
|
}));
|
|
|
|
return this;
|
|
};
|
|
|
|
Node.prototype.contains = function contains(item) {
|
|
var state = this._baseState;
|
|
|
|
assert(state.use === null);
|
|
state.contains = item;
|
|
|
|
return this;
|
|
};
|
|
|
|
|
|
Node.prototype._decode = function decode(input, options) {
|
|
var state = this._baseState;
|
|
|
|
if (state.parent === null)
|
|
return input.wrapResult(state.children[0]._decode(input, options));
|
|
|
|
var result = state['default'];
|
|
var present = true;
|
|
|
|
var prevKey = null;
|
|
if (state.key !== null)
|
|
prevKey = input.enterKey(state.key);
|
|
|
|
if (state.optional) {
|
|
var tag = null;
|
|
if (state.explicit !== null)
|
|
tag = state.explicit;
|
|
else if (state.implicit !== null)
|
|
tag = state.implicit;
|
|
else if (state.tag !== null)
|
|
tag = state.tag;
|
|
|
|
if (tag === null && !state.any) {
|
|
var save = input.save();
|
|
try {
|
|
if (state.choice === null)
|
|
this._decodeGeneric(state.tag, input, options);
|
|
else
|
|
this._decodeChoice(input, options);
|
|
present = true;
|
|
} catch (e) {
|
|
present = false;
|
|
}
|
|
input.restore(save);
|
|
} else {
|
|
present = this._peekTag(input, tag, state.any);
|
|
|
|
if (input.isError(present))
|
|
return present;
|
|
}
|
|
}
|
|
|
|
var prevObj;
|
|
if (state.obj && present)
|
|
prevObj = input.enterObject();
|
|
|
|
if (present) {
|
|
if (state.explicit !== null) {
|
|
var explicit = this._decodeTag(input, state.explicit);
|
|
if (input.isError(explicit))
|
|
return explicit;
|
|
input = explicit;
|
|
}
|
|
|
|
var start = input.offset;
|
|
|
|
if (state.use === null && state.choice === null) {
|
|
if (state.any)
|
|
var save = input.save();
|
|
var body = this._decodeTag(
|
|
input,
|
|
state.implicit !== null ? state.implicit : state.tag,
|
|
state.any
|
|
);
|
|
if (input.isError(body))
|
|
return body;
|
|
|
|
if (state.any)
|
|
result = input.raw(save);
|
|
else
|
|
input = body;
|
|
}
|
|
|
|
if (options && options.track && state.tag !== null)
|
|
options.track(input.path(), start, input.length, 'tagged');
|
|
|
|
if (options && options.track && state.tag !== null)
|
|
options.track(input.path(), input.offset, input.length, 'content');
|
|
|
|
if (state.any)
|
|
result = result;
|
|
else if (state.choice === null)
|
|
result = this._decodeGeneric(state.tag, input, options);
|
|
else
|
|
result = this._decodeChoice(input, options);
|
|
|
|
if (input.isError(result))
|
|
return result;
|
|
|
|
if (!state.any && state.choice === null && state.children !== null) {
|
|
state.children.forEach(function decodeChildren(child) {
|
|
child._decode(input, options);
|
|
});
|
|
}
|
|
|
|
if (state.contains && (state.tag === 'octstr' || state.tag === 'bitstr')) {
|
|
var data = new DecoderBuffer(result);
|
|
result = this._getUse(state.contains, input._reporterState.obj)
|
|
._decode(data, options);
|
|
}
|
|
}
|
|
|
|
if (state.obj && present)
|
|
result = input.leaveObject(prevObj);
|
|
|
|
if (state.key !== null && (result !== null || present === true))
|
|
input.leaveKey(prevKey, state.key, result);
|
|
else if (prevKey !== null)
|
|
input.exitKey(prevKey);
|
|
|
|
return result;
|
|
};
|
|
|
|
Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options) {
|
|
var state = this._baseState;
|
|
|
|
if (tag === 'seq' || tag === 'set')
|
|
return null;
|
|
if (tag === 'seqof' || tag === 'setof')
|
|
return this._decodeList(input, tag, state.args[0], options);
|
|
else if (/str$/.test(tag))
|
|
return this._decodeStr(input, tag, options);
|
|
else if (tag === 'objid' && state.args)
|
|
return this._decodeObjid(input, state.args[0], state.args[1], options);
|
|
else if (tag === 'objid')
|
|
return this._decodeObjid(input, null, null, options);
|
|
else if (tag === 'gentime' || tag === 'utctime')
|
|
return this._decodeTime(input, tag, options);
|
|
else if (tag === 'null_')
|
|
return this._decodeNull(input, options);
|
|
else if (tag === 'bool')
|
|
return this._decodeBool(input, options);
|
|
else if (tag === 'objDesc')
|
|
return this._decodeStr(input, tag, options);
|
|
else if (tag === 'int' || tag === 'enum')
|
|
return this._decodeInt(input, state.args && state.args[0], options);
|
|
|
|
if (state.use !== null) {
|
|
return this._getUse(state.use, input._reporterState.obj)
|
|
._decode(input, options);
|
|
} else {
|
|
return input.error('unknown tag: ' + tag);
|
|
}
|
|
};
|
|
|
|
Node.prototype._getUse = function _getUse(entity, obj) {
|
|
|
|
var state = this._baseState;
|
|
state.useDecoder = this._use(entity, obj);
|
|
assert(state.useDecoder._baseState.parent === null);
|
|
state.useDecoder = state.useDecoder._baseState.children[0];
|
|
if (state.implicit !== state.useDecoder._baseState.implicit) {
|
|
state.useDecoder = state.useDecoder.clone();
|
|
state.useDecoder._baseState.implicit = state.implicit;
|
|
}
|
|
return state.useDecoder;
|
|
};
|
|
|
|
Node.prototype._decodeChoice = function decodeChoice(input, options) {
|
|
var state = this._baseState;
|
|
var result = null;
|
|
var match = false;
|
|
|
|
Object.keys(state.choice).some(function(key) {
|
|
var save = input.save();
|
|
var node = state.choice[key];
|
|
try {
|
|
var value = node._decode(input, options);
|
|
if (input.isError(value))
|
|
return false;
|
|
|
|
result = { type: key, value: value };
|
|
match = true;
|
|
} catch (e) {
|
|
input.restore(save);
|
|
return false;
|
|
}
|
|
return true;
|
|
}, this);
|
|
|
|
if (!match)
|
|
return input.error('Choice not matched');
|
|
|
|
return result;
|
|
};
|
|
|
|
|
|
Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
|
|
return new EncoderBuffer(data, this.reporter);
|
|
};
|
|
|
|
Node.prototype._encode = function encode(data, reporter, parent) {
|
|
var state = this._baseState;
|
|
if (state['default'] !== null && state['default'] === data)
|
|
return;
|
|
|
|
var result = this._encodeValue(data, reporter, parent);
|
|
if (result === undefined)
|
|
return;
|
|
|
|
if (this._skipDefault(result, reporter, parent))
|
|
return;
|
|
|
|
return result;
|
|
};
|
|
|
|
Node.prototype._encodeValue = function encode(data, reporter, parent) {
|
|
var state = this._baseState;
|
|
|
|
if (state.parent === null)
|
|
return state.children[0]._encode(data, reporter || new Reporter());
|
|
|
|
var result = null;
|
|
|
|
this.reporter = reporter;
|
|
|
|
if (state.optional && data === undefined) {
|
|
if (state['default'] !== null)
|
|
data = state['default']
|
|
else
|
|
return;
|
|
}
|
|
|
|
var content = null;
|
|
var primitive = false;
|
|
if (state.any) {
|
|
result = this._createEncoderBuffer(data);
|
|
} else if (state.choice) {
|
|
result = this._encodeChoice(data, reporter);
|
|
} else if (state.contains) {
|
|
content = this._getUse(state.contains, parent)._encode(data, reporter);
|
|
primitive = true;
|
|
} else if (state.children) {
|
|
content = state.children.map(function(child) {
|
|
if (child._baseState.tag === 'null_')
|
|
return child._encode(null, reporter, data);
|
|
|
|
if (child._baseState.key === null)
|
|
return reporter.error('Child should have a key');
|
|
var prevKey = reporter.enterKey(child._baseState.key);
|
|
|
|
if (typeof data !== 'object')
|
|
return reporter.error('Child expected, but input is not object');
|
|
|
|
var res = child._encode(data[child._baseState.key], reporter, data);
|
|
reporter.leaveKey(prevKey);
|
|
|
|
return res;
|
|
}, this).filter(function(child) {
|
|
return child;
|
|
});
|
|
content = this._createEncoderBuffer(content);
|
|
} else {
|
|
if (state.tag === 'seqof' || state.tag === 'setof') {
|
|
if (!(state.args && state.args.length === 1))
|
|
return reporter.error('Too many args for : ' + state.tag);
|
|
|
|
if (!Array.isArray(data))
|
|
return reporter.error('seqof/setof, but data is not Array');
|
|
|
|
var child = this.clone();
|
|
child._baseState.implicit = null;
|
|
content = this._createEncoderBuffer(data.map(function(item) {
|
|
var state = this._baseState;
|
|
|
|
return this._getUse(state.args[0], data)._encode(item, reporter);
|
|
}, child));
|
|
} else if (state.use !== null) {
|
|
result = this._getUse(state.use, parent)._encode(data, reporter);
|
|
} else {
|
|
content = this._encodePrimitive(state.tag, data);
|
|
primitive = true;
|
|
}
|
|
}
|
|
|
|
var result;
|
|
if (!state.any && state.choice === null) {
|
|
var tag = state.implicit !== null ? state.implicit : state.tag;
|
|
var cls = state.implicit === null ? 'universal' : 'context';
|
|
|
|
if (tag === null) {
|
|
if (state.use === null)
|
|
reporter.error('Tag could be omitted only for .use()');
|
|
} else {
|
|
if (state.use === null)
|
|
result = this._encodeComposite(tag, primitive, cls, content);
|
|
}
|
|
}
|
|
|
|
if (state.explicit !== null)
|
|
result = this._encodeComposite(state.explicit, false, 'context', result);
|
|
|
|
return result;
|
|
};
|
|
|
|
Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
|
|
var state = this._baseState;
|
|
|
|
var node = state.choice[data.type];
|
|
if (!node) {
|
|
assert(
|
|
false,
|
|
data.type + ' not found in ' +
|
|
JSON.stringify(Object.keys(state.choice)));
|
|
}
|
|
return node._encode(data.value, reporter);
|
|
};
|
|
|
|
Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
|
|
var state = this._baseState;
|
|
|
|
if (/str$/.test(tag))
|
|
return this._encodeStr(data, tag);
|
|
else if (tag === 'objid' && state.args)
|
|
return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
|
|
else if (tag === 'objid')
|
|
return this._encodeObjid(data, null, null);
|
|
else if (tag === 'gentime' || tag === 'utctime')
|
|
return this._encodeTime(data, tag);
|
|
else if (tag === 'null_')
|
|
return this._encodeNull();
|
|
else if (tag === 'int' || tag === 'enum')
|
|
return this._encodeInt(data, state.args && state.reverseArgs[0]);
|
|
else if (tag === 'bool')
|
|
return this._encodeBool(data);
|
|
else if (tag === 'objDesc')
|
|
return this._encodeStr(data, tag);
|
|
else
|
|
throw new Error('Unsupported tag: ' + tag);
|
|
};
|
|
|
|
Node.prototype._isNumstr = function isNumstr(str) {
|
|
return /^[0-9 ]*$/.test(str);
|
|
};
|
|
|
|
Node.prototype._isPrintstr = function isPrintstr(str) {
|
|
return /^[A-Za-z0-9 '\(\)\+,\-\.\/:=\?]*$/.test(str);
|
|
};
|
|
|
|
},{"../base":79,"minimalistic-assert":245}],81:[function(require,module,exports){
|
|
var inherits = require('inherits');
|
|
|
|
function Reporter(options) {
|
|
this._reporterState = {
|
|
obj: null,
|
|
path: [],
|
|
options: options || {},
|
|
errors: []
|
|
};
|
|
}
|
|
exports.Reporter = Reporter;
|
|
|
|
Reporter.prototype.isError = function isError(obj) {
|
|
return obj instanceof ReporterError;
|
|
};
|
|
|
|
Reporter.prototype.save = function save() {
|
|
var state = this._reporterState;
|
|
|
|
return { obj: state.obj, pathLen: state.path.length };
|
|
};
|
|
|
|
Reporter.prototype.restore = function restore(data) {
|
|
var state = this._reporterState;
|
|
|
|
state.obj = data.obj;
|
|
state.path = state.path.slice(0, data.pathLen);
|
|
};
|
|
|
|
Reporter.prototype.enterKey = function enterKey(key) {
|
|
return this._reporterState.path.push(key);
|
|
};
|
|
|
|
Reporter.prototype.exitKey = function exitKey(index) {
|
|
var state = this._reporterState;
|
|
|
|
state.path = state.path.slice(0, index - 1);
|
|
};
|
|
|
|
Reporter.prototype.leaveKey = function leaveKey(index, key, value) {
|
|
var state = this._reporterState;
|
|
|
|
this.exitKey(index);
|
|
if (state.obj !== null)
|
|
state.obj[key] = value;
|
|
};
|
|
|
|
Reporter.prototype.path = function path() {
|
|
return this._reporterState.path.join('/');
|
|
};
|
|
|
|
Reporter.prototype.enterObject = function enterObject() {
|
|
var state = this._reporterState;
|
|
|
|
var prev = state.obj;
|
|
state.obj = {};
|
|
return prev;
|
|
};
|
|
|
|
Reporter.prototype.leaveObject = function leaveObject(prev) {
|
|
var state = this._reporterState;
|
|
|
|
var now = state.obj;
|
|
state.obj = prev;
|
|
return now;
|
|
};
|
|
|
|
Reporter.prototype.error = function error(msg) {
|
|
var err;
|
|
var state = this._reporterState;
|
|
|
|
var inherited = msg instanceof ReporterError;
|
|
if (inherited) {
|
|
err = msg;
|
|
} else {
|
|
err = new ReporterError(state.path.map(function(elem) {
|
|
return '[' + JSON.stringify(elem) + ']';
|
|
}).join(''), msg.message || msg, msg.stack);
|
|
}
|
|
|
|
if (!state.options.partial)
|
|
throw err;
|
|
|
|
if (!inherited)
|
|
state.errors.push(err);
|
|
|
|
return err;
|
|
};
|
|
|
|
Reporter.prototype.wrapResult = function wrapResult(result) {
|
|
var state = this._reporterState;
|
|
if (!state.options.partial)
|
|
return result;
|
|
|
|
return {
|
|
result: this.isError(result) ? null : result,
|
|
errors: state.errors
|
|
};
|
|
};
|
|
|
|
function ReporterError(path, msg) {
|
|
this.path = path;
|
|
this.rethrow(msg);
|
|
};
|
|
inherits(ReporterError, Error);
|
|
|
|
ReporterError.prototype.rethrow = function rethrow(msg) {
|
|
this.message = msg + ' at: ' + (this.path || '(shallow)');
|
|
if (Error.captureStackTrace)
|
|
Error.captureStackTrace(this, ReporterError);
|
|
|
|
if (!this.stack) {
|
|
try {
|
|
throw new Error(this.message);
|
|
} catch (e) {
|
|
this.stack = e.stack;
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
|
|
},{"inherits":190}],82:[function(require,module,exports){
|
|
var constants = require('../constants');
|
|
|
|
exports.tagClass = {
|
|
0: 'universal',
|
|
1: 'application',
|
|
2: 'context',
|
|
3: 'private'
|
|
};
|
|
exports.tagClassByName = constants._reverse(exports.tagClass);
|
|
|
|
exports.tag = {
|
|
0x00: 'end',
|
|
0x01: 'bool',
|
|
0x02: 'int',
|
|
0x03: 'bitstr',
|
|
0x04: 'octstr',
|
|
0x05: 'null_',
|
|
0x06: 'objid',
|
|
0x07: 'objDesc',
|
|
0x08: 'external',
|
|
0x09: 'real',
|
|
0x0a: 'enum',
|
|
0x0b: 'embed',
|
|
0x0c: 'utf8str',
|
|
0x0d: 'relativeOid',
|
|
0x10: 'seq',
|
|
0x11: 'set',
|
|
0x12: 'numstr',
|
|
0x13: 'printstr',
|
|
0x14: 't61str',
|
|
0x15: 'videostr',
|
|
0x16: 'ia5str',
|
|
0x17: 'utctime',
|
|
0x18: 'gentime',
|
|
0x19: 'graphstr',
|
|
0x1a: 'iso646str',
|
|
0x1b: 'genstr',
|
|
0x1c: 'unistr',
|
|
0x1d: 'charstr',
|
|
0x1e: 'bmpstr'
|
|
};
|
|
exports.tagByName = constants._reverse(exports.tag);
|
|
|
|
},{"../constants":83}],83:[function(require,module,exports){
|
|
var constants = exports;
|
|
|
|
constants._reverse = function reverse(map) {
|
|
var res = {};
|
|
|
|
Object.keys(map).forEach(function(key) {
|
|
if ((key | 0) == key)
|
|
key = key | 0;
|
|
|
|
var value = map[key];
|
|
res[value] = key;
|
|
});
|
|
|
|
return res;
|
|
};
|
|
|
|
constants.der = require('./der');
|
|
|
|
},{"./der":82}],84:[function(require,module,exports){
|
|
var inherits = require('inherits');
|
|
|
|
var asn1 = require('../../asn1');
|
|
var base = asn1.base;
|
|
var bignum = asn1.bignum;
|
|
|
|
var der = asn1.constants.der;
|
|
|
|
function DERDecoder(entity) {
|
|
this.enc = 'der';
|
|
this.name = entity.name;
|
|
this.entity = entity;
|
|
|
|
this.tree = new DERNode();
|
|
this.tree._init(entity.body);
|
|
};
|
|
module.exports = DERDecoder;
|
|
|
|
DERDecoder.prototype.decode = function decode(data, options) {
|
|
if (!(data instanceof base.DecoderBuffer))
|
|
data = new base.DecoderBuffer(data, options);
|
|
|
|
return this.tree._decode(data, options);
|
|
};
|
|
|
|
|
|
function DERNode(parent) {
|
|
base.Node.call(this, 'der', parent);
|
|
}
|
|
inherits(DERNode, base.Node);
|
|
|
|
DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
|
|
if (buffer.isEmpty())
|
|
return false;
|
|
|
|
var state = buffer.save();
|
|
var decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
|
|
if (buffer.isError(decodedTag))
|
|
return decodedTag;
|
|
|
|
buffer.restore(state);
|
|
|
|
return decodedTag.tag === tag || decodedTag.tagStr === tag ||
|
|
(decodedTag.tagStr + 'of') === tag || any;
|
|
};
|
|
|
|
DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
|
|
var decodedTag = derDecodeTag(buffer,
|
|
'Failed to decode tag of "' + tag + '"');
|
|
if (buffer.isError(decodedTag))
|
|
return decodedTag;
|
|
|
|
var len = derDecodeLen(buffer,
|
|
decodedTag.primitive,
|
|
'Failed to get length of "' + tag + '"');
|
|
|
|
if (buffer.isError(len))
|
|
return len;
|
|
|
|
if (!any &&
|
|
decodedTag.tag !== tag &&
|
|
decodedTag.tagStr !== tag &&
|
|
decodedTag.tagStr + 'of' !== tag) {
|
|
return buffer.error('Failed to match tag: "' + tag + '"');
|
|
}
|
|
|
|
if (decodedTag.primitive || len !== null)
|
|
return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
|
|
|
|
var state = buffer.save();
|
|
var res = this._skipUntilEnd(
|
|
buffer,
|
|
'Failed to skip indefinite length body: "' + this.tag + '"');
|
|
if (buffer.isError(res))
|
|
return res;
|
|
|
|
len = buffer.offset - state.offset;
|
|
buffer.restore(state);
|
|
return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
|
|
};
|
|
|
|
DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
|
|
while (true) {
|
|
var tag = derDecodeTag(buffer, fail);
|
|
if (buffer.isError(tag))
|
|
return tag;
|
|
var len = derDecodeLen(buffer, tag.primitive, fail);
|
|
if (buffer.isError(len))
|
|
return len;
|
|
|
|
var res;
|
|
if (tag.primitive || len !== null)
|
|
res = buffer.skip(len)
|
|
else
|
|
res = this._skipUntilEnd(buffer, fail);
|
|
|
|
if (buffer.isError(res))
|
|
return res;
|
|
|
|
if (tag.tagStr === 'end')
|
|
break;
|
|
}
|
|
};
|
|
|
|
DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder,
|
|
options) {
|
|
var result = [];
|
|
while (!buffer.isEmpty()) {
|
|
var possibleEnd = this._peekTag(buffer, 'end');
|
|
if (buffer.isError(possibleEnd))
|
|
return possibleEnd;
|
|
|
|
var res = decoder.decode(buffer, 'der', options);
|
|
if (buffer.isError(res) && possibleEnd)
|
|
break;
|
|
result.push(res);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
|
|
if (tag === 'bitstr') {
|
|
var unused = buffer.readUInt8();
|
|
if (buffer.isError(unused))
|
|
return unused;
|
|
return { unused: unused, data: buffer.raw() };
|
|
} else if (tag === 'bmpstr') {
|
|
var raw = buffer.raw();
|
|
if (raw.length % 2 === 1)
|
|
return buffer.error('Decoding of string type: bmpstr length mismatch');
|
|
|
|
var str = '';
|
|
for (var i = 0; i < raw.length / 2; i++) {
|
|
str += String.fromCharCode(raw.readUInt16BE(i * 2));
|
|
}
|
|
return str;
|
|
} else if (tag === 'numstr') {
|
|
var numstr = buffer.raw().toString('ascii');
|
|
if (!this._isNumstr(numstr)) {
|
|
return buffer.error('Decoding of string type: ' +
|
|
'numstr unsupported characters');
|
|
}
|
|
return numstr;
|
|
} else if (tag === 'octstr') {
|
|
return buffer.raw();
|
|
} else if (tag === 'objDesc') {
|
|
return buffer.raw();
|
|
} else if (tag === 'printstr') {
|
|
var printstr = buffer.raw().toString('ascii');
|
|
if (!this._isPrintstr(printstr)) {
|
|
return buffer.error('Decoding of string type: ' +
|
|
'printstr unsupported characters');
|
|
}
|
|
return printstr;
|
|
} else if (/str$/.test(tag)) {
|
|
return buffer.raw().toString();
|
|
} else {
|
|
return buffer.error('Decoding of string type: ' + tag + ' unsupported');
|
|
}
|
|
};
|
|
|
|
DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
|
|
var result;
|
|
var identifiers = [];
|
|
var ident = 0;
|
|
while (!buffer.isEmpty()) {
|
|
var subident = buffer.readUInt8();
|
|
ident <<= 7;
|
|
ident |= subident & 0x7f;
|
|
if ((subident & 0x80) === 0) {
|
|
identifiers.push(ident);
|
|
ident = 0;
|
|
}
|
|
}
|
|
if (subident & 0x80)
|
|
identifiers.push(ident);
|
|
|
|
var first = (identifiers[0] / 40) | 0;
|
|
var second = identifiers[0] % 40;
|
|
|
|
if (relative)
|
|
result = identifiers;
|
|
else
|
|
result = [first, second].concat(identifiers.slice(1));
|
|
|
|
if (values) {
|
|
var tmp = values[result.join(' ')];
|
|
if (tmp === undefined)
|
|
tmp = values[result.join('.')];
|
|
if (tmp !== undefined)
|
|
result = tmp;
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
|
|
var str = buffer.raw().toString();
|
|
if (tag === 'gentime') {
|
|
var year = str.slice(0, 4) | 0;
|
|
var mon = str.slice(4, 6) | 0;
|
|
var day = str.slice(6, 8) | 0;
|
|
var hour = str.slice(8, 10) | 0;
|
|
var min = str.slice(10, 12) | 0;
|
|
var sec = str.slice(12, 14) | 0;
|
|
} else if (tag === 'utctime') {
|
|
var year = str.slice(0, 2) | 0;
|
|
var mon = str.slice(2, 4) | 0;
|
|
var day = str.slice(4, 6) | 0;
|
|
var hour = str.slice(6, 8) | 0;
|
|
var min = str.slice(8, 10) | 0;
|
|
var sec = str.slice(10, 12) | 0;
|
|
if (year < 70)
|
|
year = 2000 + year;
|
|
else
|
|
year = 1900 + year;
|
|
} else {
|
|
return buffer.error('Decoding ' + tag + ' time is not supported yet');
|
|
}
|
|
|
|
return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
|
|
};
|
|
|
|
DERNode.prototype._decodeNull = function decodeNull(buffer) {
|
|
return null;
|
|
};
|
|
|
|
DERNode.prototype._decodeBool = function decodeBool(buffer) {
|
|
var res = buffer.readUInt8();
|
|
if (buffer.isError(res))
|
|
return res;
|
|
else
|
|
return res !== 0;
|
|
};
|
|
|
|
DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
|
|
var raw = buffer.raw();
|
|
var res = new bignum(raw);
|
|
|
|
if (values)
|
|
res = values[res.toString(10)] || res;
|
|
|
|
return res;
|
|
};
|
|
|
|
DERNode.prototype._use = function use(entity, obj) {
|
|
if (typeof entity === 'function')
|
|
entity = entity(obj);
|
|
return entity._getDecoder('der').tree;
|
|
};
|
|
|
|
|
|
function derDecodeTag(buf, fail) {
|
|
var tag = buf.readUInt8(fail);
|
|
if (buf.isError(tag))
|
|
return tag;
|
|
|
|
var cls = der.tagClass[tag >> 6];
|
|
var primitive = (tag & 0x20) === 0;
|
|
|
|
if ((tag & 0x1f) === 0x1f) {
|
|
var oct = tag;
|
|
tag = 0;
|
|
while ((oct & 0x80) === 0x80) {
|
|
oct = buf.readUInt8(fail);
|
|
if (buf.isError(oct))
|
|
return oct;
|
|
|
|
tag <<= 7;
|
|
tag |= oct & 0x7f;
|
|
}
|
|
} else {
|
|
tag &= 0x1f;
|
|
}
|
|
var tagStr = der.tag[tag];
|
|
|
|
return {
|
|
cls: cls,
|
|
primitive: primitive,
|
|
tag: tag,
|
|
tagStr: tagStr
|
|
};
|
|
}
|
|
|
|
function derDecodeLen(buf, primitive, fail) {
|
|
var len = buf.readUInt8(fail);
|
|
if (buf.isError(len))
|
|
return len;
|
|
|
|
if (!primitive && len === 0x80)
|
|
return null;
|
|
|
|
if ((len & 0x80) === 0) {
|
|
return len;
|
|
}
|
|
|
|
var num = len & 0x7f;
|
|
if (num > 4)
|
|
return buf.error('length octect is too long');
|
|
|
|
len = 0;
|
|
for (var i = 0; i < num; i++) {
|
|
len <<= 8;
|
|
var j = buf.readUInt8(fail);
|
|
if (buf.isError(j))
|
|
return j;
|
|
len |= j;
|
|
}
|
|
|
|
return len;
|
|
}
|
|
|
|
},{"../../asn1":76,"inherits":190}],85:[function(require,module,exports){
|
|
var decoders = exports;
|
|
|
|
decoders.der = require('./der');
|
|
decoders.pem = require('./pem');
|
|
|
|
},{"./der":84,"./pem":86}],86:[function(require,module,exports){
|
|
var inherits = require('inherits');
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
var DERDecoder = require('./der');
|
|
|
|
function PEMDecoder(entity) {
|
|
DERDecoder.call(this, entity);
|
|
this.enc = 'pem';
|
|
};
|
|
inherits(PEMDecoder, DERDecoder);
|
|
module.exports = PEMDecoder;
|
|
|
|
PEMDecoder.prototype.decode = function decode(data, options) {
|
|
var lines = data.toString().split(/[\r\n]+/g);
|
|
|
|
var label = options.label.toUpperCase();
|
|
|
|
var re = /^-----(BEGIN|END) ([^-]+)-----$/;
|
|
var start = -1;
|
|
var end = -1;
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var match = lines[i].match(re);
|
|
if (match === null)
|
|
continue;
|
|
|
|
if (match[2] !== label)
|
|
continue;
|
|
|
|
if (start === -1) {
|
|
if (match[1] !== 'BEGIN')
|
|
break;
|
|
start = i;
|
|
} else {
|
|
if (match[1] !== 'END')
|
|
break;
|
|
end = i;
|
|
break;
|
|
}
|
|
}
|
|
if (start === -1 || end === -1)
|
|
throw new Error('PEM section not found for: ' + label);
|
|
|
|
var base64 = lines.slice(start + 1, end).join('');
|
|
base64.replace(/[^a-z0-9\+\/=]+/gi, '');
|
|
|
|
var input = new Buffer(base64, 'base64');
|
|
return DERDecoder.prototype.decode.call(this, input, options);
|
|
};
|
|
|
|
},{"./der":84,"buffer":130,"inherits":190}],87:[function(require,module,exports){
|
|
var inherits = require('inherits');
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
var asn1 = require('../../asn1');
|
|
var base = asn1.base;
|
|
|
|
var der = asn1.constants.der;
|
|
|
|
function DEREncoder(entity) {
|
|
this.enc = 'der';
|
|
this.name = entity.name;
|
|
this.entity = entity;
|
|
|
|
this.tree = new DERNode();
|
|
this.tree._init(entity.body);
|
|
};
|
|
module.exports = DEREncoder;
|
|
|
|
DEREncoder.prototype.encode = function encode(data, reporter) {
|
|
return this.tree._encode(data, reporter).join();
|
|
};
|
|
|
|
|
|
function DERNode(parent) {
|
|
base.Node.call(this, 'der', parent);
|
|
}
|
|
inherits(DERNode, base.Node);
|
|
|
|
DERNode.prototype._encodeComposite = function encodeComposite(tag,
|
|
primitive,
|
|
cls,
|
|
content) {
|
|
var encodedTag = encodeTag(tag, primitive, cls, this.reporter);
|
|
|
|
if (content.length < 0x80) {
|
|
var header = new Buffer(2);
|
|
header[0] = encodedTag;
|
|
header[1] = content.length;
|
|
return this._createEncoderBuffer([ header, content ]);
|
|
}
|
|
|
|
var lenOctets = 1;
|
|
for (var i = content.length; i >= 0x100; i >>= 8)
|
|
lenOctets++;
|
|
|
|
var header = new Buffer(1 + 1 + lenOctets);
|
|
header[0] = encodedTag;
|
|
header[1] = 0x80 | lenOctets;
|
|
|
|
for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8)
|
|
header[i] = j & 0xff;
|
|
|
|
return this._createEncoderBuffer([ header, content ]);
|
|
};
|
|
|
|
DERNode.prototype._encodeStr = function encodeStr(str, tag) {
|
|
if (tag === 'bitstr') {
|
|
return this._createEncoderBuffer([ str.unused | 0, str.data ]);
|
|
} else if (tag === 'bmpstr') {
|
|
var buf = new Buffer(str.length * 2);
|
|
for (var i = 0; i < str.length; i++) {
|
|
buf.writeUInt16BE(str.charCodeAt(i), i * 2);
|
|
}
|
|
return this._createEncoderBuffer(buf);
|
|
} else if (tag === 'numstr') {
|
|
if (!this._isNumstr(str)) {
|
|
return this.reporter.error('Encoding of string type: numstr supports ' +
|
|
'only digits and space');
|
|
}
|
|
return this._createEncoderBuffer(str);
|
|
} else if (tag === 'printstr') {
|
|
if (!this._isPrintstr(str)) {
|
|
return this.reporter.error('Encoding of string type: printstr supports ' +
|
|
'only latin upper and lower case letters, ' +
|
|
'digits, space, apostrophe, left and rigth ' +
|
|
'parenthesis, plus sign, comma, hyphen, ' +
|
|
'dot, slash, colon, equal sign, ' +
|
|
'question mark');
|
|
}
|
|
return this._createEncoderBuffer(str);
|
|
} else if (/str$/.test(tag)) {
|
|
return this._createEncoderBuffer(str);
|
|
} else if (tag === 'objDesc') {
|
|
return this._createEncoderBuffer(str);
|
|
} else {
|
|
return this.reporter.error('Encoding of string type: ' + tag +
|
|
' unsupported');
|
|
}
|
|
};
|
|
|
|
DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
|
|
if (typeof id === 'string') {
|
|
if (!values)
|
|
return this.reporter.error('string objid given, but no values map found');
|
|
if (!values.hasOwnProperty(id))
|
|
return this.reporter.error('objid not found in values map');
|
|
id = values[id].split(/[\s\.]+/g);
|
|
for (var i = 0; i < id.length; i++)
|
|
id[i] |= 0;
|
|
} else if (Array.isArray(id)) {
|
|
id = id.slice();
|
|
for (var i = 0; i < id.length; i++)
|
|
id[i] |= 0;
|
|
}
|
|
|
|
if (!Array.isArray(id)) {
|
|
return this.reporter.error('objid() should be either array or string, ' +
|
|
'got: ' + JSON.stringify(id));
|
|
}
|
|
|
|
if (!relative) {
|
|
if (id[1] >= 40)
|
|
return this.reporter.error('Second objid identifier OOB');
|
|
id.splice(0, 2, id[0] * 40 + id[1]);
|
|
}
|
|
|
|
var size = 0;
|
|
for (var i = 0; i < id.length; i++) {
|
|
var ident = id[i];
|
|
for (size++; ident >= 0x80; ident >>= 7)
|
|
size++;
|
|
}
|
|
|
|
var objid = new Buffer(size);
|
|
var offset = objid.length - 1;
|
|
for (var i = id.length - 1; i >= 0; i--) {
|
|
var ident = id[i];
|
|
objid[offset--] = ident & 0x7f;
|
|
while ((ident >>= 7) > 0)
|
|
objid[offset--] = 0x80 | (ident & 0x7f);
|
|
}
|
|
|
|
return this._createEncoderBuffer(objid);
|
|
};
|
|
|
|
function two(num) {
|
|
if (num < 10)
|
|
return '0' + num;
|
|
else
|
|
return num;
|
|
}
|
|
|
|
DERNode.prototype._encodeTime = function encodeTime(time, tag) {
|
|
var str;
|
|
var date = new Date(time);
|
|
|
|
if (tag === 'gentime') {
|
|
str = [
|
|
two(date.getFullYear()),
|
|
two(date.getUTCMonth() + 1),
|
|
two(date.getUTCDate()),
|
|
two(date.getUTCHours()),
|
|
two(date.getUTCMinutes()),
|
|
two(date.getUTCSeconds()),
|
|
'Z'
|
|
].join('');
|
|
} else if (tag === 'utctime') {
|
|
str = [
|
|
two(date.getFullYear() % 100),
|
|
two(date.getUTCMonth() + 1),
|
|
two(date.getUTCDate()),
|
|
two(date.getUTCHours()),
|
|
two(date.getUTCMinutes()),
|
|
two(date.getUTCSeconds()),
|
|
'Z'
|
|
].join('');
|
|
} else {
|
|
this.reporter.error('Encoding ' + tag + ' time is not supported yet');
|
|
}
|
|
|
|
return this._encodeStr(str, 'octstr');
|
|
};
|
|
|
|
DERNode.prototype._encodeNull = function encodeNull() {
|
|
return this._createEncoderBuffer('');
|
|
};
|
|
|
|
DERNode.prototype._encodeInt = function encodeInt(num, values) {
|
|
if (typeof num === 'string') {
|
|
if (!values)
|
|
return this.reporter.error('String int or enum given, but no values map');
|
|
if (!values.hasOwnProperty(num)) {
|
|
return this.reporter.error('Values map doesn\'t contain: ' +
|
|
JSON.stringify(num));
|
|
}
|
|
num = values[num];
|
|
}
|
|
|
|
if (typeof num !== 'number' && !Buffer.isBuffer(num)) {
|
|
var numArray = num.toArray();
|
|
if (!num.sign && numArray[0] & 0x80) {
|
|
numArray.unshift(0);
|
|
}
|
|
num = new Buffer(numArray);
|
|
}
|
|
|
|
if (Buffer.isBuffer(num)) {
|
|
var size = num.length;
|
|
if (num.length === 0)
|
|
size++;
|
|
|
|
var out = new Buffer(size);
|
|
num.copy(out);
|
|
if (num.length === 0)
|
|
out[0] = 0
|
|
return this._createEncoderBuffer(out);
|
|
}
|
|
|
|
if (num < 0x80)
|
|
return this._createEncoderBuffer(num);
|
|
|
|
if (num < 0x100)
|
|
return this._createEncoderBuffer([0, num]);
|
|
|
|
var size = 1;
|
|
for (var i = num; i >= 0x100; i >>= 8)
|
|
size++;
|
|
|
|
var out = new Array(size);
|
|
for (var i = out.length - 1; i >= 0; i--) {
|
|
out[i] = num & 0xff;
|
|
num >>= 8;
|
|
}
|
|
if(out[0] & 0x80) {
|
|
out.unshift(0);
|
|
}
|
|
|
|
return this._createEncoderBuffer(new Buffer(out));
|
|
};
|
|
|
|
DERNode.prototype._encodeBool = function encodeBool(value) {
|
|
return this._createEncoderBuffer(value ? 0xff : 0);
|
|
};
|
|
|
|
DERNode.prototype._use = function use(entity, obj) {
|
|
if (typeof entity === 'function')
|
|
entity = entity(obj);
|
|
return entity._getEncoder('der').tree;
|
|
};
|
|
|
|
DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
|
|
var state = this._baseState;
|
|
var i;
|
|
if (state['default'] === null)
|
|
return false;
|
|
|
|
var data = dataBuffer.join();
|
|
if (state.defaultBuffer === undefined)
|
|
state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join();
|
|
|
|
if (data.length !== state.defaultBuffer.length)
|
|
return false;
|
|
|
|
for (i=0; i < data.length; i++)
|
|
if (data[i] !== state.defaultBuffer[i])
|
|
return false;
|
|
|
|
return true;
|
|
};
|
|
|
|
|
|
function encodeTag(tag, primitive, cls, reporter) {
|
|
var res;
|
|
|
|
if (tag === 'seqof')
|
|
tag = 'seq';
|
|
else if (tag === 'setof')
|
|
tag = 'set';
|
|
|
|
if (der.tagByName.hasOwnProperty(tag))
|
|
res = der.tagByName[tag];
|
|
else if (typeof tag === 'number' && (tag | 0) === tag)
|
|
res = tag;
|
|
else
|
|
return reporter.error('Unknown tag: ' + tag);
|
|
|
|
if (res >= 0x1f)
|
|
return reporter.error('Multi-octet tag encoding unsupported');
|
|
|
|
if (!primitive)
|
|
res |= 0x20;
|
|
|
|
res |= (der.tagClassByName[cls || 'universal'] << 6);
|
|
|
|
return res;
|
|
}
|
|
|
|
},{"../../asn1":76,"buffer":130,"inherits":190}],88:[function(require,module,exports){
|
|
var encoders = exports;
|
|
|
|
encoders.der = require('./der');
|
|
encoders.pem = require('./pem');
|
|
|
|
},{"./der":87,"./pem":89}],89:[function(require,module,exports){
|
|
var inherits = require('inherits');
|
|
|
|
var DEREncoder = require('./der');
|
|
|
|
function PEMEncoder(entity) {
|
|
DEREncoder.call(this, entity);
|
|
this.enc = 'pem';
|
|
};
|
|
inherits(PEMEncoder, DEREncoder);
|
|
module.exports = PEMEncoder;
|
|
|
|
PEMEncoder.prototype.encode = function encode(data, options) {
|
|
var buf = DEREncoder.prototype.encode.call(this, data);
|
|
|
|
var p = buf.toString('base64');
|
|
var out = [ '-----BEGIN ' + options.label + '-----' ];
|
|
for (var i = 0; i < p.length; i += 64)
|
|
out.push(p.slice(i, i + 64));
|
|
out.push('-----END ' + options.label + '-----');
|
|
return out.join('\n');
|
|
};
|
|
|
|
},{"./der":87,"inherits":190}],90:[function(require,module,exports){
|
|
|
|
|
|
module.exports = {
|
|
|
|
newInvalidAsn1Error: function(msg) {
|
|
var e = new Error();
|
|
e.name = 'InvalidAsn1Error';
|
|
e.message = msg || '';
|
|
return e;
|
|
}
|
|
|
|
};
|
|
|
|
},{}],91:[function(require,module,exports){
|
|
|
|
var errors = require('./errors');
|
|
var types = require('./types');
|
|
|
|
var Reader = require('./reader');
|
|
var Writer = require('./writer');
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
Reader: Reader,
|
|
|
|
Writer: Writer
|
|
|
|
};
|
|
|
|
for (var t in types) {
|
|
if (types.hasOwnProperty(t))
|
|
module.exports[t] = types[t];
|
|
}
|
|
for (var e in errors) {
|
|
if (errors.hasOwnProperty(e))
|
|
module.exports[e] = errors[e];
|
|
}
|
|
|
|
},{"./errors":90,"./reader":92,"./types":93,"./writer":94}],92:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
var assert = require('assert');
|
|
|
|
var ASN1 = require('./types');
|
|
var errors = require('./errors');
|
|
|
|
|
|
|
|
var newInvalidAsn1Error = errors.newInvalidAsn1Error;
|
|
|
|
|
|
|
|
|
|
function Reader(data) {
|
|
if (!data || !Buffer.isBuffer(data))
|
|
throw new TypeError('data must be a node Buffer');
|
|
|
|
this._buf = data;
|
|
this._size = data.length;
|
|
|
|
this._len = 0;
|
|
this._offset = 0;
|
|
}
|
|
|
|
Object.defineProperty(Reader.prototype, 'length', {
|
|
enumerable: true,
|
|
get: function () { return (this._len); }
|
|
});
|
|
|
|
Object.defineProperty(Reader.prototype, 'offset', {
|
|
enumerable: true,
|
|
get: function () { return (this._offset); }
|
|
});
|
|
|
|
Object.defineProperty(Reader.prototype, 'remain', {
|
|
get: function () { return (this._size - this._offset); }
|
|
});
|
|
|
|
Object.defineProperty(Reader.prototype, 'buffer', {
|
|
get: function () { return (this._buf.slice(this._offset)); }
|
|
});
|
|
|
|
|
|
|
|
Reader.prototype.readByte = function(peek) {
|
|
if (this._size - this._offset < 1)
|
|
return null;
|
|
|
|
var b = this._buf[this._offset] & 0xff;
|
|
|
|
if (!peek)
|
|
this._offset += 1;
|
|
|
|
return b;
|
|
};
|
|
|
|
|
|
Reader.prototype.peek = function() {
|
|
return this.readByte(true);
|
|
};
|
|
|
|
|
|
|
|
Reader.prototype.readLength = function(offset) {
|
|
if (offset === undefined)
|
|
offset = this._offset;
|
|
|
|
if (offset >= this._size)
|
|
return null;
|
|
|
|
var lenB = this._buf[offset++] & 0xff;
|
|
if (lenB === null)
|
|
return null;
|
|
|
|
if ((lenB & 0x80) == 0x80) {
|
|
lenB &= 0x7f;
|
|
|
|
if (lenB == 0)
|
|
throw newInvalidAsn1Error('Indefinite length not supported');
|
|
|
|
if (lenB > 4)
|
|
throw newInvalidAsn1Error('encoding too long');
|
|
|
|
if (this._size - offset < lenB)
|
|
return null;
|
|
|
|
this._len = 0;
|
|
for (var i = 0; i < lenB; i++)
|
|
this._len = (this._len << 8) + (this._buf[offset++] & 0xff);
|
|
|
|
} else {
|
|
this._len = lenB;
|
|
}
|
|
|
|
return offset;
|
|
};
|
|
|
|
|
|
|
|
Reader.prototype.readSequence = function(tag) {
|
|
var seq = this.peek();
|
|
if (seq === null)
|
|
return null;
|
|
if (tag !== undefined && tag !== seq)
|
|
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
|
|
': got 0x' + seq.toString(16));
|
|
|
|
var o = this.readLength(this._offset + 1); // stored in `length`
|
|
if (o === null)
|
|
return null;
|
|
|
|
this._offset = o;
|
|
return seq;
|
|
};
|
|
|
|
|
|
Reader.prototype.readInt = function() {
|
|
return this._readTag(ASN1.Integer);
|
|
};
|
|
|
|
|
|
Reader.prototype.readBoolean = function() {
|
|
return (this._readTag(ASN1.Boolean) === 0 ? false : true);
|
|
};
|
|
|
|
|
|
Reader.prototype.readEnumeration = function() {
|
|
return this._readTag(ASN1.Enumeration);
|
|
};
|
|
|
|
|
|
Reader.prototype.readString = function(tag, retbuf) {
|
|
if (!tag)
|
|
tag = ASN1.OctetString;
|
|
|
|
var b = this.peek();
|
|
if (b === null)
|
|
return null;
|
|
|
|
if (b !== tag)
|
|
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
|
|
': got 0x' + b.toString(16));
|
|
|
|
var o = this.readLength(this._offset + 1); // stored in `length`
|
|
|
|
if (o === null)
|
|
return null;
|
|
|
|
if (this.length > this._size - o)
|
|
return null;
|
|
|
|
this._offset = o;
|
|
|
|
if (this.length === 0)
|
|
return retbuf ? new Buffer(0) : '';
|
|
|
|
var str = this._buf.slice(this._offset, this._offset + this.length);
|
|
this._offset += this.length;
|
|
|
|
return retbuf ? str : str.toString('utf8');
|
|
};
|
|
|
|
Reader.prototype.readOID = function(tag) {
|
|
if (!tag)
|
|
tag = ASN1.OID;
|
|
|
|
var b = this.readString(tag, true);
|
|
if (b === null)
|
|
return null;
|
|
|
|
var values = [];
|
|
var value = 0;
|
|
|
|
for (var i = 0; i < b.length; i++) {
|
|
var byte = b[i] & 0xff;
|
|
|
|
value <<= 7;
|
|
value += byte & 0x7f;
|
|
if ((byte & 0x80) == 0) {
|
|
values.push(value);
|
|
value = 0;
|
|
}
|
|
}
|
|
|
|
value = values.shift();
|
|
values.unshift(value % 40);
|
|
values.unshift((value / 40) >> 0);
|
|
|
|
return values.join('.');
|
|
};
|
|
|
|
|
|
Reader.prototype._readTag = function(tag) {
|
|
assert.ok(tag !== undefined);
|
|
|
|
var b = this.peek();
|
|
|
|
if (b === null)
|
|
return null;
|
|
|
|
if (b !== tag)
|
|
throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
|
|
': got 0x' + b.toString(16));
|
|
|
|
var o = this.readLength(this._offset + 1); // stored in `length`
|
|
if (o === null)
|
|
return null;
|
|
|
|
if (this.length > 4)
|
|
throw newInvalidAsn1Error('Integer too long: ' + this.length);
|
|
|
|
if (this.length > this._size - o)
|
|
return null;
|
|
this._offset = o;
|
|
|
|
var fb = this._buf[this._offset];
|
|
var value = 0;
|
|
|
|
for (var i = 0; i < this.length; i++) {
|
|
value <<= 8;
|
|
value |= (this._buf[this._offset++] & 0xff);
|
|
}
|
|
|
|
if ((fb & 0x80) == 0x80 && i !== 4)
|
|
value -= (1 << (i * 8));
|
|
|
|
return value >> 0;
|
|
};
|
|
|
|
|
|
|
|
|
|
module.exports = Reader;
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./errors":90,"./types":93,"assert":96,"buffer":130}],93:[function(require,module,exports){
|
|
|
|
|
|
module.exports = {
|
|
EOC: 0,
|
|
Boolean: 1,
|
|
Integer: 2,
|
|
BitString: 3,
|
|
OctetString: 4,
|
|
Null: 5,
|
|
OID: 6,
|
|
ObjectDescriptor: 7,
|
|
External: 8,
|
|
Real: 9, // float
|
|
Enumeration: 10,
|
|
PDV: 11,
|
|
Utf8String: 12,
|
|
RelativeOID: 13,
|
|
Sequence: 16,
|
|
Set: 17,
|
|
NumericString: 18,
|
|
PrintableString: 19,
|
|
T61String: 20,
|
|
VideotexString: 21,
|
|
IA5String: 22,
|
|
UTCTime: 23,
|
|
GeneralizedTime: 24,
|
|
GraphicString: 25,
|
|
VisibleString: 26,
|
|
GeneralString: 28,
|
|
UniversalString: 29,
|
|
CharacterString: 30,
|
|
BMPString: 31,
|
|
Constructor: 32,
|
|
Context: 128
|
|
};
|
|
|
|
},{}],94:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
var assert = require('assert');
|
|
var ASN1 = require('./types');
|
|
var errors = require('./errors');
|
|
|
|
|
|
|
|
var newInvalidAsn1Error = errors.newInvalidAsn1Error;
|
|
|
|
var DEFAULT_OPTS = {
|
|
size: 1024,
|
|
growthFactor: 8
|
|
};
|
|
|
|
|
|
|
|
function merge(from, to) {
|
|
assert.ok(from);
|
|
assert.equal(typeof(from), 'object');
|
|
assert.ok(to);
|
|
assert.equal(typeof(to), 'object');
|
|
|
|
var keys = Object.getOwnPropertyNames(from);
|
|
keys.forEach(function(key) {
|
|
if (to[key])
|
|
return;
|
|
|
|
var value = Object.getOwnPropertyDescriptor(from, key);
|
|
Object.defineProperty(to, key, value);
|
|
});
|
|
|
|
return to;
|
|
}
|
|
|
|
|
|
|
|
|
|
function Writer(options) {
|
|
options = merge(DEFAULT_OPTS, options || {});
|
|
|
|
this._buf = new Buffer(options.size || 1024);
|
|
this._size = this._buf.length;
|
|
this._offset = 0;
|
|
this._options = options;
|
|
|
|
this._seq = [];
|
|
}
|
|
|
|
Object.defineProperty(Writer.prototype, 'buffer', {
|
|
get: function () {
|
|
if (this._seq.length)
|
|
throw new InvalidAsn1Error(this._seq.length + ' unended sequence(s)');
|
|
|
|
return (this._buf.slice(0, this._offset));
|
|
}
|
|
});
|
|
|
|
Writer.prototype.writeByte = function(b) {
|
|
if (typeof(b) !== 'number')
|
|
throw new TypeError('argument must be a Number');
|
|
|
|
this._ensure(1);
|
|
this._buf[this._offset++] = b;
|
|
};
|
|
|
|
|
|
Writer.prototype.writeInt = function(i, tag) {
|
|
if (typeof(i) !== 'number')
|
|
throw new TypeError('argument must be a Number');
|
|
if (typeof(tag) !== 'number')
|
|
tag = ASN1.Integer;
|
|
|
|
var sz = 4;
|
|
|
|
while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&
|
|
(sz > 1)) {
|
|
sz--;
|
|
i <<= 8;
|
|
}
|
|
|
|
if (sz > 4)
|
|
throw new InvalidAsn1Error('BER ints cannot be > 0xffffffff');
|
|
|
|
this._ensure(2 + sz);
|
|
this._buf[this._offset++] = tag;
|
|
this._buf[this._offset++] = sz;
|
|
|
|
while (sz-- > 0) {
|
|
this._buf[this._offset++] = ((i & 0xff000000) >>> 24);
|
|
i <<= 8;
|
|
}
|
|
|
|
};
|
|
|
|
|
|
Writer.prototype.writeNull = function() {
|
|
this.writeByte(ASN1.Null);
|
|
this.writeByte(0x00);
|
|
};
|
|
|
|
|
|
Writer.prototype.writeEnumeration = function(i, tag) {
|
|
if (typeof(i) !== 'number')
|
|
throw new TypeError('argument must be a Number');
|
|
if (typeof(tag) !== 'number')
|
|
tag = ASN1.Enumeration;
|
|
|
|
return this.writeInt(i, tag);
|
|
};
|
|
|
|
|
|
Writer.prototype.writeBoolean = function(b, tag) {
|
|
if (typeof(b) !== 'boolean')
|
|
throw new TypeError('argument must be a Boolean');
|
|
if (typeof(tag) !== 'number')
|
|
tag = ASN1.Boolean;
|
|
|
|
this._ensure(3);
|
|
this._buf[this._offset++] = tag;
|
|
this._buf[this._offset++] = 0x01;
|
|
this._buf[this._offset++] = b ? 0xff : 0x00;
|
|
};
|
|
|
|
|
|
Writer.prototype.writeString = function(s, tag) {
|
|
if (typeof(s) !== 'string')
|
|
throw new TypeError('argument must be a string (was: ' + typeof(s) + ')');
|
|
if (typeof(tag) !== 'number')
|
|
tag = ASN1.OctetString;
|
|
|
|
var len = Buffer.byteLength(s);
|
|
this.writeByte(tag);
|
|
this.writeLength(len);
|
|
if (len) {
|
|
this._ensure(len);
|
|
this._buf.write(s, this._offset);
|
|
this._offset += len;
|
|
}
|
|
};
|
|
|
|
|
|
Writer.prototype.writeBuffer = function(buf, tag) {
|
|
if (typeof(tag) !== 'number')
|
|
throw new TypeError('tag must be a number');
|
|
if (!Buffer.isBuffer(buf))
|
|
throw new TypeError('argument must be a buffer');
|
|
|
|
this.writeByte(tag);
|
|
this.writeLength(buf.length);
|
|
this._ensure(buf.length);
|
|
buf.copy(this._buf, this._offset, 0, buf.length);
|
|
this._offset += buf.length;
|
|
};
|
|
|
|
|
|
Writer.prototype.writeStringArray = function(strings) {
|
|
if ((!strings instanceof Array))
|
|
throw new TypeError('argument must be an Array[String]');
|
|
|
|
var self = this;
|
|
strings.forEach(function(s) {
|
|
self.writeString(s);
|
|
});
|
|
};
|
|
|
|
Writer.prototype.writeOID = function(s, tag) {
|
|
if (typeof(s) !== 'string')
|
|
throw new TypeError('argument must be a string');
|
|
if (typeof(tag) !== 'number')
|
|
tag = ASN1.OID;
|
|
|
|
if (!/^([0-9]+\.){3,}[0-9]+$/.test(s))
|
|
throw new Error('argument is not a valid OID string');
|
|
|
|
function encodeOctet(bytes, octet) {
|
|
if (octet < 128) {
|
|
bytes.push(octet);
|
|
} else if (octet < 16384) {
|
|
bytes.push((octet >>> 7) | 0x80);
|
|
bytes.push(octet & 0x7F);
|
|
} else if (octet < 2097152) {
|
|
bytes.push((octet >>> 14) | 0x80);
|
|
bytes.push(((octet >>> 7) | 0x80) & 0xFF);
|
|
bytes.push(octet & 0x7F);
|
|
} else if (octet < 268435456) {
|
|
bytes.push((octet >>> 21) | 0x80);
|
|
bytes.push(((octet >>> 14) | 0x80) & 0xFF);
|
|
bytes.push(((octet >>> 7) | 0x80) & 0xFF);
|
|
bytes.push(octet & 0x7F);
|
|
} else {
|
|
bytes.push(((octet >>> 28) | 0x80) & 0xFF);
|
|
bytes.push(((octet >>> 21) | 0x80) & 0xFF);
|
|
bytes.push(((octet >>> 14) | 0x80) & 0xFF);
|
|
bytes.push(((octet >>> 7) | 0x80) & 0xFF);
|
|
bytes.push(octet & 0x7F);
|
|
}
|
|
}
|
|
|
|
var tmp = s.split('.');
|
|
var bytes = [];
|
|
bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));
|
|
tmp.slice(2).forEach(function(b) {
|
|
encodeOctet(bytes, parseInt(b, 10));
|
|
});
|
|
|
|
var self = this;
|
|
this._ensure(2 + bytes.length);
|
|
this.writeByte(tag);
|
|
this.writeLength(bytes.length);
|
|
bytes.forEach(function(b) {
|
|
self.writeByte(b);
|
|
});
|
|
};
|
|
|
|
|
|
Writer.prototype.writeLength = function(len) {
|
|
if (typeof(len) !== 'number')
|
|
throw new TypeError('argument must be a Number');
|
|
|
|
this._ensure(4);
|
|
|
|
if (len <= 0x7f) {
|
|
this._buf[this._offset++] = len;
|
|
} else if (len <= 0xff) {
|
|
this._buf[this._offset++] = 0x81;
|
|
this._buf[this._offset++] = len;
|
|
} else if (len <= 0xffff) {
|
|
this._buf[this._offset++] = 0x82;
|
|
this._buf[this._offset++] = len >> 8;
|
|
this._buf[this._offset++] = len;
|
|
} else if (len <= 0xffffff) {
|
|
this._buf[this._offset++] = 0x83;
|
|
this._buf[this._offset++] = len >> 16;
|
|
this._buf[this._offset++] = len >> 8;
|
|
this._buf[this._offset++] = len;
|
|
} else {
|
|
throw new InvalidAsn1ERror('Length too long (> 4 bytes)');
|
|
}
|
|
};
|
|
|
|
Writer.prototype.startSequence = function(tag) {
|
|
if (typeof(tag) !== 'number')
|
|
tag = ASN1.Sequence | ASN1.Constructor;
|
|
|
|
this.writeByte(tag);
|
|
this._seq.push(this._offset);
|
|
this._ensure(3);
|
|
this._offset += 3;
|
|
};
|
|
|
|
|
|
Writer.prototype.endSequence = function() {
|
|
var seq = this._seq.pop();
|
|
var start = seq + 3;
|
|
var len = this._offset - start;
|
|
|
|
if (len <= 0x7f) {
|
|
this._shift(start, len, -2);
|
|
this._buf[seq] = len;
|
|
} else if (len <= 0xff) {
|
|
this._shift(start, len, -1);
|
|
this._buf[seq] = 0x81;
|
|
this._buf[seq + 1] = len;
|
|
} else if (len <= 0xffff) {
|
|
this._buf[seq] = 0x82;
|
|
this._buf[seq + 1] = len >> 8;
|
|
this._buf[seq + 2] = len;
|
|
} else if (len <= 0xffffff) {
|
|
this._shift(start, len, 1);
|
|
this._buf[seq] = 0x83;
|
|
this._buf[seq + 1] = len >> 16;
|
|
this._buf[seq + 2] = len >> 8;
|
|
this._buf[seq + 3] = len;
|
|
} else {
|
|
throw new InvalidAsn1Error('Sequence too long');
|
|
}
|
|
};
|
|
|
|
|
|
Writer.prototype._shift = function(start, len, shift) {
|
|
assert.ok(start !== undefined);
|
|
assert.ok(len !== undefined);
|
|
assert.ok(shift);
|
|
|
|
this._buf.copy(this._buf, start + shift, start, start + len);
|
|
this._offset += shift;
|
|
};
|
|
|
|
Writer.prototype._ensure = function(len) {
|
|
assert.ok(len);
|
|
|
|
if (this._size - this._offset < len) {
|
|
var sz = this._size * this._options.growthFactor;
|
|
if (sz - this._offset < len)
|
|
sz += len;
|
|
|
|
var buf = new Buffer(sz);
|
|
|
|
this._buf.copy(buf, 0, 0, this._offset);
|
|
this._buf = buf;
|
|
this._size = sz;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
module.exports = Writer;
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./errors":90,"./types":93,"assert":96,"buffer":130}],95:[function(require,module,exports){
|
|
|
|
|
|
var Ber = require('./ber/index');
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
Ber: Ber,
|
|
|
|
BerReader: Ber.Reader,
|
|
|
|
BerWriter: Ber.Writer
|
|
|
|
};
|
|
|
|
},{"./ber/index":91}],96:[function(require,module,exports){
|
|
|
|
var util = require('util/');
|
|
|
|
var pSlice = Array.prototype.slice;
|
|
var hasOwn = Object.prototype.hasOwnProperty;
|
|
|
|
|
|
var assert = module.exports = ok;
|
|
|
|
|
|
assert.AssertionError = function AssertionError(options) {
|
|
this.name = 'AssertionError';
|
|
this.actual = options.actual;
|
|
this.expected = options.expected;
|
|
this.operator = options.operator;
|
|
if (options.message) {
|
|
this.message = options.message;
|
|
this.generatedMessage = false;
|
|
} else {
|
|
this.message = getMessage(this);
|
|
this.generatedMessage = true;
|
|
}
|
|
var stackStartFunction = options.stackStartFunction || fail;
|
|
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, stackStartFunction);
|
|
}
|
|
else {
|
|
var err = new Error();
|
|
if (err.stack) {
|
|
var out = err.stack;
|
|
|
|
var fn_name = stackStartFunction.name;
|
|
var idx = out.indexOf('\n' + fn_name);
|
|
if (idx >= 0) {
|
|
var next_line = out.indexOf('\n', idx + 1);
|
|
out = out.substring(next_line + 1);
|
|
}
|
|
|
|
this.stack = out;
|
|
}
|
|
}
|
|
};
|
|
|
|
util.inherits(assert.AssertionError, Error);
|
|
|
|
function replacer(key, value) {
|
|
if (util.isUndefined(value)) {
|
|
return '' + value;
|
|
}
|
|
if (util.isNumber(value) && !isFinite(value)) {
|
|
return value.toString();
|
|
}
|
|
if (util.isFunction(value) || util.isRegExp(value)) {
|
|
return value.toString();
|
|
}
|
|
return value;
|
|
}
|
|
|
|
function truncate(s, n) {
|
|
if (util.isString(s)) {
|
|
return s.length < n ? s : s.slice(0, n);
|
|
} else {
|
|
return s;
|
|
}
|
|
}
|
|
|
|
function getMessage(self) {
|
|
return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
|
|
self.operator + ' ' +
|
|
truncate(JSON.stringify(self.expected, replacer), 128);
|
|
}
|
|
|
|
|
|
|
|
function fail(actual, expected, message, operator, stackStartFunction) {
|
|
throw new assert.AssertionError({
|
|
message: message,
|
|
actual: actual,
|
|
expected: expected,
|
|
operator: operator,
|
|
stackStartFunction: stackStartFunction
|
|
});
|
|
}
|
|
|
|
assert.fail = fail;
|
|
|
|
|
|
function ok(value, message) {
|
|
if (!value) fail(value, true, message, '==', assert.ok);
|
|
}
|
|
assert.ok = ok;
|
|
|
|
|
|
assert.equal = function equal(actual, expected, message) {
|
|
if (actual != expected) fail(actual, expected, message, '==', assert.equal);
|
|
};
|
|
|
|
|
|
assert.notEqual = function notEqual(actual, expected, message) {
|
|
if (actual == expected) {
|
|
fail(actual, expected, message, '!=', assert.notEqual);
|
|
}
|
|
};
|
|
|
|
|
|
assert.deepEqual = function deepEqual(actual, expected, message) {
|
|
if (!_deepEqual(actual, expected)) {
|
|
fail(actual, expected, message, 'deepEqual', assert.deepEqual);
|
|
}
|
|
};
|
|
|
|
function _deepEqual(actual, expected) {
|
|
if (actual === expected) {
|
|
return true;
|
|
|
|
} else if (util.isBuffer(actual) && util.isBuffer(expected)) {
|
|
if (actual.length != expected.length) return false;
|
|
|
|
for (var i = 0; i < actual.length; i++) {
|
|
if (actual[i] !== expected[i]) return false;
|
|
}
|
|
|
|
return true;
|
|
|
|
} else if (util.isDate(actual) && util.isDate(expected)) {
|
|
return actual.getTime() === expected.getTime();
|
|
|
|
} else if (util.isRegExp(actual) && util.isRegExp(expected)) {
|
|
return actual.source === expected.source &&
|
|
actual.global === expected.global &&
|
|
actual.multiline === expected.multiline &&
|
|
actual.lastIndex === expected.lastIndex &&
|
|
actual.ignoreCase === expected.ignoreCase;
|
|
|
|
} else if (!util.isObject(actual) && !util.isObject(expected)) {
|
|
return actual == expected;
|
|
|
|
} else {
|
|
return objEquiv(actual, expected);
|
|
}
|
|
}
|
|
|
|
function isArguments(object) {
|
|
return Object.prototype.toString.call(object) == '[object Arguments]';
|
|
}
|
|
|
|
function objEquiv(a, b) {
|
|
if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
|
|
return false;
|
|
if (a.prototype !== b.prototype) return false;
|
|
if (util.isPrimitive(a) || util.isPrimitive(b)) {
|
|
return a === b;
|
|
}
|
|
var aIsArgs = isArguments(a),
|
|
bIsArgs = isArguments(b);
|
|
if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
|
|
return false;
|
|
if (aIsArgs) {
|
|
a = pSlice.call(a);
|
|
b = pSlice.call(b);
|
|
return _deepEqual(a, b);
|
|
}
|
|
var ka = objectKeys(a),
|
|
kb = objectKeys(b),
|
|
key, i;
|
|
if (ka.length != kb.length)
|
|
return false;
|
|
ka.sort();
|
|
kb.sort();
|
|
for (i = ka.length - 1; i >= 0; i--) {
|
|
if (ka[i] != kb[i])
|
|
return false;
|
|
}
|
|
for (i = ka.length - 1; i >= 0; i--) {
|
|
key = ka[i];
|
|
if (!_deepEqual(a[key], b[key])) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
|
|
if (_deepEqual(actual, expected)) {
|
|
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
|
|
}
|
|
};
|
|
|
|
|
|
assert.strictEqual = function strictEqual(actual, expected, message) {
|
|
if (actual !== expected) {
|
|
fail(actual, expected, message, '===', assert.strictEqual);
|
|
}
|
|
};
|
|
|
|
|
|
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
|
|
if (actual === expected) {
|
|
fail(actual, expected, message, '!==', assert.notStrictEqual);
|
|
}
|
|
};
|
|
|
|
function expectedException(actual, expected) {
|
|
if (!actual || !expected) {
|
|
return false;
|
|
}
|
|
|
|
if (Object.prototype.toString.call(expected) == '[object RegExp]') {
|
|
return expected.test(actual);
|
|
} else if (actual instanceof expected) {
|
|
return true;
|
|
} else if (expected.call({}, actual) === true) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function _throws(shouldThrow, block, expected, message) {
|
|
var actual;
|
|
|
|
if (util.isString(expected)) {
|
|
message = expected;
|
|
expected = null;
|
|
}
|
|
|
|
try {
|
|
block();
|
|
} catch (e) {
|
|
actual = e;
|
|
}
|
|
|
|
message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
|
|
(message ? ' ' + message : '.');
|
|
|
|
if (shouldThrow && !actual) {
|
|
fail(actual, expected, 'Missing expected exception' + message);
|
|
}
|
|
|
|
if (!shouldThrow && expectedException(actual, expected)) {
|
|
fail(actual, expected, 'Got unwanted exception' + message);
|
|
}
|
|
|
|
if ((shouldThrow && actual && expected &&
|
|
!expectedException(actual, expected)) || (!shouldThrow && actual)) {
|
|
throw actual;
|
|
}
|
|
}
|
|
|
|
|
|
assert.throws = function(block, /*optional*/error, /*optional*/message) {
|
|
_throws.apply(this, [true].concat(pSlice.call(arguments)));
|
|
};
|
|
|
|
assert.doesNotThrow = function(block, /*optional*/message) {
|
|
_throws.apply(this, [false].concat(pSlice.call(arguments)));
|
|
};
|
|
|
|
assert.ifError = function(err) { if (err) {throw err;}};
|
|
|
|
var objectKeys = Object.keys || function (obj) {
|
|
var keys = [];
|
|
for (var key in obj) {
|
|
if (hasOwn.call(obj, key)) keys.push(key);
|
|
}
|
|
return keys;
|
|
};
|
|
|
|
},{"util/":320}],97:[function(require,module,exports){
|
|
'use strict'
|
|
|
|
exports.byteLength = byteLength
|
|
exports.toByteArray = toByteArray
|
|
exports.fromByteArray = fromByteArray
|
|
|
|
var lookup = []
|
|
var revLookup = []
|
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
|
|
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
for (var i = 0, len = code.length; i < len; ++i) {
|
|
lookup[i] = code[i]
|
|
revLookup[code.charCodeAt(i)] = i
|
|
}
|
|
|
|
revLookup['-'.charCodeAt(0)] = 62
|
|
revLookup['_'.charCodeAt(0)] = 63
|
|
|
|
function placeHoldersCount (b64) {
|
|
var len = b64.length
|
|
if (len % 4 > 0) {
|
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
}
|
|
|
|
return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
|
|
}
|
|
|
|
function byteLength (b64) {
|
|
return (b64.length * 3 / 4) - placeHoldersCount(b64)
|
|
}
|
|
|
|
function toByteArray (b64) {
|
|
var i, l, tmp, placeHolders, arr
|
|
var len = b64.length
|
|
placeHolders = placeHoldersCount(b64)
|
|
|
|
arr = new Arr((len * 3 / 4) - placeHolders)
|
|
|
|
l = placeHolders > 0 ? len - 4 : len
|
|
|
|
var L = 0
|
|
|
|
for (i = 0; i < l; i += 4) {
|
|
tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
|
|
arr[L++] = (tmp >> 16) & 0xFF
|
|
arr[L++] = (tmp >> 8) & 0xFF
|
|
arr[L++] = tmp & 0xFF
|
|
}
|
|
|
|
if (placeHolders === 2) {
|
|
tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
|
|
arr[L++] = tmp & 0xFF
|
|
} else if (placeHolders === 1) {
|
|
tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
|
|
arr[L++] = (tmp >> 8) & 0xFF
|
|
arr[L++] = tmp & 0xFF
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
function tripletToBase64 (num) {
|
|
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
|
|
}
|
|
|
|
function encodeChunk (uint8, start, end) {
|
|
var tmp
|
|
var output = []
|
|
for (var i = start; i < end; i += 3) {
|
|
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
|
|
output.push(tripletToBase64(tmp))
|
|
}
|
|
return output.join('')
|
|
}
|
|
|
|
function fromByteArray (uint8) {
|
|
var tmp
|
|
var len = uint8.length
|
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
|
var output = ''
|
|
var parts = []
|
|
var maxChunkLength = 16383 // must be multiple of 3
|
|
|
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
|
|
}
|
|
|
|
if (extraBytes === 1) {
|
|
tmp = uint8[len - 1]
|
|
output += lookup[tmp >> 2]
|
|
output += lookup[(tmp << 4) & 0x3F]
|
|
output += '=='
|
|
} else if (extraBytes === 2) {
|
|
tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
|
|
output += lookup[tmp >> 10]
|
|
output += lookup[(tmp >> 4) & 0x3F]
|
|
output += lookup[(tmp << 2) & 0x3F]
|
|
output += '='
|
|
}
|
|
|
|
parts.push(output)
|
|
|
|
return parts.join('')
|
|
}
|
|
|
|
},{}],98:[function(require,module,exports){
|
|
(function (module, exports) {
|
|
'use strict';
|
|
|
|
function assert (val, msg) {
|
|
if (!val) throw new Error(msg || 'Assertion failed');
|
|
}
|
|
|
|
function inherits (ctor, superCtor) {
|
|
ctor.super_ = superCtor;
|
|
var TempCtor = function () {};
|
|
TempCtor.prototype = superCtor.prototype;
|
|
ctor.prototype = new TempCtor();
|
|
ctor.prototype.constructor = ctor;
|
|
}
|
|
|
|
|
|
function BN (number, base, endian) {
|
|
if (BN.isBN(number)) {
|
|
return number;
|
|
}
|
|
|
|
this.negative = 0;
|
|
this.words = null;
|
|
this.length = 0;
|
|
|
|
this.red = null;
|
|
|
|
if (number !== null) {
|
|
if (base === 'le' || base === 'be') {
|
|
endian = base;
|
|
base = 10;
|
|
}
|
|
|
|
this._init(number || 0, base || 10, endian || 'be');
|
|
}
|
|
}
|
|
if (typeof module === 'object') {
|
|
module.exports = BN;
|
|
} else {
|
|
exports.BN = BN;
|
|
}
|
|
|
|
BN.BN = BN;
|
|
BN.wordSize = 26;
|
|
|
|
var Buffer;
|
|
try {
|
|
Buffer = require('buffer').Buffer;
|
|
} catch (e) {
|
|
}
|
|
|
|
BN.isBN = function isBN (num) {
|
|
if (num instanceof BN) {
|
|
return true;
|
|
}
|
|
|
|
return num !== null && typeof num === 'object' &&
|
|
num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
|
|
};
|
|
|
|
BN.max = function max (left, right) {
|
|
if (left.cmp(right) > 0) return left;
|
|
return right;
|
|
};
|
|
|
|
BN.min = function min (left, right) {
|
|
if (left.cmp(right) < 0) return left;
|
|
return right;
|
|
};
|
|
|
|
BN.prototype._init = function init (number, base, endian) {
|
|
if (typeof number === 'number') {
|
|
return this._initNumber(number, base, endian);
|
|
}
|
|
|
|
if (typeof number === 'object') {
|
|
return this._initArray(number, base, endian);
|
|
}
|
|
|
|
if (base === 'hex') {
|
|
base = 16;
|
|
}
|
|
assert(base === (base | 0) && base >= 2 && base <= 36);
|
|
|
|
number = number.toString().replace(/\s+/g, '');
|
|
var start = 0;
|
|
if (number[0] === '-') {
|
|
start++;
|
|
}
|
|
|
|
if (base === 16) {
|
|
this._parseHex(number, start);
|
|
} else {
|
|
this._parseBase(number, base, start);
|
|
}
|
|
|
|
if (number[0] === '-') {
|
|
this.negative = 1;
|
|
}
|
|
|
|
this.strip();
|
|
|
|
if (endian !== 'le') return;
|
|
|
|
this._initArray(this.toArray(), base, endian);
|
|
};
|
|
|
|
BN.prototype._initNumber = function _initNumber (number, base, endian) {
|
|
if (number < 0) {
|
|
this.negative = 1;
|
|
number = -number;
|
|
}
|
|
if (number < 0x4000000) {
|
|
this.words = [ number & 0x3ffffff ];
|
|
this.length = 1;
|
|
} else if (number < 0x10000000000000) {
|
|
this.words = [
|
|
number & 0x3ffffff,
|
|
(number / 0x4000000) & 0x3ffffff
|
|
];
|
|
this.length = 2;
|
|
} else {
|
|
assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
|
|
this.words = [
|
|
number & 0x3ffffff,
|
|
(number / 0x4000000) & 0x3ffffff,
|
|
1
|
|
];
|
|
this.length = 3;
|
|
}
|
|
|
|
if (endian !== 'le') return;
|
|
|
|
this._initArray(this.toArray(), base, endian);
|
|
};
|
|
|
|
BN.prototype._initArray = function _initArray (number, base, endian) {
|
|
assert(typeof number.length === 'number');
|
|
if (number.length <= 0) {
|
|
this.words = [ 0 ];
|
|
this.length = 1;
|
|
return this;
|
|
}
|
|
|
|
this.length = Math.ceil(number.length / 3);
|
|
this.words = new Array(this.length);
|
|
for (var i = 0; i < this.length; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
|
|
var j, w;
|
|
var off = 0;
|
|
if (endian === 'be') {
|
|
for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
|
|
w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
|
|
this.words[j] |= (w << off) & 0x3ffffff;
|
|
this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
} else if (endian === 'le') {
|
|
for (i = 0, j = 0; i < number.length; i += 3) {
|
|
w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
|
|
this.words[j] |= (w << off) & 0x3ffffff;
|
|
this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
return this.strip();
|
|
};
|
|
|
|
function parseHex (str, start, end) {
|
|
var r = 0;
|
|
var len = Math.min(str.length, end);
|
|
for (var i = start; i < len; i++) {
|
|
var c = str.charCodeAt(i) - 48;
|
|
|
|
r <<= 4;
|
|
|
|
if (c >= 49 && c <= 54) {
|
|
r |= c - 49 + 0xa;
|
|
|
|
} else if (c >= 17 && c <= 22) {
|
|
r |= c - 17 + 0xa;
|
|
|
|
} else {
|
|
r |= c & 0xf;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
BN.prototype._parseHex = function _parseHex (number, start) {
|
|
this.length = Math.ceil((number.length - start) / 6);
|
|
this.words = new Array(this.length);
|
|
for (var i = 0; i < this.length; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
|
|
var j, w;
|
|
var off = 0;
|
|
for (i = number.length - 6, j = 0; i >= start; i -= 6) {
|
|
w = parseHex(number, i, i + 6);
|
|
this.words[j] |= (w << off) & 0x3ffffff;
|
|
this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
|
|
off += 24;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
j++;
|
|
}
|
|
}
|
|
if (i + 6 !== start) {
|
|
w = parseHex(number, start, i + 6);
|
|
this.words[j] |= (w << off) & 0x3ffffff;
|
|
this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
|
|
}
|
|
this.strip();
|
|
};
|
|
|
|
function parseBase (str, start, end, mul) {
|
|
var r = 0;
|
|
var len = Math.min(str.length, end);
|
|
for (var i = start; i < len; i++) {
|
|
var c = str.charCodeAt(i) - 48;
|
|
|
|
r *= mul;
|
|
|
|
if (c >= 49) {
|
|
r += c - 49 + 0xa;
|
|
|
|
} else if (c >= 17) {
|
|
r += c - 17 + 0xa;
|
|
|
|
} else {
|
|
r += c;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
BN.prototype._parseBase = function _parseBase (number, base, start) {
|
|
this.words = [ 0 ];
|
|
this.length = 1;
|
|
|
|
for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
|
|
limbLen++;
|
|
}
|
|
limbLen--;
|
|
limbPow = (limbPow / base) | 0;
|
|
|
|
var total = number.length - start;
|
|
var mod = total % limbLen;
|
|
var end = Math.min(total, total - mod) + start;
|
|
|
|
var word = 0;
|
|
for (var i = start; i < end; i += limbLen) {
|
|
word = parseBase(number, i, i + limbLen, base);
|
|
|
|
this.imuln(limbPow);
|
|
if (this.words[0] + word < 0x4000000) {
|
|
this.words[0] += word;
|
|
} else {
|
|
this._iaddn(word);
|
|
}
|
|
}
|
|
|
|
if (mod !== 0) {
|
|
var pow = 1;
|
|
word = parseBase(number, i, number.length, base);
|
|
|
|
for (i = 0; i < mod; i++) {
|
|
pow *= base;
|
|
}
|
|
|
|
this.imuln(pow);
|
|
if (this.words[0] + word < 0x4000000) {
|
|
this.words[0] += word;
|
|
} else {
|
|
this._iaddn(word);
|
|
}
|
|
}
|
|
};
|
|
|
|
BN.prototype.copy = function copy (dest) {
|
|
dest.words = new Array(this.length);
|
|
for (var i = 0; i < this.length; i++) {
|
|
dest.words[i] = this.words[i];
|
|
}
|
|
dest.length = this.length;
|
|
dest.negative = this.negative;
|
|
dest.red = this.red;
|
|
};
|
|
|
|
BN.prototype.clone = function clone () {
|
|
var r = new BN(null);
|
|
this.copy(r);
|
|
return r;
|
|
};
|
|
|
|
BN.prototype._expand = function _expand (size) {
|
|
while (this.length < size) {
|
|
this.words[this.length++] = 0;
|
|
}
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.strip = function strip () {
|
|
while (this.length > 1 && this.words[this.length - 1] === 0) {
|
|
this.length--;
|
|
}
|
|
return this._normSign();
|
|
};
|
|
|
|
BN.prototype._normSign = function _normSign () {
|
|
if (this.length === 1 && this.words[0] === 0) {
|
|
this.negative = 0;
|
|
}
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.inspect = function inspect () {
|
|
return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
|
|
};
|
|
|
|
|
|
|
|
var zeros = [
|
|
'',
|
|
'0',
|
|
'00',
|
|
'000',
|
|
'0000',
|
|
'00000',
|
|
'000000',
|
|
'0000000',
|
|
'00000000',
|
|
'000000000',
|
|
'0000000000',
|
|
'00000000000',
|
|
'000000000000',
|
|
'0000000000000',
|
|
'00000000000000',
|
|
'000000000000000',
|
|
'0000000000000000',
|
|
'00000000000000000',
|
|
'000000000000000000',
|
|
'0000000000000000000',
|
|
'00000000000000000000',
|
|
'000000000000000000000',
|
|
'0000000000000000000000',
|
|
'00000000000000000000000',
|
|
'000000000000000000000000',
|
|
'0000000000000000000000000'
|
|
];
|
|
|
|
var groupSizes = [
|
|
0, 0,
|
|
25, 16, 12, 11, 10, 9, 8,
|
|
8, 7, 7, 7, 7, 6, 6,
|
|
6, 6, 6, 6, 6, 5, 5,
|
|
5, 5, 5, 5, 5, 5, 5,
|
|
5, 5, 5, 5, 5, 5, 5
|
|
];
|
|
|
|
var groupBases = [
|
|
0, 0,
|
|
33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
|
|
43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
|
|
16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
|
|
6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
|
|
24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
|
|
];
|
|
|
|
BN.prototype.toString = function toString (base, padding) {
|
|
base = base || 10;
|
|
padding = padding | 0 || 1;
|
|
|
|
var out;
|
|
if (base === 16 || base === 'hex') {
|
|
out = '';
|
|
var off = 0;
|
|
var carry = 0;
|
|
for (var i = 0; i < this.length; i++) {
|
|
var w = this.words[i];
|
|
var word = (((w << off) | carry) & 0xffffff).toString(16);
|
|
carry = (w >>> (24 - off)) & 0xffffff;
|
|
if (carry !== 0 || i !== this.length - 1) {
|
|
out = zeros[6 - word.length] + word + out;
|
|
} else {
|
|
out = word + out;
|
|
}
|
|
off += 2;
|
|
if (off >= 26) {
|
|
off -= 26;
|
|
i--;
|
|
}
|
|
}
|
|
if (carry !== 0) {
|
|
out = carry.toString(16) + out;
|
|
}
|
|
while (out.length % padding !== 0) {
|
|
out = '0' + out;
|
|
}
|
|
if (this.negative !== 0) {
|
|
out = '-' + out;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
if (base === (base | 0) && base >= 2 && base <= 36) {
|
|
var groupSize = groupSizes[base];
|
|
var groupBase = groupBases[base];
|
|
out = '';
|
|
var c = this.clone();
|
|
c.negative = 0;
|
|
while (!c.isZero()) {
|
|
var r = c.modn(groupBase).toString(base);
|
|
c = c.idivn(groupBase);
|
|
|
|
if (!c.isZero()) {
|
|
out = zeros[groupSize - r.length] + r + out;
|
|
} else {
|
|
out = r + out;
|
|
}
|
|
}
|
|
if (this.isZero()) {
|
|
out = '0' + out;
|
|
}
|
|
while (out.length % padding !== 0) {
|
|
out = '0' + out;
|
|
}
|
|
if (this.negative !== 0) {
|
|
out = '-' + out;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
assert(false, 'Base should be between 2 and 36');
|
|
};
|
|
|
|
BN.prototype.toNumber = function toNumber () {
|
|
var ret = this.words[0];
|
|
if (this.length === 2) {
|
|
ret += this.words[1] * 0x4000000;
|
|
} else if (this.length === 3 && this.words[2] === 0x01) {
|
|
ret += 0x10000000000000 + (this.words[1] * 0x4000000);
|
|
} else if (this.length > 2) {
|
|
assert(false, 'Number can only safely store up to 53 bits');
|
|
}
|
|
return (this.negative !== 0) ? -ret : ret;
|
|
};
|
|
|
|
BN.prototype.toJSON = function toJSON () {
|
|
return this.toString(16);
|
|
};
|
|
|
|
BN.prototype.toBuffer = function toBuffer (endian, length) {
|
|
assert(typeof Buffer !== 'undefined');
|
|
return this.toArrayLike(Buffer, endian, length);
|
|
};
|
|
|
|
BN.prototype.toArray = function toArray (endian, length) {
|
|
return this.toArrayLike(Array, endian, length);
|
|
};
|
|
|
|
BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
|
|
var byteLength = this.byteLength();
|
|
var reqLength = length || Math.max(1, byteLength);
|
|
assert(byteLength <= reqLength, 'byte array longer than desired length');
|
|
assert(reqLength > 0, 'Requested array length <= 0');
|
|
|
|
this.strip();
|
|
var littleEndian = endian === 'le';
|
|
var res = new ArrayType(reqLength);
|
|
|
|
var b, i;
|
|
var q = this.clone();
|
|
if (!littleEndian) {
|
|
for (i = 0; i < reqLength - byteLength; i++) {
|
|
res[i] = 0;
|
|
}
|
|
|
|
for (i = 0; !q.isZero(); i++) {
|
|
b = q.andln(0xff);
|
|
q.iushrn(8);
|
|
|
|
res[reqLength - i - 1] = b;
|
|
}
|
|
} else {
|
|
for (i = 0; !q.isZero(); i++) {
|
|
b = q.andln(0xff);
|
|
q.iushrn(8);
|
|
|
|
res[i] = b;
|
|
}
|
|
|
|
for (; i < reqLength; i++) {
|
|
res[i] = 0;
|
|
}
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
if (Math.clz32) {
|
|
BN.prototype._countBits = function _countBits (w) {
|
|
return 32 - Math.clz32(w);
|
|
};
|
|
} else {
|
|
BN.prototype._countBits = function _countBits (w) {
|
|
var t = w;
|
|
var r = 0;
|
|
if (t >= 0x1000) {
|
|
r += 13;
|
|
t >>>= 13;
|
|
}
|
|
if (t >= 0x40) {
|
|
r += 7;
|
|
t >>>= 7;
|
|
}
|
|
if (t >= 0x8) {
|
|
r += 4;
|
|
t >>>= 4;
|
|
}
|
|
if (t >= 0x02) {
|
|
r += 2;
|
|
t >>>= 2;
|
|
}
|
|
return r + t;
|
|
};
|
|
}
|
|
|
|
BN.prototype._zeroBits = function _zeroBits (w) {
|
|
if (w === 0) return 26;
|
|
|
|
var t = w;
|
|
var r = 0;
|
|
if ((t & 0x1fff) === 0) {
|
|
r += 13;
|
|
t >>>= 13;
|
|
}
|
|
if ((t & 0x7f) === 0) {
|
|
r += 7;
|
|
t >>>= 7;
|
|
}
|
|
if ((t & 0xf) === 0) {
|
|
r += 4;
|
|
t >>>= 4;
|
|
}
|
|
if ((t & 0x3) === 0) {
|
|
r += 2;
|
|
t >>>= 2;
|
|
}
|
|
if ((t & 0x1) === 0) {
|
|
r++;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
BN.prototype.bitLength = function bitLength () {
|
|
var w = this.words[this.length - 1];
|
|
var hi = this._countBits(w);
|
|
return (this.length - 1) * 26 + hi;
|
|
};
|
|
|
|
function toBitArray (num) {
|
|
var w = new Array(num.bitLength());
|
|
|
|
for (var bit = 0; bit < w.length; bit++) {
|
|
var off = (bit / 26) | 0;
|
|
var wbit = bit % 26;
|
|
|
|
w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;
|
|
}
|
|
|
|
return w;
|
|
}
|
|
|
|
BN.prototype.zeroBits = function zeroBits () {
|
|
if (this.isZero()) return 0;
|
|
|
|
var r = 0;
|
|
for (var i = 0; i < this.length; i++) {
|
|
var b = this._zeroBits(this.words[i]);
|
|
r += b;
|
|
if (b !== 26) break;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
BN.prototype.byteLength = function byteLength () {
|
|
return Math.ceil(this.bitLength() / 8);
|
|
};
|
|
|
|
BN.prototype.toTwos = function toTwos (width) {
|
|
if (this.negative !== 0) {
|
|
return this.abs().inotn(width).iaddn(1);
|
|
}
|
|
return this.clone();
|
|
};
|
|
|
|
BN.prototype.fromTwos = function fromTwos (width) {
|
|
if (this.testn(width - 1)) {
|
|
return this.notn(width).iaddn(1).ineg();
|
|
}
|
|
return this.clone();
|
|
};
|
|
|
|
BN.prototype.isNeg = function isNeg () {
|
|
return this.negative !== 0;
|
|
};
|
|
|
|
BN.prototype.neg = function neg () {
|
|
return this.clone().ineg();
|
|
};
|
|
|
|
BN.prototype.ineg = function ineg () {
|
|
if (!this.isZero()) {
|
|
this.negative ^= 1;
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.iuor = function iuor (num) {
|
|
while (this.length < num.length) {
|
|
this.words[this.length++] = 0;
|
|
}
|
|
|
|
for (var i = 0; i < num.length; i++) {
|
|
this.words[i] = this.words[i] | num.words[i];
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.ior = function ior (num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuor(num);
|
|
};
|
|
|
|
BN.prototype.or = function or (num) {
|
|
if (this.length > num.length) return this.clone().ior(num);
|
|
return num.clone().ior(this);
|
|
};
|
|
|
|
BN.prototype.uor = function uor (num) {
|
|
if (this.length > num.length) return this.clone().iuor(num);
|
|
return num.clone().iuor(this);
|
|
};
|
|
|
|
BN.prototype.iuand = function iuand (num) {
|
|
var b;
|
|
if (this.length > num.length) {
|
|
b = num;
|
|
} else {
|
|
b = this;
|
|
}
|
|
|
|
for (var i = 0; i < b.length; i++) {
|
|
this.words[i] = this.words[i] & num.words[i];
|
|
}
|
|
|
|
this.length = b.length;
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.iand = function iand (num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuand(num);
|
|
};
|
|
|
|
BN.prototype.and = function and (num) {
|
|
if (this.length > num.length) return this.clone().iand(num);
|
|
return num.clone().iand(this);
|
|
};
|
|
|
|
BN.prototype.uand = function uand (num) {
|
|
if (this.length > num.length) return this.clone().iuand(num);
|
|
return num.clone().iuand(this);
|
|
};
|
|
|
|
BN.prototype.iuxor = function iuxor (num) {
|
|
var a;
|
|
var b;
|
|
if (this.length > num.length) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
|
|
for (var i = 0; i < b.length; i++) {
|
|
this.words[i] = a.words[i] ^ b.words[i];
|
|
}
|
|
|
|
if (this !== a) {
|
|
for (; i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
|
|
this.length = a.length;
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.ixor = function ixor (num) {
|
|
assert((this.negative | num.negative) === 0);
|
|
return this.iuxor(num);
|
|
};
|
|
|
|
BN.prototype.xor = function xor (num) {
|
|
if (this.length > num.length) return this.clone().ixor(num);
|
|
return num.clone().ixor(this);
|
|
};
|
|
|
|
BN.prototype.uxor = function uxor (num) {
|
|
if (this.length > num.length) return this.clone().iuxor(num);
|
|
return num.clone().iuxor(this);
|
|
};
|
|
|
|
BN.prototype.inotn = function inotn (width) {
|
|
assert(typeof width === 'number' && width >= 0);
|
|
|
|
var bytesNeeded = Math.ceil(width / 26) | 0;
|
|
var bitsLeft = width % 26;
|
|
|
|
this._expand(bytesNeeded);
|
|
|
|
if (bitsLeft > 0) {
|
|
bytesNeeded--;
|
|
}
|
|
|
|
for (var i = 0; i < bytesNeeded; i++) {
|
|
this.words[i] = ~this.words[i] & 0x3ffffff;
|
|
}
|
|
|
|
if (bitsLeft > 0) {
|
|
this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.notn = function notn (width) {
|
|
return this.clone().inotn(width);
|
|
};
|
|
|
|
BN.prototype.setn = function setn (bit, val) {
|
|
assert(typeof bit === 'number' && bit >= 0);
|
|
|
|
var off = (bit / 26) | 0;
|
|
var wbit = bit % 26;
|
|
|
|
this._expand(off + 1);
|
|
|
|
if (val) {
|
|
this.words[off] = this.words[off] | (1 << wbit);
|
|
} else {
|
|
this.words[off] = this.words[off] & ~(1 << wbit);
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.iadd = function iadd (num) {
|
|
var r;
|
|
|
|
if (this.negative !== 0 && num.negative === 0) {
|
|
this.negative = 0;
|
|
r = this.isub(num);
|
|
this.negative ^= 1;
|
|
return this._normSign();
|
|
|
|
} else if (this.negative === 0 && num.negative !== 0) {
|
|
num.negative = 0;
|
|
r = this.isub(num);
|
|
num.negative = 1;
|
|
return r._normSign();
|
|
}
|
|
|
|
var a, b;
|
|
if (this.length > num.length) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
|
|
var carry = 0;
|
|
for (var i = 0; i < b.length; i++) {
|
|
r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
|
|
this.words[i] = r & 0x3ffffff;
|
|
carry = r >>> 26;
|
|
}
|
|
for (; carry !== 0 && i < a.length; i++) {
|
|
r = (a.words[i] | 0) + carry;
|
|
this.words[i] = r & 0x3ffffff;
|
|
carry = r >>> 26;
|
|
}
|
|
|
|
this.length = a.length;
|
|
if (carry !== 0) {
|
|
this.words[this.length] = carry;
|
|
this.length++;
|
|
} else if (a !== this) {
|
|
for (; i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.add = function add (num) {
|
|
var res;
|
|
if (num.negative !== 0 && this.negative === 0) {
|
|
num.negative = 0;
|
|
res = this.sub(num);
|
|
num.negative ^= 1;
|
|
return res;
|
|
} else if (num.negative === 0 && this.negative !== 0) {
|
|
this.negative = 0;
|
|
res = num.sub(this);
|
|
this.negative = 1;
|
|
return res;
|
|
}
|
|
|
|
if (this.length > num.length) return this.clone().iadd(num);
|
|
|
|
return num.clone().iadd(this);
|
|
};
|
|
|
|
BN.prototype.isub = function isub (num) {
|
|
if (num.negative !== 0) {
|
|
num.negative = 0;
|
|
var r = this.iadd(num);
|
|
num.negative = 1;
|
|
return r._normSign();
|
|
|
|
} else if (this.negative !== 0) {
|
|
this.negative = 0;
|
|
this.iadd(num);
|
|
this.negative = 1;
|
|
return this._normSign();
|
|
}
|
|
|
|
var cmp = this.cmp(num);
|
|
|
|
if (cmp === 0) {
|
|
this.negative = 0;
|
|
this.length = 1;
|
|
this.words[0] = 0;
|
|
return this;
|
|
}
|
|
|
|
var a, b;
|
|
if (cmp > 0) {
|
|
a = this;
|
|
b = num;
|
|
} else {
|
|
a = num;
|
|
b = this;
|
|
}
|
|
|
|
var carry = 0;
|
|
for (var i = 0; i < b.length; i++) {
|
|
r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
|
|
carry = r >> 26;
|
|
this.words[i] = r & 0x3ffffff;
|
|
}
|
|
for (; carry !== 0 && i < a.length; i++) {
|
|
r = (a.words[i] | 0) + carry;
|
|
carry = r >> 26;
|
|
this.words[i] = r & 0x3ffffff;
|
|
}
|
|
|
|
if (carry === 0 && i < a.length && a !== this) {
|
|
for (; i < a.length; i++) {
|
|
this.words[i] = a.words[i];
|
|
}
|
|
}
|
|
|
|
this.length = Math.max(this.length, i);
|
|
|
|
if (a !== this) {
|
|
this.negative = 1;
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.sub = function sub (num) {
|
|
return this.clone().isub(num);
|
|
};
|
|
|
|
function smallMulTo (self, num, out) {
|
|
out.negative = num.negative ^ self.negative;
|
|
var len = (self.length + num.length) | 0;
|
|
out.length = len;
|
|
len = (len - 1) | 0;
|
|
|
|
var a = self.words[0] | 0;
|
|
var b = num.words[0] | 0;
|
|
var r = a * b;
|
|
|
|
var lo = r & 0x3ffffff;
|
|
var carry = (r / 0x4000000) | 0;
|
|
out.words[0] = lo;
|
|
|
|
for (var k = 1; k < len; k++) {
|
|
var ncarry = carry >>> 26;
|
|
var rword = carry & 0x3ffffff;
|
|
var maxJ = Math.min(k, num.length - 1);
|
|
for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
|
|
var i = (k - j) | 0;
|
|
a = self.words[i] | 0;
|
|
b = num.words[j] | 0;
|
|
r = a * b + rword;
|
|
ncarry += (r / 0x4000000) | 0;
|
|
rword = r & 0x3ffffff;
|
|
}
|
|
out.words[k] = rword | 0;
|
|
carry = ncarry | 0;
|
|
}
|
|
if (carry !== 0) {
|
|
out.words[k] = carry | 0;
|
|
} else {
|
|
out.length--;
|
|
}
|
|
|
|
return out.strip();
|
|
}
|
|
|
|
var comb10MulTo = function comb10MulTo (self, num, out) {
|
|
var a = self.words;
|
|
var b = num.words;
|
|
var o = out.words;
|
|
var c = 0;
|
|
var lo;
|
|
var mid;
|
|
var hi;
|
|
var a0 = a[0] | 0;
|
|
var al0 = a0 & 0x1fff;
|
|
var ah0 = a0 >>> 13;
|
|
var a1 = a[1] | 0;
|
|
var al1 = a1 & 0x1fff;
|
|
var ah1 = a1 >>> 13;
|
|
var a2 = a[2] | 0;
|
|
var al2 = a2 & 0x1fff;
|
|
var ah2 = a2 >>> 13;
|
|
var a3 = a[3] | 0;
|
|
var al3 = a3 & 0x1fff;
|
|
var ah3 = a3 >>> 13;
|
|
var a4 = a[4] | 0;
|
|
var al4 = a4 & 0x1fff;
|
|
var ah4 = a4 >>> 13;
|
|
var a5 = a[5] | 0;
|
|
var al5 = a5 & 0x1fff;
|
|
var ah5 = a5 >>> 13;
|
|
var a6 = a[6] | 0;
|
|
var al6 = a6 & 0x1fff;
|
|
var ah6 = a6 >>> 13;
|
|
var a7 = a[7] | 0;
|
|
var al7 = a7 & 0x1fff;
|
|
var ah7 = a7 >>> 13;
|
|
var a8 = a[8] | 0;
|
|
var al8 = a8 & 0x1fff;
|
|
var ah8 = a8 >>> 13;
|
|
var a9 = a[9] | 0;
|
|
var al9 = a9 & 0x1fff;
|
|
var ah9 = a9 >>> 13;
|
|
var b0 = b[0] | 0;
|
|
var bl0 = b0 & 0x1fff;
|
|
var bh0 = b0 >>> 13;
|
|
var b1 = b[1] | 0;
|
|
var bl1 = b1 & 0x1fff;
|
|
var bh1 = b1 >>> 13;
|
|
var b2 = b[2] | 0;
|
|
var bl2 = b2 & 0x1fff;
|
|
var bh2 = b2 >>> 13;
|
|
var b3 = b[3] | 0;
|
|
var bl3 = b3 & 0x1fff;
|
|
var bh3 = b3 >>> 13;
|
|
var b4 = b[4] | 0;
|
|
var bl4 = b4 & 0x1fff;
|
|
var bh4 = b4 >>> 13;
|
|
var b5 = b[5] | 0;
|
|
var bl5 = b5 & 0x1fff;
|
|
var bh5 = b5 >>> 13;
|
|
var b6 = b[6] | 0;
|
|
var bl6 = b6 & 0x1fff;
|
|
var bh6 = b6 >>> 13;
|
|
var b7 = b[7] | 0;
|
|
var bl7 = b7 & 0x1fff;
|
|
var bh7 = b7 >>> 13;
|
|
var b8 = b[8] | 0;
|
|
var bl8 = b8 & 0x1fff;
|
|
var bh8 = b8 >>> 13;
|
|
var b9 = b[9] | 0;
|
|
var bl9 = b9 & 0x1fff;
|
|
var bh9 = b9 >>> 13;
|
|
|
|
out.negative = self.negative ^ num.negative;
|
|
out.length = 19;
|
|
|
|
lo = Math.imul(al0, bl0);
|
|
mid = Math.imul(al0, bh0);
|
|
mid = (mid + Math.imul(ah0, bl0)) | 0;
|
|
hi = Math.imul(ah0, bh0);
|
|
var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
|
|
w0 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al1, bl0);
|
|
mid = Math.imul(al1, bh0);
|
|
mid = (mid + Math.imul(ah1, bl0)) | 0;
|
|
hi = Math.imul(ah1, bh0);
|
|
lo = (lo + Math.imul(al0, bl1)) | 0;
|
|
mid = (mid + Math.imul(al0, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh1)) | 0;
|
|
var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
|
|
w1 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al2, bl0);
|
|
mid = Math.imul(al2, bh0);
|
|
mid = (mid + Math.imul(ah2, bl0)) | 0;
|
|
hi = Math.imul(ah2, bh0);
|
|
lo = (lo + Math.imul(al1, bl1)) | 0;
|
|
mid = (mid + Math.imul(al1, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh1)) | 0;
|
|
lo = (lo + Math.imul(al0, bl2)) | 0;
|
|
mid = (mid + Math.imul(al0, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh2)) | 0;
|
|
var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
|
|
w2 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al3, bl0);
|
|
mid = Math.imul(al3, bh0);
|
|
mid = (mid + Math.imul(ah3, bl0)) | 0;
|
|
hi = Math.imul(ah3, bh0);
|
|
lo = (lo + Math.imul(al2, bl1)) | 0;
|
|
mid = (mid + Math.imul(al2, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh1)) | 0;
|
|
lo = (lo + Math.imul(al1, bl2)) | 0;
|
|
mid = (mid + Math.imul(al1, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh2)) | 0;
|
|
lo = (lo + Math.imul(al0, bl3)) | 0;
|
|
mid = (mid + Math.imul(al0, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh3)) | 0;
|
|
var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
|
|
w3 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al4, bl0);
|
|
mid = Math.imul(al4, bh0);
|
|
mid = (mid + Math.imul(ah4, bl0)) | 0;
|
|
hi = Math.imul(ah4, bh0);
|
|
lo = (lo + Math.imul(al3, bl1)) | 0;
|
|
mid = (mid + Math.imul(al3, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh1)) | 0;
|
|
lo = (lo + Math.imul(al2, bl2)) | 0;
|
|
mid = (mid + Math.imul(al2, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh2)) | 0;
|
|
lo = (lo + Math.imul(al1, bl3)) | 0;
|
|
mid = (mid + Math.imul(al1, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh3)) | 0;
|
|
lo = (lo + Math.imul(al0, bl4)) | 0;
|
|
mid = (mid + Math.imul(al0, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh4)) | 0;
|
|
var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
|
|
w4 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al5, bl0);
|
|
mid = Math.imul(al5, bh0);
|
|
mid = (mid + Math.imul(ah5, bl0)) | 0;
|
|
hi = Math.imul(ah5, bh0);
|
|
lo = (lo + Math.imul(al4, bl1)) | 0;
|
|
mid = (mid + Math.imul(al4, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh1)) | 0;
|
|
lo = (lo + Math.imul(al3, bl2)) | 0;
|
|
mid = (mid + Math.imul(al3, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh2)) | 0;
|
|
lo = (lo + Math.imul(al2, bl3)) | 0;
|
|
mid = (mid + Math.imul(al2, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh3)) | 0;
|
|
lo = (lo + Math.imul(al1, bl4)) | 0;
|
|
mid = (mid + Math.imul(al1, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh4)) | 0;
|
|
lo = (lo + Math.imul(al0, bl5)) | 0;
|
|
mid = (mid + Math.imul(al0, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh5)) | 0;
|
|
var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
|
|
w5 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al6, bl0);
|
|
mid = Math.imul(al6, bh0);
|
|
mid = (mid + Math.imul(ah6, bl0)) | 0;
|
|
hi = Math.imul(ah6, bh0);
|
|
lo = (lo + Math.imul(al5, bl1)) | 0;
|
|
mid = (mid + Math.imul(al5, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh1)) | 0;
|
|
lo = (lo + Math.imul(al4, bl2)) | 0;
|
|
mid = (mid + Math.imul(al4, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh2)) | 0;
|
|
lo = (lo + Math.imul(al3, bl3)) | 0;
|
|
mid = (mid + Math.imul(al3, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh3)) | 0;
|
|
lo = (lo + Math.imul(al2, bl4)) | 0;
|
|
mid = (mid + Math.imul(al2, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh4)) | 0;
|
|
lo = (lo + Math.imul(al1, bl5)) | 0;
|
|
mid = (mid + Math.imul(al1, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh5)) | 0;
|
|
lo = (lo + Math.imul(al0, bl6)) | 0;
|
|
mid = (mid + Math.imul(al0, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh6)) | 0;
|
|
var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
|
|
w6 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al7, bl0);
|
|
mid = Math.imul(al7, bh0);
|
|
mid = (mid + Math.imul(ah7, bl0)) | 0;
|
|
hi = Math.imul(ah7, bh0);
|
|
lo = (lo + Math.imul(al6, bl1)) | 0;
|
|
mid = (mid + Math.imul(al6, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh1)) | 0;
|
|
lo = (lo + Math.imul(al5, bl2)) | 0;
|
|
mid = (mid + Math.imul(al5, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh2)) | 0;
|
|
lo = (lo + Math.imul(al4, bl3)) | 0;
|
|
mid = (mid + Math.imul(al4, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh3)) | 0;
|
|
lo = (lo + Math.imul(al3, bl4)) | 0;
|
|
mid = (mid + Math.imul(al3, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh4)) | 0;
|
|
lo = (lo + Math.imul(al2, bl5)) | 0;
|
|
mid = (mid + Math.imul(al2, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh5)) | 0;
|
|
lo = (lo + Math.imul(al1, bl6)) | 0;
|
|
mid = (mid + Math.imul(al1, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh6)) | 0;
|
|
lo = (lo + Math.imul(al0, bl7)) | 0;
|
|
mid = (mid + Math.imul(al0, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh7)) | 0;
|
|
var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
|
|
w7 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al8, bl0);
|
|
mid = Math.imul(al8, bh0);
|
|
mid = (mid + Math.imul(ah8, bl0)) | 0;
|
|
hi = Math.imul(ah8, bh0);
|
|
lo = (lo + Math.imul(al7, bl1)) | 0;
|
|
mid = (mid + Math.imul(al7, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh1)) | 0;
|
|
lo = (lo + Math.imul(al6, bl2)) | 0;
|
|
mid = (mid + Math.imul(al6, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh2)) | 0;
|
|
lo = (lo + Math.imul(al5, bl3)) | 0;
|
|
mid = (mid + Math.imul(al5, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh3)) | 0;
|
|
lo = (lo + Math.imul(al4, bl4)) | 0;
|
|
mid = (mid + Math.imul(al4, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh4)) | 0;
|
|
lo = (lo + Math.imul(al3, bl5)) | 0;
|
|
mid = (mid + Math.imul(al3, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh5)) | 0;
|
|
lo = (lo + Math.imul(al2, bl6)) | 0;
|
|
mid = (mid + Math.imul(al2, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh6)) | 0;
|
|
lo = (lo + Math.imul(al1, bl7)) | 0;
|
|
mid = (mid + Math.imul(al1, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh7)) | 0;
|
|
lo = (lo + Math.imul(al0, bl8)) | 0;
|
|
mid = (mid + Math.imul(al0, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh8)) | 0;
|
|
var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
|
|
w8 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl0);
|
|
mid = Math.imul(al9, bh0);
|
|
mid = (mid + Math.imul(ah9, bl0)) | 0;
|
|
hi = Math.imul(ah9, bh0);
|
|
lo = (lo + Math.imul(al8, bl1)) | 0;
|
|
mid = (mid + Math.imul(al8, bh1)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl1)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh1)) | 0;
|
|
lo = (lo + Math.imul(al7, bl2)) | 0;
|
|
mid = (mid + Math.imul(al7, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh2)) | 0;
|
|
lo = (lo + Math.imul(al6, bl3)) | 0;
|
|
mid = (mid + Math.imul(al6, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh3)) | 0;
|
|
lo = (lo + Math.imul(al5, bl4)) | 0;
|
|
mid = (mid + Math.imul(al5, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh4)) | 0;
|
|
lo = (lo + Math.imul(al4, bl5)) | 0;
|
|
mid = (mid + Math.imul(al4, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh5)) | 0;
|
|
lo = (lo + Math.imul(al3, bl6)) | 0;
|
|
mid = (mid + Math.imul(al3, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh6)) | 0;
|
|
lo = (lo + Math.imul(al2, bl7)) | 0;
|
|
mid = (mid + Math.imul(al2, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh7)) | 0;
|
|
lo = (lo + Math.imul(al1, bl8)) | 0;
|
|
mid = (mid + Math.imul(al1, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh8)) | 0;
|
|
lo = (lo + Math.imul(al0, bl9)) | 0;
|
|
mid = (mid + Math.imul(al0, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah0, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah0, bh9)) | 0;
|
|
var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
|
|
w9 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl1);
|
|
mid = Math.imul(al9, bh1);
|
|
mid = (mid + Math.imul(ah9, bl1)) | 0;
|
|
hi = Math.imul(ah9, bh1);
|
|
lo = (lo + Math.imul(al8, bl2)) | 0;
|
|
mid = (mid + Math.imul(al8, bh2)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl2)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh2)) | 0;
|
|
lo = (lo + Math.imul(al7, bl3)) | 0;
|
|
mid = (mid + Math.imul(al7, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh3)) | 0;
|
|
lo = (lo + Math.imul(al6, bl4)) | 0;
|
|
mid = (mid + Math.imul(al6, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh4)) | 0;
|
|
lo = (lo + Math.imul(al5, bl5)) | 0;
|
|
mid = (mid + Math.imul(al5, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh5)) | 0;
|
|
lo = (lo + Math.imul(al4, bl6)) | 0;
|
|
mid = (mid + Math.imul(al4, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh6)) | 0;
|
|
lo = (lo + Math.imul(al3, bl7)) | 0;
|
|
mid = (mid + Math.imul(al3, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh7)) | 0;
|
|
lo = (lo + Math.imul(al2, bl8)) | 0;
|
|
mid = (mid + Math.imul(al2, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh8)) | 0;
|
|
lo = (lo + Math.imul(al1, bl9)) | 0;
|
|
mid = (mid + Math.imul(al1, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah1, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah1, bh9)) | 0;
|
|
var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
|
|
w10 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl2);
|
|
mid = Math.imul(al9, bh2);
|
|
mid = (mid + Math.imul(ah9, bl2)) | 0;
|
|
hi = Math.imul(ah9, bh2);
|
|
lo = (lo + Math.imul(al8, bl3)) | 0;
|
|
mid = (mid + Math.imul(al8, bh3)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl3)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh3)) | 0;
|
|
lo = (lo + Math.imul(al7, bl4)) | 0;
|
|
mid = (mid + Math.imul(al7, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh4)) | 0;
|
|
lo = (lo + Math.imul(al6, bl5)) | 0;
|
|
mid = (mid + Math.imul(al6, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh5)) | 0;
|
|
lo = (lo + Math.imul(al5, bl6)) | 0;
|
|
mid = (mid + Math.imul(al5, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh6)) | 0;
|
|
lo = (lo + Math.imul(al4, bl7)) | 0;
|
|
mid = (mid + Math.imul(al4, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh7)) | 0;
|
|
lo = (lo + Math.imul(al3, bl8)) | 0;
|
|
mid = (mid + Math.imul(al3, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh8)) | 0;
|
|
lo = (lo + Math.imul(al2, bl9)) | 0;
|
|
mid = (mid + Math.imul(al2, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah2, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah2, bh9)) | 0;
|
|
var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
|
|
w11 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl3);
|
|
mid = Math.imul(al9, bh3);
|
|
mid = (mid + Math.imul(ah9, bl3)) | 0;
|
|
hi = Math.imul(ah9, bh3);
|
|
lo = (lo + Math.imul(al8, bl4)) | 0;
|
|
mid = (mid + Math.imul(al8, bh4)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl4)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh4)) | 0;
|
|
lo = (lo + Math.imul(al7, bl5)) | 0;
|
|
mid = (mid + Math.imul(al7, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh5)) | 0;
|
|
lo = (lo + Math.imul(al6, bl6)) | 0;
|
|
mid = (mid + Math.imul(al6, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh6)) | 0;
|
|
lo = (lo + Math.imul(al5, bl7)) | 0;
|
|
mid = (mid + Math.imul(al5, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh7)) | 0;
|
|
lo = (lo + Math.imul(al4, bl8)) | 0;
|
|
mid = (mid + Math.imul(al4, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh8)) | 0;
|
|
lo = (lo + Math.imul(al3, bl9)) | 0;
|
|
mid = (mid + Math.imul(al3, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah3, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah3, bh9)) | 0;
|
|
var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
|
|
w12 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl4);
|
|
mid = Math.imul(al9, bh4);
|
|
mid = (mid + Math.imul(ah9, bl4)) | 0;
|
|
hi = Math.imul(ah9, bh4);
|
|
lo = (lo + Math.imul(al8, bl5)) | 0;
|
|
mid = (mid + Math.imul(al8, bh5)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl5)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh5)) | 0;
|
|
lo = (lo + Math.imul(al7, bl6)) | 0;
|
|
mid = (mid + Math.imul(al7, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh6)) | 0;
|
|
lo = (lo + Math.imul(al6, bl7)) | 0;
|
|
mid = (mid + Math.imul(al6, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh7)) | 0;
|
|
lo = (lo + Math.imul(al5, bl8)) | 0;
|
|
mid = (mid + Math.imul(al5, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh8)) | 0;
|
|
lo = (lo + Math.imul(al4, bl9)) | 0;
|
|
mid = (mid + Math.imul(al4, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah4, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah4, bh9)) | 0;
|
|
var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
|
|
w13 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl5);
|
|
mid = Math.imul(al9, bh5);
|
|
mid = (mid + Math.imul(ah9, bl5)) | 0;
|
|
hi = Math.imul(ah9, bh5);
|
|
lo = (lo + Math.imul(al8, bl6)) | 0;
|
|
mid = (mid + Math.imul(al8, bh6)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl6)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh6)) | 0;
|
|
lo = (lo + Math.imul(al7, bl7)) | 0;
|
|
mid = (mid + Math.imul(al7, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh7)) | 0;
|
|
lo = (lo + Math.imul(al6, bl8)) | 0;
|
|
mid = (mid + Math.imul(al6, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh8)) | 0;
|
|
lo = (lo + Math.imul(al5, bl9)) | 0;
|
|
mid = (mid + Math.imul(al5, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah5, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah5, bh9)) | 0;
|
|
var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
|
|
w14 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl6);
|
|
mid = Math.imul(al9, bh6);
|
|
mid = (mid + Math.imul(ah9, bl6)) | 0;
|
|
hi = Math.imul(ah9, bh6);
|
|
lo = (lo + Math.imul(al8, bl7)) | 0;
|
|
mid = (mid + Math.imul(al8, bh7)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl7)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh7)) | 0;
|
|
lo = (lo + Math.imul(al7, bl8)) | 0;
|
|
mid = (mid + Math.imul(al7, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh8)) | 0;
|
|
lo = (lo + Math.imul(al6, bl9)) | 0;
|
|
mid = (mid + Math.imul(al6, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah6, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah6, bh9)) | 0;
|
|
var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
|
|
w15 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl7);
|
|
mid = Math.imul(al9, bh7);
|
|
mid = (mid + Math.imul(ah9, bl7)) | 0;
|
|
hi = Math.imul(ah9, bh7);
|
|
lo = (lo + Math.imul(al8, bl8)) | 0;
|
|
mid = (mid + Math.imul(al8, bh8)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl8)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh8)) | 0;
|
|
lo = (lo + Math.imul(al7, bl9)) | 0;
|
|
mid = (mid + Math.imul(al7, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah7, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah7, bh9)) | 0;
|
|
var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
|
|
w16 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl8);
|
|
mid = Math.imul(al9, bh8);
|
|
mid = (mid + Math.imul(ah9, bl8)) | 0;
|
|
hi = Math.imul(ah9, bh8);
|
|
lo = (lo + Math.imul(al8, bl9)) | 0;
|
|
mid = (mid + Math.imul(al8, bh9)) | 0;
|
|
mid = (mid + Math.imul(ah8, bl9)) | 0;
|
|
hi = (hi + Math.imul(ah8, bh9)) | 0;
|
|
var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
|
|
w17 &= 0x3ffffff;
|
|
|
|
lo = Math.imul(al9, bl9);
|
|
mid = Math.imul(al9, bh9);
|
|
mid = (mid + Math.imul(ah9, bl9)) | 0;
|
|
hi = Math.imul(ah9, bh9);
|
|
var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
|
|
c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
|
|
w18 &= 0x3ffffff;
|
|
o[0] = w0;
|
|
o[1] = w1;
|
|
o[2] = w2;
|
|
o[3] = w3;
|
|
o[4] = w4;
|
|
o[5] = w5;
|
|
o[6] = w6;
|
|
o[7] = w7;
|
|
o[8] = w8;
|
|
o[9] = w9;
|
|
o[10] = w10;
|
|
o[11] = w11;
|
|
o[12] = w12;
|
|
o[13] = w13;
|
|
o[14] = w14;
|
|
o[15] = w15;
|
|
o[16] = w16;
|
|
o[17] = w17;
|
|
o[18] = w18;
|
|
if (c !== 0) {
|
|
o[19] = c;
|
|
out.length++;
|
|
}
|
|
return out;
|
|
};
|
|
|
|
if (!Math.imul) {
|
|
comb10MulTo = smallMulTo;
|
|
}
|
|
|
|
function bigMulTo (self, num, out) {
|
|
out.negative = num.negative ^ self.negative;
|
|
out.length = self.length + num.length;
|
|
|
|
var carry = 0;
|
|
var hncarry = 0;
|
|
for (var k = 0; k < out.length - 1; k++) {
|
|
var ncarry = hncarry;
|
|
hncarry = 0;
|
|
var rword = carry & 0x3ffffff;
|
|
var maxJ = Math.min(k, num.length - 1);
|
|
for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
|
|
var i = k - j;
|
|
var a = self.words[i] | 0;
|
|
var b = num.words[j] | 0;
|
|
var r = a * b;
|
|
|
|
var lo = r & 0x3ffffff;
|
|
ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
|
|
lo = (lo + rword) | 0;
|
|
rword = lo & 0x3ffffff;
|
|
ncarry = (ncarry + (lo >>> 26)) | 0;
|
|
|
|
hncarry += ncarry >>> 26;
|
|
ncarry &= 0x3ffffff;
|
|
}
|
|
out.words[k] = rword;
|
|
carry = ncarry;
|
|
ncarry = hncarry;
|
|
}
|
|
if (carry !== 0) {
|
|
out.words[k] = carry;
|
|
} else {
|
|
out.length--;
|
|
}
|
|
|
|
return out.strip();
|
|
}
|
|
|
|
function jumboMulTo (self, num, out) {
|
|
var fftm = new FFTM();
|
|
return fftm.mulp(self, num, out);
|
|
}
|
|
|
|
BN.prototype.mulTo = function mulTo (num, out) {
|
|
var res;
|
|
var len = this.length + num.length;
|
|
if (this.length === 10 && num.length === 10) {
|
|
res = comb10MulTo(this, num, out);
|
|
} else if (len < 63) {
|
|
res = smallMulTo(this, num, out);
|
|
} else if (len < 1024) {
|
|
res = bigMulTo(this, num, out);
|
|
} else {
|
|
res = jumboMulTo(this, num, out);
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
|
|
function FFTM (x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
|
|
FFTM.prototype.makeRBT = function makeRBT (N) {
|
|
var t = new Array(N);
|
|
var l = BN.prototype._countBits(N) - 1;
|
|
for (var i = 0; i < N; i++) {
|
|
t[i] = this.revBin(i, l, N);
|
|
}
|
|
|
|
return t;
|
|
};
|
|
|
|
FFTM.prototype.revBin = function revBin (x, l, N) {
|
|
if (x === 0 || x === N - 1) return x;
|
|
|
|
var rb = 0;
|
|
for (var i = 0; i < l; i++) {
|
|
rb |= (x & 1) << (l - i - 1);
|
|
x >>= 1;
|
|
}
|
|
|
|
return rb;
|
|
};
|
|
|
|
FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
|
|
for (var i = 0; i < N; i++) {
|
|
rtws[i] = rws[rbt[i]];
|
|
itws[i] = iws[rbt[i]];
|
|
}
|
|
};
|
|
|
|
FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
|
|
this.permute(rbt, rws, iws, rtws, itws, N);
|
|
|
|
for (var s = 1; s < N; s <<= 1) {
|
|
var l = s << 1;
|
|
|
|
var rtwdf = Math.cos(2 * Math.PI / l);
|
|
var itwdf = Math.sin(2 * Math.PI / l);
|
|
|
|
for (var p = 0; p < N; p += l) {
|
|
var rtwdf_ = rtwdf;
|
|
var itwdf_ = itwdf;
|
|
|
|
for (var j = 0; j < s; j++) {
|
|
var re = rtws[p + j];
|
|
var ie = itws[p + j];
|
|
|
|
var ro = rtws[p + j + s];
|
|
var io = itws[p + j + s];
|
|
|
|
var rx = rtwdf_ * ro - itwdf_ * io;
|
|
|
|
io = rtwdf_ * io + itwdf_ * ro;
|
|
ro = rx;
|
|
|
|
rtws[p + j] = re + ro;
|
|
itws[p + j] = ie + io;
|
|
|
|
rtws[p + j + s] = re - ro;
|
|
itws[p + j + s] = ie - io;
|
|
|
|
|
|
if (j !== l) {
|
|
rx = rtwdf * rtwdf_ - itwdf * itwdf_;
|
|
|
|
itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
|
|
rtwdf_ = rx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
|
|
var N = Math.max(m, n) | 1;
|
|
var odd = N & 1;
|
|
var i = 0;
|
|
for (N = N / 2 | 0; N; N = N >>> 1) {
|
|
i++;
|
|
}
|
|
|
|
return 1 << i + 1 + odd;
|
|
};
|
|
|
|
FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
|
|
if (N <= 1) return;
|
|
|
|
for (var i = 0; i < N / 2; i++) {
|
|
var t = rws[i];
|
|
|
|
rws[i] = rws[N - i - 1];
|
|
rws[N - i - 1] = t;
|
|
|
|
t = iws[i];
|
|
|
|
iws[i] = -iws[N - i - 1];
|
|
iws[N - i - 1] = -t;
|
|
}
|
|
};
|
|
|
|
FFTM.prototype.normalize13b = function normalize13b (ws, N) {
|
|
var carry = 0;
|
|
for (var i = 0; i < N / 2; i++) {
|
|
var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
|
|
Math.round(ws[2 * i] / N) +
|
|
carry;
|
|
|
|
ws[i] = w & 0x3ffffff;
|
|
|
|
if (w < 0x4000000) {
|
|
carry = 0;
|
|
} else {
|
|
carry = w / 0x4000000 | 0;
|
|
}
|
|
}
|
|
|
|
return ws;
|
|
};
|
|
|
|
FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
|
|
var carry = 0;
|
|
for (var i = 0; i < len; i++) {
|
|
carry = carry + (ws[i] | 0);
|
|
|
|
rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
|
|
rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
|
|
}
|
|
|
|
for (i = 2 * len; i < N; ++i) {
|
|
rws[i] = 0;
|
|
}
|
|
|
|
assert(carry === 0);
|
|
assert((carry & ~0x1fff) === 0);
|
|
};
|
|
|
|
FFTM.prototype.stub = function stub (N) {
|
|
var ph = new Array(N);
|
|
for (var i = 0; i < N; i++) {
|
|
ph[i] = 0;
|
|
}
|
|
|
|
return ph;
|
|
};
|
|
|
|
FFTM.prototype.mulp = function mulp (x, y, out) {
|
|
var N = 2 * this.guessLen13b(x.length, y.length);
|
|
|
|
var rbt = this.makeRBT(N);
|
|
|
|
var _ = this.stub(N);
|
|
|
|
var rws = new Array(N);
|
|
var rwst = new Array(N);
|
|
var iwst = new Array(N);
|
|
|
|
var nrws = new Array(N);
|
|
var nrwst = new Array(N);
|
|
var niwst = new Array(N);
|
|
|
|
var rmws = out.words;
|
|
rmws.length = N;
|
|
|
|
this.convert13b(x.words, x.length, rws, N);
|
|
this.convert13b(y.words, y.length, nrws, N);
|
|
|
|
this.transform(rws, _, rwst, iwst, N, rbt);
|
|
this.transform(nrws, _, nrwst, niwst, N, rbt);
|
|
|
|
for (var i = 0; i < N; i++) {
|
|
var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
|
|
iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
|
|
rwst[i] = rx;
|
|
}
|
|
|
|
this.conjugate(rwst, iwst, N);
|
|
this.transform(rwst, iwst, rmws, _, N, rbt);
|
|
this.conjugate(rmws, _, N);
|
|
this.normalize13b(rmws, N);
|
|
|
|
out.negative = x.negative ^ y.negative;
|
|
out.length = x.length + y.length;
|
|
return out.strip();
|
|
};
|
|
|
|
BN.prototype.mul = function mul (num) {
|
|
var out = new BN(null);
|
|
out.words = new Array(this.length + num.length);
|
|
return this.mulTo(num, out);
|
|
};
|
|
|
|
BN.prototype.mulf = function mulf (num) {
|
|
var out = new BN(null);
|
|
out.words = new Array(this.length + num.length);
|
|
return jumboMulTo(this, num, out);
|
|
};
|
|
|
|
BN.prototype.imul = function imul (num) {
|
|
return this.clone().mulTo(num, this);
|
|
};
|
|
|
|
BN.prototype.imuln = function imuln (num) {
|
|
assert(typeof num === 'number');
|
|
assert(num < 0x4000000);
|
|
|
|
var carry = 0;
|
|
for (var i = 0; i < this.length; i++) {
|
|
var w = (this.words[i] | 0) * num;
|
|
var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
|
|
carry >>= 26;
|
|
carry += (w / 0x4000000) | 0;
|
|
carry += lo >>> 26;
|
|
this.words[i] = lo & 0x3ffffff;
|
|
}
|
|
|
|
if (carry !== 0) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.muln = function muln (num) {
|
|
return this.clone().imuln(num);
|
|
};
|
|
|
|
BN.prototype.sqr = function sqr () {
|
|
return this.mul(this);
|
|
};
|
|
|
|
BN.prototype.isqr = function isqr () {
|
|
return this.imul(this.clone());
|
|
};
|
|
|
|
BN.prototype.pow = function pow (num) {
|
|
var w = toBitArray(num);
|
|
if (w.length === 0) return new BN(1);
|
|
|
|
var res = this;
|
|
for (var i = 0; i < w.length; i++, res = res.sqr()) {
|
|
if (w[i] !== 0) break;
|
|
}
|
|
|
|
if (++i < w.length) {
|
|
for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
|
|
if (w[i] === 0) continue;
|
|
|
|
res = res.mul(q);
|
|
}
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
BN.prototype.iushln = function iushln (bits) {
|
|
assert(typeof bits === 'number' && bits >= 0);
|
|
var r = bits % 26;
|
|
var s = (bits - r) / 26;
|
|
var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
|
|
var i;
|
|
|
|
if (r !== 0) {
|
|
var carry = 0;
|
|
|
|
for (i = 0; i < this.length; i++) {
|
|
var newCarry = this.words[i] & carryMask;
|
|
var c = ((this.words[i] | 0) - newCarry) << r;
|
|
this.words[i] = c | carry;
|
|
carry = newCarry >>> (26 - r);
|
|
}
|
|
|
|
if (carry) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
}
|
|
|
|
if (s !== 0) {
|
|
for (i = this.length - 1; i >= 0; i--) {
|
|
this.words[i + s] = this.words[i];
|
|
}
|
|
|
|
for (i = 0; i < s; i++) {
|
|
this.words[i] = 0;
|
|
}
|
|
|
|
this.length += s;
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.ishln = function ishln (bits) {
|
|
assert(this.negative === 0);
|
|
return this.iushln(bits);
|
|
};
|
|
|
|
BN.prototype.iushrn = function iushrn (bits, hint, extended) {
|
|
assert(typeof bits === 'number' && bits >= 0);
|
|
var h;
|
|
if (hint) {
|
|
h = (hint - (hint % 26)) / 26;
|
|
} else {
|
|
h = 0;
|
|
}
|
|
|
|
var r = bits % 26;
|
|
var s = Math.min((bits - r) / 26, this.length);
|
|
var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
|
|
var maskedWords = extended;
|
|
|
|
h -= s;
|
|
h = Math.max(0, h);
|
|
|
|
if (maskedWords) {
|
|
for (var i = 0; i < s; i++) {
|
|
maskedWords.words[i] = this.words[i];
|
|
}
|
|
maskedWords.length = s;
|
|
}
|
|
|
|
if (s === 0) {
|
|
} else if (this.length > s) {
|
|
this.length -= s;
|
|
for (i = 0; i < this.length; i++) {
|
|
this.words[i] = this.words[i + s];
|
|
}
|
|
} else {
|
|
this.words[0] = 0;
|
|
this.length = 1;
|
|
}
|
|
|
|
var carry = 0;
|
|
for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
|
|
var word = this.words[i] | 0;
|
|
this.words[i] = (carry << (26 - r)) | (word >>> r);
|
|
carry = word & mask;
|
|
}
|
|
|
|
if (maskedWords && carry !== 0) {
|
|
maskedWords.words[maskedWords.length++] = carry;
|
|
}
|
|
|
|
if (this.length === 0) {
|
|
this.words[0] = 0;
|
|
this.length = 1;
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.ishrn = function ishrn (bits, hint, extended) {
|
|
assert(this.negative === 0);
|
|
return this.iushrn(bits, hint, extended);
|
|
};
|
|
|
|
BN.prototype.shln = function shln (bits) {
|
|
return this.clone().ishln(bits);
|
|
};
|
|
|
|
BN.prototype.ushln = function ushln (bits) {
|
|
return this.clone().iushln(bits);
|
|
};
|
|
|
|
BN.prototype.shrn = function shrn (bits) {
|
|
return this.clone().ishrn(bits);
|
|
};
|
|
|
|
BN.prototype.ushrn = function ushrn (bits) {
|
|
return this.clone().iushrn(bits);
|
|
};
|
|
|
|
BN.prototype.testn = function testn (bit) {
|
|
assert(typeof bit === 'number' && bit >= 0);
|
|
var r = bit % 26;
|
|
var s = (bit - r) / 26;
|
|
var q = 1 << r;
|
|
|
|
if (this.length <= s) return false;
|
|
|
|
var w = this.words[s];
|
|
|
|
return !!(w & q);
|
|
};
|
|
|
|
BN.prototype.imaskn = function imaskn (bits) {
|
|
assert(typeof bits === 'number' && bits >= 0);
|
|
var r = bits % 26;
|
|
var s = (bits - r) / 26;
|
|
|
|
assert(this.negative === 0, 'imaskn works only with positive numbers');
|
|
|
|
if (this.length <= s) {
|
|
return this;
|
|
}
|
|
|
|
if (r !== 0) {
|
|
s++;
|
|
}
|
|
this.length = Math.min(s, this.length);
|
|
|
|
if (r !== 0) {
|
|
var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
|
|
this.words[this.length - 1] &= mask;
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.maskn = function maskn (bits) {
|
|
return this.clone().imaskn(bits);
|
|
};
|
|
|
|
BN.prototype.iaddn = function iaddn (num) {
|
|
assert(typeof num === 'number');
|
|
assert(num < 0x4000000);
|
|
if (num < 0) return this.isubn(-num);
|
|
|
|
if (this.negative !== 0) {
|
|
if (this.length === 1 && (this.words[0] | 0) < num) {
|
|
this.words[0] = num - (this.words[0] | 0);
|
|
this.negative = 0;
|
|
return this;
|
|
}
|
|
|
|
this.negative = 0;
|
|
this.isubn(num);
|
|
this.negative = 1;
|
|
return this;
|
|
}
|
|
|
|
return this._iaddn(num);
|
|
};
|
|
|
|
BN.prototype._iaddn = function _iaddn (num) {
|
|
this.words[0] += num;
|
|
|
|
for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
|
|
this.words[i] -= 0x4000000;
|
|
if (i === this.length - 1) {
|
|
this.words[i + 1] = 1;
|
|
} else {
|
|
this.words[i + 1]++;
|
|
}
|
|
}
|
|
this.length = Math.max(this.length, i + 1);
|
|
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.isubn = function isubn (num) {
|
|
assert(typeof num === 'number');
|
|
assert(num < 0x4000000);
|
|
if (num < 0) return this.iaddn(-num);
|
|
|
|
if (this.negative !== 0) {
|
|
this.negative = 0;
|
|
this.iaddn(num);
|
|
this.negative = 1;
|
|
return this;
|
|
}
|
|
|
|
this.words[0] -= num;
|
|
|
|
if (this.length === 1 && this.words[0] < 0) {
|
|
this.words[0] = -this.words[0];
|
|
this.negative = 1;
|
|
} else {
|
|
for (var i = 0; i < this.length && this.words[i] < 0; i++) {
|
|
this.words[i] += 0x4000000;
|
|
this.words[i + 1] -= 1;
|
|
}
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.addn = function addn (num) {
|
|
return this.clone().iaddn(num);
|
|
};
|
|
|
|
BN.prototype.subn = function subn (num) {
|
|
return this.clone().isubn(num);
|
|
};
|
|
|
|
BN.prototype.iabs = function iabs () {
|
|
this.negative = 0;
|
|
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.abs = function abs () {
|
|
return this.clone().iabs();
|
|
};
|
|
|
|
BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
|
|
var len = num.length + shift;
|
|
var i;
|
|
|
|
this._expand(len);
|
|
|
|
var w;
|
|
var carry = 0;
|
|
for (i = 0; i < num.length; i++) {
|
|
w = (this.words[i + shift] | 0) + carry;
|
|
var right = (num.words[i] | 0) * mul;
|
|
w -= right & 0x3ffffff;
|
|
carry = (w >> 26) - ((right / 0x4000000) | 0);
|
|
this.words[i + shift] = w & 0x3ffffff;
|
|
}
|
|
for (; i < this.length - shift; i++) {
|
|
w = (this.words[i + shift] | 0) + carry;
|
|
carry = w >> 26;
|
|
this.words[i + shift] = w & 0x3ffffff;
|
|
}
|
|
|
|
if (carry === 0) return this.strip();
|
|
|
|
assert(carry === -1);
|
|
carry = 0;
|
|
for (i = 0; i < this.length; i++) {
|
|
w = -(this.words[i] | 0) + carry;
|
|
carry = w >> 26;
|
|
this.words[i] = w & 0x3ffffff;
|
|
}
|
|
this.negative = 1;
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype._wordDiv = function _wordDiv (num, mode) {
|
|
var shift = this.length - num.length;
|
|
|
|
var a = this.clone();
|
|
var b = num;
|
|
|
|
var bhi = b.words[b.length - 1] | 0;
|
|
var bhiBits = this._countBits(bhi);
|
|
shift = 26 - bhiBits;
|
|
if (shift !== 0) {
|
|
b = b.ushln(shift);
|
|
a.iushln(shift);
|
|
bhi = b.words[b.length - 1] | 0;
|
|
}
|
|
|
|
var m = a.length - b.length;
|
|
var q;
|
|
|
|
if (mode !== 'mod') {
|
|
q = new BN(null);
|
|
q.length = m + 1;
|
|
q.words = new Array(q.length);
|
|
for (var i = 0; i < q.length; i++) {
|
|
q.words[i] = 0;
|
|
}
|
|
}
|
|
|
|
var diff = a.clone()._ishlnsubmul(b, 1, m);
|
|
if (diff.negative === 0) {
|
|
a = diff;
|
|
if (q) {
|
|
q.words[m] = 1;
|
|
}
|
|
}
|
|
|
|
for (var j = m - 1; j >= 0; j--) {
|
|
var qj = (a.words[b.length + j] | 0) * 0x4000000 +
|
|
(a.words[b.length + j - 1] | 0);
|
|
|
|
qj = Math.min((qj / bhi) | 0, 0x3ffffff);
|
|
|
|
a._ishlnsubmul(b, qj, j);
|
|
while (a.negative !== 0) {
|
|
qj--;
|
|
a.negative = 0;
|
|
a._ishlnsubmul(b, 1, j);
|
|
if (!a.isZero()) {
|
|
a.negative ^= 1;
|
|
}
|
|
}
|
|
if (q) {
|
|
q.words[j] = qj;
|
|
}
|
|
}
|
|
if (q) {
|
|
q.strip();
|
|
}
|
|
a.strip();
|
|
|
|
if (mode !== 'div' && shift !== 0) {
|
|
a.iushrn(shift);
|
|
}
|
|
|
|
return {
|
|
div: q || null,
|
|
mod: a
|
|
};
|
|
};
|
|
|
|
BN.prototype.divmod = function divmod (num, mode, positive) {
|
|
assert(!num.isZero());
|
|
|
|
if (this.isZero()) {
|
|
return {
|
|
div: new BN(0),
|
|
mod: new BN(0)
|
|
};
|
|
}
|
|
|
|
var div, mod, res;
|
|
if (this.negative !== 0 && num.negative === 0) {
|
|
res = this.neg().divmod(num, mode);
|
|
|
|
if (mode !== 'mod') {
|
|
div = res.div.neg();
|
|
}
|
|
|
|
if (mode !== 'div') {
|
|
mod = res.mod.neg();
|
|
if (positive && mod.negative !== 0) {
|
|
mod.iadd(num);
|
|
}
|
|
}
|
|
|
|
return {
|
|
div: div,
|
|
mod: mod
|
|
};
|
|
}
|
|
|
|
if (this.negative === 0 && num.negative !== 0) {
|
|
res = this.divmod(num.neg(), mode);
|
|
|
|
if (mode !== 'mod') {
|
|
div = res.div.neg();
|
|
}
|
|
|
|
return {
|
|
div: div,
|
|
mod: res.mod
|
|
};
|
|
}
|
|
|
|
if ((this.negative & num.negative) !== 0) {
|
|
res = this.neg().divmod(num.neg(), mode);
|
|
|
|
if (mode !== 'div') {
|
|
mod = res.mod.neg();
|
|
if (positive && mod.negative !== 0) {
|
|
mod.isub(num);
|
|
}
|
|
}
|
|
|
|
return {
|
|
div: res.div,
|
|
mod: mod
|
|
};
|
|
}
|
|
|
|
|
|
if (num.length > this.length || this.cmp(num) < 0) {
|
|
return {
|
|
div: new BN(0),
|
|
mod: this
|
|
};
|
|
}
|
|
|
|
if (num.length === 1) {
|
|
if (mode === 'div') {
|
|
return {
|
|
div: this.divn(num.words[0]),
|
|
mod: null
|
|
};
|
|
}
|
|
|
|
if (mode === 'mod') {
|
|
return {
|
|
div: null,
|
|
mod: new BN(this.modn(num.words[0]))
|
|
};
|
|
}
|
|
|
|
return {
|
|
div: this.divn(num.words[0]),
|
|
mod: new BN(this.modn(num.words[0]))
|
|
};
|
|
}
|
|
|
|
return this._wordDiv(num, mode);
|
|
};
|
|
|
|
BN.prototype.div = function div (num) {
|
|
return this.divmod(num, 'div', false).div;
|
|
};
|
|
|
|
BN.prototype.mod = function mod (num) {
|
|
return this.divmod(num, 'mod', false).mod;
|
|
};
|
|
|
|
BN.prototype.umod = function umod (num) {
|
|
return this.divmod(num, 'mod', true).mod;
|
|
};
|
|
|
|
BN.prototype.divRound = function divRound (num) {
|
|
var dm = this.divmod(num);
|
|
|
|
if (dm.mod.isZero()) return dm.div;
|
|
|
|
var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
|
|
|
|
var half = num.ushrn(1);
|
|
var r2 = num.andln(1);
|
|
var cmp = mod.cmp(half);
|
|
|
|
if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;
|
|
|
|
return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
|
|
};
|
|
|
|
BN.prototype.modn = function modn (num) {
|
|
assert(num <= 0x3ffffff);
|
|
var p = (1 << 26) % num;
|
|
|
|
var acc = 0;
|
|
for (var i = this.length - 1; i >= 0; i--) {
|
|
acc = (p * acc + (this.words[i] | 0)) % num;
|
|
}
|
|
|
|
return acc;
|
|
};
|
|
|
|
BN.prototype.idivn = function idivn (num) {
|
|
assert(num <= 0x3ffffff);
|
|
|
|
var carry = 0;
|
|
for (var i = this.length - 1; i >= 0; i--) {
|
|
var w = (this.words[i] | 0) + carry * 0x4000000;
|
|
this.words[i] = (w / num) | 0;
|
|
carry = w % num;
|
|
}
|
|
|
|
return this.strip();
|
|
};
|
|
|
|
BN.prototype.divn = function divn (num) {
|
|
return this.clone().idivn(num);
|
|
};
|
|
|
|
BN.prototype.egcd = function egcd (p) {
|
|
assert(p.negative === 0);
|
|
assert(!p.isZero());
|
|
|
|
var x = this;
|
|
var y = p.clone();
|
|
|
|
if (x.negative !== 0) {
|
|
x = x.umod(p);
|
|
} else {
|
|
x = x.clone();
|
|
}
|
|
|
|
var A = new BN(1);
|
|
var B = new BN(0);
|
|
|
|
var C = new BN(0);
|
|
var D = new BN(1);
|
|
|
|
var g = 0;
|
|
|
|
while (x.isEven() && y.isEven()) {
|
|
x.iushrn(1);
|
|
y.iushrn(1);
|
|
++g;
|
|
}
|
|
|
|
var yp = y.clone();
|
|
var xp = x.clone();
|
|
|
|
while (!x.isZero()) {
|
|
for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
|
|
if (i > 0) {
|
|
x.iushrn(i);
|
|
while (i-- > 0) {
|
|
if (A.isOdd() || B.isOdd()) {
|
|
A.iadd(yp);
|
|
B.isub(xp);
|
|
}
|
|
|
|
A.iushrn(1);
|
|
B.iushrn(1);
|
|
}
|
|
}
|
|
|
|
for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
|
|
if (j > 0) {
|
|
y.iushrn(j);
|
|
while (j-- > 0) {
|
|
if (C.isOdd() || D.isOdd()) {
|
|
C.iadd(yp);
|
|
D.isub(xp);
|
|
}
|
|
|
|
C.iushrn(1);
|
|
D.iushrn(1);
|
|
}
|
|
}
|
|
|
|
if (x.cmp(y) >= 0) {
|
|
x.isub(y);
|
|
A.isub(C);
|
|
B.isub(D);
|
|
} else {
|
|
y.isub(x);
|
|
C.isub(A);
|
|
D.isub(B);
|
|
}
|
|
}
|
|
|
|
return {
|
|
a: C,
|
|
b: D,
|
|
gcd: y.iushln(g)
|
|
};
|
|
};
|
|
|
|
BN.prototype._invmp = function _invmp (p) {
|
|
assert(p.negative === 0);
|
|
assert(!p.isZero());
|
|
|
|
var a = this;
|
|
var b = p.clone();
|
|
|
|
if (a.negative !== 0) {
|
|
a = a.umod(p);
|
|
} else {
|
|
a = a.clone();
|
|
}
|
|
|
|
var x1 = new BN(1);
|
|
var x2 = new BN(0);
|
|
|
|
var delta = b.clone();
|
|
|
|
while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
|
|
for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
|
|
if (i > 0) {
|
|
a.iushrn(i);
|
|
while (i-- > 0) {
|
|
if (x1.isOdd()) {
|
|
x1.iadd(delta);
|
|
}
|
|
|
|
x1.iushrn(1);
|
|
}
|
|
}
|
|
|
|
for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
|
|
if (j > 0) {
|
|
b.iushrn(j);
|
|
while (j-- > 0) {
|
|
if (x2.isOdd()) {
|
|
x2.iadd(delta);
|
|
}
|
|
|
|
x2.iushrn(1);
|
|
}
|
|
}
|
|
|
|
if (a.cmp(b) >= 0) {
|
|
a.isub(b);
|
|
x1.isub(x2);
|
|
} else {
|
|
b.isub(a);
|
|
x2.isub(x1);
|
|
}
|
|
}
|
|
|
|
var res;
|
|
if (a.cmpn(1) === 0) {
|
|
res = x1;
|
|
} else {
|
|
res = x2;
|
|
}
|
|
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(p);
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
BN.prototype.gcd = function gcd (num) {
|
|
if (this.isZero()) return num.abs();
|
|
if (num.isZero()) return this.abs();
|
|
|
|
var a = this.clone();
|
|
var b = num.clone();
|
|
a.negative = 0;
|
|
b.negative = 0;
|
|
|
|
for (var shift = 0; a.isEven() && b.isEven(); shift++) {
|
|
a.iushrn(1);
|
|
b.iushrn(1);
|
|
}
|
|
|
|
do {
|
|
while (a.isEven()) {
|
|
a.iushrn(1);
|
|
}
|
|
while (b.isEven()) {
|
|
b.iushrn(1);
|
|
}
|
|
|
|
var r = a.cmp(b);
|
|
if (r < 0) {
|
|
var t = a;
|
|
a = b;
|
|
b = t;
|
|
} else if (r === 0 || b.cmpn(1) === 0) {
|
|
break;
|
|
}
|
|
|
|
a.isub(b);
|
|
} while (true);
|
|
|
|
return b.iushln(shift);
|
|
};
|
|
|
|
BN.prototype.invm = function invm (num) {
|
|
return this.egcd(num).a.umod(num);
|
|
};
|
|
|
|
BN.prototype.isEven = function isEven () {
|
|
return (this.words[0] & 1) === 0;
|
|
};
|
|
|
|
BN.prototype.isOdd = function isOdd () {
|
|
return (this.words[0] & 1) === 1;
|
|
};
|
|
|
|
BN.prototype.andln = function andln (num) {
|
|
return this.words[0] & num;
|
|
};
|
|
|
|
BN.prototype.bincn = function bincn (bit) {
|
|
assert(typeof bit === 'number');
|
|
var r = bit % 26;
|
|
var s = (bit - r) / 26;
|
|
var q = 1 << r;
|
|
|
|
if (this.length <= s) {
|
|
this._expand(s + 1);
|
|
this.words[s] |= q;
|
|
return this;
|
|
}
|
|
|
|
var carry = q;
|
|
for (var i = s; carry !== 0 && i < this.length; i++) {
|
|
var w = this.words[i] | 0;
|
|
w += carry;
|
|
carry = w >>> 26;
|
|
w &= 0x3ffffff;
|
|
this.words[i] = w;
|
|
}
|
|
if (carry !== 0) {
|
|
this.words[i] = carry;
|
|
this.length++;
|
|
}
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.isZero = function isZero () {
|
|
return this.length === 1 && this.words[0] === 0;
|
|
};
|
|
|
|
BN.prototype.cmpn = function cmpn (num) {
|
|
var negative = num < 0;
|
|
|
|
if (this.negative !== 0 && !negative) return -1;
|
|
if (this.negative === 0 && negative) return 1;
|
|
|
|
this.strip();
|
|
|
|
var res;
|
|
if (this.length > 1) {
|
|
res = 1;
|
|
} else {
|
|
if (negative) {
|
|
num = -num;
|
|
}
|
|
|
|
assert(num <= 0x3ffffff, 'Number is too big');
|
|
|
|
var w = this.words[0] | 0;
|
|
res = w === num ? 0 : w < num ? -1 : 1;
|
|
}
|
|
if (this.negative !== 0) return -res | 0;
|
|
return res;
|
|
};
|
|
|
|
BN.prototype.cmp = function cmp (num) {
|
|
if (this.negative !== 0 && num.negative === 0) return -1;
|
|
if (this.negative === 0 && num.negative !== 0) return 1;
|
|
|
|
var res = this.ucmp(num);
|
|
if (this.negative !== 0) return -res | 0;
|
|
return res;
|
|
};
|
|
|
|
BN.prototype.ucmp = function ucmp (num) {
|
|
if (this.length > num.length) return 1;
|
|
if (this.length < num.length) return -1;
|
|
|
|
var res = 0;
|
|
for (var i = this.length - 1; i >= 0; i--) {
|
|
var a = this.words[i] | 0;
|
|
var b = num.words[i] | 0;
|
|
|
|
if (a === b) continue;
|
|
if (a < b) {
|
|
res = -1;
|
|
} else if (a > b) {
|
|
res = 1;
|
|
}
|
|
break;
|
|
}
|
|
return res;
|
|
};
|
|
|
|
BN.prototype.gtn = function gtn (num) {
|
|
return this.cmpn(num) === 1;
|
|
};
|
|
|
|
BN.prototype.gt = function gt (num) {
|
|
return this.cmp(num) === 1;
|
|
};
|
|
|
|
BN.prototype.gten = function gten (num) {
|
|
return this.cmpn(num) >= 0;
|
|
};
|
|
|
|
BN.prototype.gte = function gte (num) {
|
|
return this.cmp(num) >= 0;
|
|
};
|
|
|
|
BN.prototype.ltn = function ltn (num) {
|
|
return this.cmpn(num) === -1;
|
|
};
|
|
|
|
BN.prototype.lt = function lt (num) {
|
|
return this.cmp(num) === -1;
|
|
};
|
|
|
|
BN.prototype.lten = function lten (num) {
|
|
return this.cmpn(num) <= 0;
|
|
};
|
|
|
|
BN.prototype.lte = function lte (num) {
|
|
return this.cmp(num) <= 0;
|
|
};
|
|
|
|
BN.prototype.eqn = function eqn (num) {
|
|
return this.cmpn(num) === 0;
|
|
};
|
|
|
|
BN.prototype.eq = function eq (num) {
|
|
return this.cmp(num) === 0;
|
|
};
|
|
|
|
BN.red = function red (num) {
|
|
return new Red(num);
|
|
};
|
|
|
|
BN.prototype.toRed = function toRed (ctx) {
|
|
assert(!this.red, 'Already a number in reduction context');
|
|
assert(this.negative === 0, 'red works only with positives');
|
|
return ctx.convertTo(this)._forceRed(ctx);
|
|
};
|
|
|
|
BN.prototype.fromRed = function fromRed () {
|
|
assert(this.red, 'fromRed works only with numbers in reduction context');
|
|
return this.red.convertFrom(this);
|
|
};
|
|
|
|
BN.prototype._forceRed = function _forceRed (ctx) {
|
|
this.red = ctx;
|
|
return this;
|
|
};
|
|
|
|
BN.prototype.forceRed = function forceRed (ctx) {
|
|
assert(!this.red, 'Already a number in reduction context');
|
|
return this._forceRed(ctx);
|
|
};
|
|
|
|
BN.prototype.redAdd = function redAdd (num) {
|
|
assert(this.red, 'redAdd works only with red numbers');
|
|
return this.red.add(this, num);
|
|
};
|
|
|
|
BN.prototype.redIAdd = function redIAdd (num) {
|
|
assert(this.red, 'redIAdd works only with red numbers');
|
|
return this.red.iadd(this, num);
|
|
};
|
|
|
|
BN.prototype.redSub = function redSub (num) {
|
|
assert(this.red, 'redSub works only with red numbers');
|
|
return this.red.sub(this, num);
|
|
};
|
|
|
|
BN.prototype.redISub = function redISub (num) {
|
|
assert(this.red, 'redISub works only with red numbers');
|
|
return this.red.isub(this, num);
|
|
};
|
|
|
|
BN.prototype.redShl = function redShl (num) {
|
|
assert(this.red, 'redShl works only with red numbers');
|
|
return this.red.shl(this, num);
|
|
};
|
|
|
|
BN.prototype.redMul = function redMul (num) {
|
|
assert(this.red, 'redMul works only with red numbers');
|
|
this.red._verify2(this, num);
|
|
return this.red.mul(this, num);
|
|
};
|
|
|
|
BN.prototype.redIMul = function redIMul (num) {
|
|
assert(this.red, 'redMul works only with red numbers');
|
|
this.red._verify2(this, num);
|
|
return this.red.imul(this, num);
|
|
};
|
|
|
|
BN.prototype.redSqr = function redSqr () {
|
|
assert(this.red, 'redSqr works only with red numbers');
|
|
this.red._verify1(this);
|
|
return this.red.sqr(this);
|
|
};
|
|
|
|
BN.prototype.redISqr = function redISqr () {
|
|
assert(this.red, 'redISqr works only with red numbers');
|
|
this.red._verify1(this);
|
|
return this.red.isqr(this);
|
|
};
|
|
|
|
BN.prototype.redSqrt = function redSqrt () {
|
|
assert(this.red, 'redSqrt works only with red numbers');
|
|
this.red._verify1(this);
|
|
return this.red.sqrt(this);
|
|
};
|
|
|
|
BN.prototype.redInvm = function redInvm () {
|
|
assert(this.red, 'redInvm works only with red numbers');
|
|
this.red._verify1(this);
|
|
return this.red.invm(this);
|
|
};
|
|
|
|
BN.prototype.redNeg = function redNeg () {
|
|
assert(this.red, 'redNeg works only with red numbers');
|
|
this.red._verify1(this);
|
|
return this.red.neg(this);
|
|
};
|
|
|
|
BN.prototype.redPow = function redPow (num) {
|
|
assert(this.red && !num.red, 'redPow(normalNum)');
|
|
this.red._verify1(this);
|
|
return this.red.pow(this, num);
|
|
};
|
|
|
|
var primes = {
|
|
k256: null,
|
|
p224: null,
|
|
p192: null,
|
|
p25519: null
|
|
};
|
|
|
|
function MPrime (name, p) {
|
|
this.name = name;
|
|
this.p = new BN(p, 16);
|
|
this.n = this.p.bitLength();
|
|
this.k = new BN(1).iushln(this.n).isub(this.p);
|
|
|
|
this.tmp = this._tmp();
|
|
}
|
|
|
|
MPrime.prototype._tmp = function _tmp () {
|
|
var tmp = new BN(null);
|
|
tmp.words = new Array(Math.ceil(this.n / 13));
|
|
return tmp;
|
|
};
|
|
|
|
MPrime.prototype.ireduce = function ireduce (num) {
|
|
var r = num;
|
|
var rlen;
|
|
|
|
do {
|
|
this.split(r, this.tmp);
|
|
r = this.imulK(r);
|
|
r = r.iadd(this.tmp);
|
|
rlen = r.bitLength();
|
|
} while (rlen > this.n);
|
|
|
|
var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
|
|
if (cmp === 0) {
|
|
r.words[0] = 0;
|
|
r.length = 1;
|
|
} else if (cmp > 0) {
|
|
r.isub(this.p);
|
|
} else {
|
|
r.strip();
|
|
}
|
|
|
|
return r;
|
|
};
|
|
|
|
MPrime.prototype.split = function split (input, out) {
|
|
input.iushrn(this.n, 0, out);
|
|
};
|
|
|
|
MPrime.prototype.imulK = function imulK (num) {
|
|
return num.imul(this.k);
|
|
};
|
|
|
|
function K256 () {
|
|
MPrime.call(
|
|
this,
|
|
'k256',
|
|
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
|
|
}
|
|
inherits(K256, MPrime);
|
|
|
|
K256.prototype.split = function split (input, output) {
|
|
var mask = 0x3fffff;
|
|
|
|
var outLen = Math.min(input.length, 9);
|
|
for (var i = 0; i < outLen; i++) {
|
|
output.words[i] = input.words[i];
|
|
}
|
|
output.length = outLen;
|
|
|
|
if (input.length <= 9) {
|
|
input.words[0] = 0;
|
|
input.length = 1;
|
|
return;
|
|
}
|
|
|
|
var prev = input.words[9];
|
|
output.words[output.length++] = prev & mask;
|
|
|
|
for (i = 10; i < input.length; i++) {
|
|
var next = input.words[i] | 0;
|
|
input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
|
|
prev = next;
|
|
}
|
|
prev >>>= 22;
|
|
input.words[i - 10] = prev;
|
|
if (prev === 0 && input.length > 10) {
|
|
input.length -= 10;
|
|
} else {
|
|
input.length -= 9;
|
|
}
|
|
};
|
|
|
|
K256.prototype.imulK = function imulK (num) {
|
|
num.words[num.length] = 0;
|
|
num.words[num.length + 1] = 0;
|
|
num.length += 2;
|
|
|
|
var lo = 0;
|
|
for (var i = 0; i < num.length; i++) {
|
|
var w = num.words[i] | 0;
|
|
lo += w * 0x3d1;
|
|
num.words[i] = lo & 0x3ffffff;
|
|
lo = w * 0x40 + ((lo / 0x4000000) | 0);
|
|
}
|
|
|
|
if (num.words[num.length - 1] === 0) {
|
|
num.length--;
|
|
if (num.words[num.length - 1] === 0) {
|
|
num.length--;
|
|
}
|
|
}
|
|
return num;
|
|
};
|
|
|
|
function P224 () {
|
|
MPrime.call(
|
|
this,
|
|
'p224',
|
|
'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
|
|
}
|
|
inherits(P224, MPrime);
|
|
|
|
function P192 () {
|
|
MPrime.call(
|
|
this,
|
|
'p192',
|
|
'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
|
|
}
|
|
inherits(P192, MPrime);
|
|
|
|
function P25519 () {
|
|
MPrime.call(
|
|
this,
|
|
'25519',
|
|
'7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
|
|
}
|
|
inherits(P25519, MPrime);
|
|
|
|
P25519.prototype.imulK = function imulK (num) {
|
|
var carry = 0;
|
|
for (var i = 0; i < num.length; i++) {
|
|
var hi = (num.words[i] | 0) * 0x13 + carry;
|
|
var lo = hi & 0x3ffffff;
|
|
hi >>>= 26;
|
|
|
|
num.words[i] = lo;
|
|
carry = hi;
|
|
}
|
|
if (carry !== 0) {
|
|
num.words[num.length++] = carry;
|
|
}
|
|
return num;
|
|
};
|
|
|
|
BN._prime = function prime (name) {
|
|
if (primes[name]) return primes[name];
|
|
|
|
var prime;
|
|
if (name === 'k256') {
|
|
prime = new K256();
|
|
} else if (name === 'p224') {
|
|
prime = new P224();
|
|
} else if (name === 'p192') {
|
|
prime = new P192();
|
|
} else if (name === 'p25519') {
|
|
prime = new P25519();
|
|
} else {
|
|
throw new Error('Unknown prime ' + name);
|
|
}
|
|
primes[name] = prime;
|
|
|
|
return prime;
|
|
};
|
|
|
|
function Red (m) {
|
|
if (typeof m === 'string') {
|
|
var prime = BN._prime(m);
|
|
this.m = prime.p;
|
|
this.prime = prime;
|
|
} else {
|
|
assert(m.gtn(1), 'modulus must be greater than 1');
|
|
this.m = m;
|
|
this.prime = null;
|
|
}
|
|
}
|
|
|
|
Red.prototype._verify1 = function _verify1 (a) {
|
|
assert(a.negative === 0, 'red works only with positives');
|
|
assert(a.red, 'red works only with red numbers');
|
|
};
|
|
|
|
Red.prototype._verify2 = function _verify2 (a, b) {
|
|
assert((a.negative | b.negative) === 0, 'red works only with positives');
|
|
assert(a.red && a.red === b.red,
|
|
'red works only with red numbers');
|
|
};
|
|
|
|
Red.prototype.imod = function imod (a) {
|
|
if (this.prime) return this.prime.ireduce(a)._forceRed(this);
|
|
return a.umod(this.m)._forceRed(this);
|
|
};
|
|
|
|
Red.prototype.neg = function neg (a) {
|
|
if (a.isZero()) {
|
|
return a.clone();
|
|
}
|
|
|
|
return this.m.sub(a)._forceRed(this);
|
|
};
|
|
|
|
Red.prototype.add = function add (a, b) {
|
|
this._verify2(a, b);
|
|
|
|
var res = a.add(b);
|
|
if (res.cmp(this.m) >= 0) {
|
|
res.isub(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
|
|
Red.prototype.iadd = function iadd (a, b) {
|
|
this._verify2(a, b);
|
|
|
|
var res = a.iadd(b);
|
|
if (res.cmp(this.m) >= 0) {
|
|
res.isub(this.m);
|
|
}
|
|
return res;
|
|
};
|
|
|
|
Red.prototype.sub = function sub (a, b) {
|
|
this._verify2(a, b);
|
|
|
|
var res = a.sub(b);
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(this.m);
|
|
}
|
|
return res._forceRed(this);
|
|
};
|
|
|
|
Red.prototype.isub = function isub (a, b) {
|
|
this._verify2(a, b);
|
|
|
|
var res = a.isub(b);
|
|
if (res.cmpn(0) < 0) {
|
|
res.iadd(this.m);
|
|
}
|
|
return res;
|
|
};
|
|
|
|
Red.prototype.shl = function shl (a, num) {
|
|
this._verify1(a);
|
|
return this.imod(a.ushln(num));
|
|
};
|
|
|
|
Red.prototype.imul = function imul (a, b) {
|
|
this._verify2(a, b);
|
|
return this.imod(a.imul(b));
|
|
};
|
|
|
|
Red.prototype.mul = function mul (a, b) {
|
|
this._verify2(a, b);
|
|
return this.imod(a.mul(b));
|
|
};
|
|
|
|
Red.prototype.isqr = function isqr (a) {
|
|
return this.imul(a, a.clone());
|
|
};
|
|
|
|
Red.prototype.sqr = function sqr (a) {
|
|
return this.mul(a, a);
|
|
};
|
|
|
|
Red.prototype.sqrt = function sqrt (a) {
|
|
if (a.isZero()) return a.clone();
|
|
|
|
var mod3 = this.m.andln(3);
|
|
assert(mod3 % 2 === 1);
|
|
|
|
if (mod3 === 3) {
|
|
var pow = this.m.add(new BN(1)).iushrn(2);
|
|
return this.pow(a, pow);
|
|
}
|
|
|
|
var q = this.m.subn(1);
|
|
var s = 0;
|
|
while (!q.isZero() && q.andln(1) === 0) {
|
|
s++;
|
|
q.iushrn(1);
|
|
}
|
|
assert(!q.isZero());
|
|
|
|
var one = new BN(1).toRed(this);
|
|
var nOne = one.redNeg();
|
|
|
|
var lpow = this.m.subn(1).iushrn(1);
|
|
var z = this.m.bitLength();
|
|
z = new BN(2 * z * z).toRed(this);
|
|
|
|
while (this.pow(z, lpow).cmp(nOne) !== 0) {
|
|
z.redIAdd(nOne);
|
|
}
|
|
|
|
var c = this.pow(z, q);
|
|
var r = this.pow(a, q.addn(1).iushrn(1));
|
|
var t = this.pow(a, q);
|
|
var m = s;
|
|
while (t.cmp(one) !== 0) {
|
|
var tmp = t;
|
|
for (var i = 0; tmp.cmp(one) !== 0; i++) {
|
|
tmp = tmp.redSqr();
|
|
}
|
|
assert(i < m);
|
|
var b = this.pow(c, new BN(1).iushln(m - i - 1));
|
|
|
|
r = r.redMul(b);
|
|
c = b.redSqr();
|
|
t = t.redMul(c);
|
|
m = i;
|
|
}
|
|
|
|
return r;
|
|
};
|
|
|
|
Red.prototype.invm = function invm (a) {
|
|
var inv = a._invmp(this.m);
|
|
if (inv.negative !== 0) {
|
|
inv.negative = 0;
|
|
return this.imod(inv).redNeg();
|
|
} else {
|
|
return this.imod(inv);
|
|
}
|
|
};
|
|
|
|
Red.prototype.pow = function pow (a, num) {
|
|
if (num.isZero()) return new BN(1).toRed(this);
|
|
if (num.cmpn(1) === 0) return a.clone();
|
|
|
|
var windowSize = 4;
|
|
var wnd = new Array(1 << windowSize);
|
|
wnd[0] = new BN(1).toRed(this);
|
|
wnd[1] = a;
|
|
for (var i = 2; i < wnd.length; i++) {
|
|
wnd[i] = this.mul(wnd[i - 1], a);
|
|
}
|
|
|
|
var res = wnd[0];
|
|
var current = 0;
|
|
var currentLen = 0;
|
|
var start = num.bitLength() % 26;
|
|
if (start === 0) {
|
|
start = 26;
|
|
}
|
|
|
|
for (i = num.length - 1; i >= 0; i--) {
|
|
var word = num.words[i];
|
|
for (var j = start - 1; j >= 0; j--) {
|
|
var bit = (word >> j) & 1;
|
|
if (res !== wnd[0]) {
|
|
res = this.sqr(res);
|
|
}
|
|
|
|
if (bit === 0 && current === 0) {
|
|
currentLen = 0;
|
|
continue;
|
|
}
|
|
|
|
current <<= 1;
|
|
current |= bit;
|
|
currentLen++;
|
|
if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
|
|
|
|
res = this.mul(res, wnd[current]);
|
|
currentLen = 0;
|
|
current = 0;
|
|
}
|
|
start = 26;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
Red.prototype.convertTo = function convertTo (num) {
|
|
var r = num.umod(this.m);
|
|
|
|
return r === num ? r.clone() : r;
|
|
};
|
|
|
|
Red.prototype.convertFrom = function convertFrom (num) {
|
|
var res = num.clone();
|
|
res.red = null;
|
|
return res;
|
|
};
|
|
|
|
|
|
BN.mont = function mont (num) {
|
|
return new Mont(num);
|
|
};
|
|
|
|
function Mont (m) {
|
|
Red.call(this, m);
|
|
|
|
this.shift = this.m.bitLength();
|
|
if (this.shift % 26 !== 0) {
|
|
this.shift += 26 - (this.shift % 26);
|
|
}
|
|
|
|
this.r = new BN(1).iushln(this.shift);
|
|
this.r2 = this.imod(this.r.sqr());
|
|
this.rinv = this.r._invmp(this.m);
|
|
|
|
this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
|
|
this.minv = this.minv.umod(this.r);
|
|
this.minv = this.r.sub(this.minv);
|
|
}
|
|
inherits(Mont, Red);
|
|
|
|
Mont.prototype.convertTo = function convertTo (num) {
|
|
return this.imod(num.ushln(this.shift));
|
|
};
|
|
|
|
Mont.prototype.convertFrom = function convertFrom (num) {
|
|
var r = this.imod(num.mul(this.rinv));
|
|
r.red = null;
|
|
return r;
|
|
};
|
|
|
|
Mont.prototype.imul = function imul (a, b) {
|
|
if (a.isZero() || b.isZero()) {
|
|
a.words[0] = 0;
|
|
a.length = 1;
|
|
return a;
|
|
}
|
|
|
|
var t = a.imul(b);
|
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
var u = t.isub(c).iushrn(this.shift);
|
|
var res = u;
|
|
|
|
if (u.cmp(this.m) >= 0) {
|
|
res = u.isub(this.m);
|
|
} else if (u.cmpn(0) < 0) {
|
|
res = u.iadd(this.m);
|
|
}
|
|
|
|
return res._forceRed(this);
|
|
};
|
|
|
|
Mont.prototype.mul = function mul (a, b) {
|
|
if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
|
|
|
|
var t = a.mul(b);
|
|
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
var u = t.isub(c).iushrn(this.shift);
|
|
var res = u;
|
|
if (u.cmp(this.m) >= 0) {
|
|
res = u.isub(this.m);
|
|
} else if (u.cmpn(0) < 0) {
|
|
res = u.iadd(this.m);
|
|
}
|
|
|
|
return res._forceRed(this);
|
|
};
|
|
|
|
Mont.prototype.invm = function invm (a) {
|
|
var res = this.imod(a._invmp(this.m).mul(this.r2));
|
|
return res._forceRed(this);
|
|
};
|
|
})(typeof module === 'undefined' || module, this);
|
|
|
|
},{"buffer":100}],99:[function(require,module,exports){
|
|
var r;
|
|
|
|
module.exports = function rand(len) {
|
|
if (!r)
|
|
r = new Rand(null);
|
|
|
|
return r.generate(len);
|
|
};
|
|
|
|
function Rand(rand) {
|
|
this.rand = rand;
|
|
}
|
|
module.exports.Rand = Rand;
|
|
|
|
Rand.prototype.generate = function generate(len) {
|
|
return this._rand(len);
|
|
};
|
|
|
|
Rand.prototype._rand = function _rand(n) {
|
|
if (this.rand.getBytes)
|
|
return this.rand.getBytes(n);
|
|
|
|
var res = new Uint8Array(n);
|
|
for (var i = 0; i < res.length; i++)
|
|
res[i] = this.rand.getByte();
|
|
return res;
|
|
};
|
|
|
|
if (typeof self === 'object') {
|
|
if (self.crypto && self.crypto.getRandomValues) {
|
|
Rand.prototype._rand = function _rand(n) {
|
|
var arr = new Uint8Array(n);
|
|
self.crypto.getRandomValues(arr);
|
|
return arr;
|
|
};
|
|
} else if (self.msCrypto && self.msCrypto.getRandomValues) {
|
|
Rand.prototype._rand = function _rand(n) {
|
|
var arr = new Uint8Array(n);
|
|
self.msCrypto.getRandomValues(arr);
|
|
return arr;
|
|
};
|
|
|
|
} else if (typeof window === 'object') {
|
|
Rand.prototype._rand = function() {
|
|
throw new Error('Not implemented yet');
|
|
};
|
|
}
|
|
} else {
|
|
try {
|
|
var crypto = require('crypto');
|
|
if (typeof crypto.randomBytes !== 'function')
|
|
throw new Error('Not supported');
|
|
|
|
Rand.prototype._rand = function _rand(n) {
|
|
return crypto.randomBytes(n);
|
|
};
|
|
} catch (e) {
|
|
}
|
|
}
|
|
|
|
},{"crypto":100}],100:[function(require,module,exports){
|
|
|
|
},{}],101:[function(require,module,exports){
|
|
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
function asUInt32Array (buf) {
|
|
if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)
|
|
|
|
var len = (buf.length / 4) | 0
|
|
var out = new Array(len)
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
out[i] = buf.readUInt32BE(i * 4)
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
function scrubVec (v) {
|
|
for (var i = 0; i < v.length; v++) {
|
|
v[i] = 0
|
|
}
|
|
}
|
|
|
|
function cryptBlock (M, keySchedule, SUB_MIX, SBOX, nRounds) {
|
|
var SUB_MIX0 = SUB_MIX[0]
|
|
var SUB_MIX1 = SUB_MIX[1]
|
|
var SUB_MIX2 = SUB_MIX[2]
|
|
var SUB_MIX3 = SUB_MIX[3]
|
|
|
|
var s0 = M[0] ^ keySchedule[0]
|
|
var s1 = M[1] ^ keySchedule[1]
|
|
var s2 = M[2] ^ keySchedule[2]
|
|
var s3 = M[3] ^ keySchedule[3]
|
|
var t0, t1, t2, t3
|
|
var ksRow = 4
|
|
|
|
for (var round = 1; round < nRounds; round++) {
|
|
t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[(s1 >>> 16) & 0xff] ^ SUB_MIX2[(s2 >>> 8) & 0xff] ^ SUB_MIX3[s3 & 0xff] ^ keySchedule[ksRow++]
|
|
t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[(s2 >>> 16) & 0xff] ^ SUB_MIX2[(s3 >>> 8) & 0xff] ^ SUB_MIX3[s0 & 0xff] ^ keySchedule[ksRow++]
|
|
t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[(s3 >>> 16) & 0xff] ^ SUB_MIX2[(s0 >>> 8) & 0xff] ^ SUB_MIX3[s1 & 0xff] ^ keySchedule[ksRow++]
|
|
t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[(s0 >>> 16) & 0xff] ^ SUB_MIX2[(s1 >>> 8) & 0xff] ^ SUB_MIX3[s2 & 0xff] ^ keySchedule[ksRow++]
|
|
s0 = t0
|
|
s1 = t1
|
|
s2 = t2
|
|
s3 = t3
|
|
}
|
|
|
|
t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]
|
|
t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]
|
|
t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]
|
|
t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]
|
|
t0 = t0 >>> 0
|
|
t1 = t1 >>> 0
|
|
t2 = t2 >>> 0
|
|
t3 = t3 >>> 0
|
|
|
|
return [t0, t1, t2, t3]
|
|
}
|
|
|
|
var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]
|
|
var G = (function () {
|
|
var d = new Array(256)
|
|
for (var j = 0; j < 256; j++) {
|
|
if (j < 128) {
|
|
d[j] = j << 1
|
|
} else {
|
|
d[j] = (j << 1) ^ 0x11b
|
|
}
|
|
}
|
|
|
|
var SBOX = []
|
|
var INV_SBOX = []
|
|
var SUB_MIX = [[], [], [], []]
|
|
var INV_SUB_MIX = [[], [], [], []]
|
|
|
|
var x = 0
|
|
var xi = 0
|
|
for (var i = 0; i < 256; ++i) {
|
|
var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4)
|
|
sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63
|
|
SBOX[x] = sx
|
|
INV_SBOX[sx] = x
|
|
|
|
var x2 = d[x]
|
|
var x4 = d[x2]
|
|
var x8 = d[x4]
|
|
|
|
var t = (d[sx] * 0x101) ^ (sx * 0x1010100)
|
|
SUB_MIX[0][x] = (t << 24) | (t >>> 8)
|
|
SUB_MIX[1][x] = (t << 16) | (t >>> 16)
|
|
SUB_MIX[2][x] = (t << 8) | (t >>> 24)
|
|
SUB_MIX[3][x] = t
|
|
|
|
t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100)
|
|
INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8)
|
|
INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16)
|
|
INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24)
|
|
INV_SUB_MIX[3][sx] = t
|
|
|
|
if (x === 0) {
|
|
x = xi = 1
|
|
} else {
|
|
x = x2 ^ d[d[d[x8 ^ x2]]]
|
|
xi ^= d[d[xi]]
|
|
}
|
|
}
|
|
|
|
return {
|
|
SBOX: SBOX,
|
|
INV_SBOX: INV_SBOX,
|
|
SUB_MIX: SUB_MIX,
|
|
INV_SUB_MIX: INV_SUB_MIX
|
|
}
|
|
})()
|
|
|
|
function AES (key) {
|
|
this._key = asUInt32Array(key)
|
|
this._reset()
|
|
}
|
|
|
|
AES.blockSize = 4 * 4
|
|
AES.keySize = 256 / 8
|
|
AES.prototype.blockSize = AES.blockSize
|
|
AES.prototype.keySize = AES.keySize
|
|
AES.prototype._reset = function () {
|
|
var keyWords = this._key
|
|
var keySize = keyWords.length
|
|
var nRounds = keySize + 6
|
|
var ksRows = (nRounds + 1) * 4
|
|
|
|
var keySchedule = []
|
|
for (var k = 0; k < keySize; k++) {
|
|
keySchedule[k] = keyWords[k]
|
|
}
|
|
|
|
for (k = keySize; k < ksRows; k++) {
|
|
var t = keySchedule[k - 1]
|
|
|
|
if (k % keySize === 0) {
|
|
t = (t << 8) | (t >>> 24)
|
|
t =
|
|
(G.SBOX[t >>> 24] << 24) |
|
|
(G.SBOX[(t >>> 16) & 0xff] << 16) |
|
|
(G.SBOX[(t >>> 8) & 0xff] << 8) |
|
|
(G.SBOX[t & 0xff])
|
|
|
|
t ^= RCON[(k / keySize) | 0] << 24
|
|
} else if (keySize > 6 && k % keySize === 4) {
|
|
t =
|
|
(G.SBOX[t >>> 24] << 24) |
|
|
(G.SBOX[(t >>> 16) & 0xff] << 16) |
|
|
(G.SBOX[(t >>> 8) & 0xff] << 8) |
|
|
(G.SBOX[t & 0xff])
|
|
}
|
|
|
|
keySchedule[k] = keySchedule[k - keySize] ^ t
|
|
}
|
|
|
|
var invKeySchedule = []
|
|
for (var ik = 0; ik < ksRows; ik++) {
|
|
var ksR = ksRows - ik
|
|
var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)]
|
|
|
|
if (ik < 4 || ksR <= 4) {
|
|
invKeySchedule[ik] = tt
|
|
} else {
|
|
invKeySchedule[ik] =
|
|
G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^
|
|
G.INV_SUB_MIX[1][G.SBOX[(tt >>> 16) & 0xff]] ^
|
|
G.INV_SUB_MIX[2][G.SBOX[(tt >>> 8) & 0xff]] ^
|
|
G.INV_SUB_MIX[3][G.SBOX[tt & 0xff]]
|
|
}
|
|
}
|
|
|
|
this._nRounds = nRounds
|
|
this._keySchedule = keySchedule
|
|
this._invKeySchedule = invKeySchedule
|
|
}
|
|
|
|
AES.prototype.encryptBlockRaw = function (M) {
|
|
M = asUInt32Array(M)
|
|
return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds)
|
|
}
|
|
|
|
AES.prototype.encryptBlock = function (M) {
|
|
var out = this.encryptBlockRaw(M)
|
|
var buf = Buffer.allocUnsafe(16)
|
|
buf.writeUInt32BE(out[0], 0)
|
|
buf.writeUInt32BE(out[1], 4)
|
|
buf.writeUInt32BE(out[2], 8)
|
|
buf.writeUInt32BE(out[3], 12)
|
|
return buf
|
|
}
|
|
|
|
AES.prototype.decryptBlock = function (M) {
|
|
M = asUInt32Array(M)
|
|
|
|
var m1 = M[1]
|
|
M[1] = M[3]
|
|
M[3] = m1
|
|
|
|
var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds)
|
|
var buf = Buffer.allocUnsafe(16)
|
|
buf.writeUInt32BE(out[0], 0)
|
|
buf.writeUInt32BE(out[3], 4)
|
|
buf.writeUInt32BE(out[2], 8)
|
|
buf.writeUInt32BE(out[1], 12)
|
|
return buf
|
|
}
|
|
|
|
AES.prototype.scrub = function () {
|
|
scrubVec(this._keySchedule)
|
|
scrubVec(this._invKeySchedule)
|
|
scrubVec(this._key)
|
|
}
|
|
|
|
module.exports.AES = AES
|
|
|
|
},{"safe-buffer":305}],102:[function(require,module,exports){
|
|
var aes = require('./aes')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var Transform = require('cipher-base')
|
|
var inherits = require('inherits')
|
|
var GHASH = require('./ghash')
|
|
var xor = require('buffer-xor')
|
|
var incr32 = require('./incr32')
|
|
|
|
function xorTest (a, b) {
|
|
var out = 0
|
|
if (a.length !== b.length) out++
|
|
|
|
var len = Math.min(a.length, b.length)
|
|
for (var i = 0; i < len; ++i) {
|
|
out += (a[i] ^ b[i])
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
function calcIv (self, iv, ck) {
|
|
if (iv.length === 12) {
|
|
self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])])
|
|
return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])])
|
|
}
|
|
var ghash = new GHASH(ck)
|
|
var len = iv.length
|
|
var toPad = len % 16
|
|
ghash.update(iv)
|
|
if (toPad) {
|
|
toPad = 16 - toPad
|
|
ghash.update(Buffer.alloc(toPad, 0))
|
|
}
|
|
ghash.update(Buffer.alloc(8, 0))
|
|
var ivBits = len * 8
|
|
var tail = Buffer.alloc(8)
|
|
tail.writeUIntBE(ivBits, 0, 8)
|
|
ghash.update(tail)
|
|
self._finID = ghash.state
|
|
var out = Buffer.from(self._finID)
|
|
incr32(out)
|
|
return out
|
|
}
|
|
function StreamCipher (mode, key, iv, decrypt) {
|
|
Transform.call(this)
|
|
|
|
var h = Buffer.alloc(4, 0)
|
|
|
|
this._cipher = new aes.AES(key)
|
|
var ck = this._cipher.encryptBlock(h)
|
|
this._ghash = new GHASH(ck)
|
|
iv = calcIv(this, iv, ck)
|
|
|
|
this._prev = Buffer.from(iv)
|
|
this._cache = Buffer.allocUnsafe(0)
|
|
this._secCache = Buffer.allocUnsafe(0)
|
|
this._decrypt = decrypt
|
|
this._alen = 0
|
|
this._len = 0
|
|
this._mode = mode
|
|
|
|
this._authTag = null
|
|
this._called = false
|
|
}
|
|
|
|
inherits(StreamCipher, Transform)
|
|
|
|
StreamCipher.prototype._update = function (chunk) {
|
|
if (!this._called && this._alen) {
|
|
var rump = 16 - (this._alen % 16)
|
|
if (rump < 16) {
|
|
rump = Buffer.alloc(rump, 0)
|
|
this._ghash.update(rump)
|
|
}
|
|
}
|
|
|
|
this._called = true
|
|
var out = this._mode.encrypt(this, chunk)
|
|
if (this._decrypt) {
|
|
this._ghash.update(chunk)
|
|
} else {
|
|
this._ghash.update(out)
|
|
}
|
|
this._len += chunk.length
|
|
return out
|
|
}
|
|
|
|
StreamCipher.prototype._final = function () {
|
|
if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data')
|
|
|
|
var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID))
|
|
if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data')
|
|
|
|
this._authTag = tag
|
|
this._cipher.scrub()
|
|
}
|
|
|
|
StreamCipher.prototype.getAuthTag = function getAuthTag () {
|
|
if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state')
|
|
|
|
return this._authTag
|
|
}
|
|
|
|
StreamCipher.prototype.setAuthTag = function setAuthTag (tag) {
|
|
if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state')
|
|
|
|
this._authTag = tag
|
|
}
|
|
|
|
StreamCipher.prototype.setAAD = function setAAD (buf) {
|
|
if (this._called) throw new Error('Attempting to set AAD in unsupported state')
|
|
|
|
this._ghash.update(buf)
|
|
this._alen += buf.length
|
|
}
|
|
|
|
module.exports = StreamCipher
|
|
|
|
},{"./aes":101,"./ghash":106,"./incr32":107,"buffer-xor":129,"cipher-base":131,"inherits":190,"safe-buffer":305}],103:[function(require,module,exports){
|
|
var ciphers = require('./encrypter')
|
|
var deciphers = require('./decrypter')
|
|
var modes = require('./modes/list.json')
|
|
|
|
function getCiphers () {
|
|
return Object.keys(modes)
|
|
}
|
|
|
|
exports.createCipher = exports.Cipher = ciphers.createCipher
|
|
exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv
|
|
exports.createDecipher = exports.Decipher = deciphers.createDecipher
|
|
exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv
|
|
exports.listCiphers = exports.getCiphers = getCiphers
|
|
|
|
},{"./decrypter":104,"./encrypter":105,"./modes/list.json":115}],104:[function(require,module,exports){
|
|
var AuthCipher = require('./authCipher')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var MODES = require('./modes')
|
|
var StreamCipher = require('./streamCipher')
|
|
var Transform = require('cipher-base')
|
|
var aes = require('./aes')
|
|
var ebtk = require('evp_bytestokey')
|
|
var inherits = require('inherits')
|
|
|
|
function Decipher (mode, key, iv) {
|
|
Transform.call(this)
|
|
|
|
this._cache = new Splitter()
|
|
this._last = void 0
|
|
this._cipher = new aes.AES(key)
|
|
this._prev = Buffer.from(iv)
|
|
this._mode = mode
|
|
this._autopadding = true
|
|
}
|
|
|
|
inherits(Decipher, Transform)
|
|
|
|
Decipher.prototype._update = function (data) {
|
|
this._cache.add(data)
|
|
var chunk
|
|
var thing
|
|
var out = []
|
|
while ((chunk = this._cache.get(this._autopadding))) {
|
|
thing = this._mode.decrypt(this, chunk)
|
|
out.push(thing)
|
|
}
|
|
return Buffer.concat(out)
|
|
}
|
|
|
|
Decipher.prototype._final = function () {
|
|
var chunk = this._cache.flush()
|
|
if (this._autopadding) {
|
|
return unpad(this._mode.decrypt(this, chunk))
|
|
} else if (chunk) {
|
|
throw new Error('data not multiple of block length')
|
|
}
|
|
}
|
|
|
|
Decipher.prototype.setAutoPadding = function (setTo) {
|
|
this._autopadding = !!setTo
|
|
return this
|
|
}
|
|
|
|
function Splitter () {
|
|
this.cache = Buffer.allocUnsafe(0)
|
|
}
|
|
|
|
Splitter.prototype.add = function (data) {
|
|
this.cache = Buffer.concat([this.cache, data])
|
|
}
|
|
|
|
Splitter.prototype.get = function (autoPadding) {
|
|
var out
|
|
if (autoPadding) {
|
|
if (this.cache.length > 16) {
|
|
out = this.cache.slice(0, 16)
|
|
this.cache = this.cache.slice(16)
|
|
return out
|
|
}
|
|
} else {
|
|
if (this.cache.length >= 16) {
|
|
out = this.cache.slice(0, 16)
|
|
this.cache = this.cache.slice(16)
|
|
return out
|
|
}
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
Splitter.prototype.flush = function () {
|
|
if (this.cache.length) return this.cache
|
|
}
|
|
|
|
function unpad (last) {
|
|
var padded = last[15]
|
|
var i = -1
|
|
while (++i < padded) {
|
|
if (last[(i + (16 - padded))] !== padded) {
|
|
throw new Error('unable to decrypt data')
|
|
}
|
|
}
|
|
if (padded === 16) return
|
|
|
|
return last.slice(0, 16 - padded)
|
|
}
|
|
|
|
function createDecipheriv (suite, password, iv) {
|
|
var config = MODES[suite.toLowerCase()]
|
|
if (!config) throw new TypeError('invalid suite type')
|
|
|
|
if (typeof iv === 'string') iv = Buffer.from(iv)
|
|
if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length)
|
|
|
|
if (typeof password === 'string') password = Buffer.from(password)
|
|
if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length)
|
|
|
|
if (config.type === 'stream') {
|
|
return new StreamCipher(config.module, password, iv, true)
|
|
} else if (config.type === 'auth') {
|
|
return new AuthCipher(config.module, password, iv, true)
|
|
}
|
|
|
|
return new Decipher(config.module, password, iv)
|
|
}
|
|
|
|
function createDecipher (suite, password) {
|
|
var config = MODES[suite.toLowerCase()]
|
|
if (!config) throw new TypeError('invalid suite type')
|
|
|
|
var keys = ebtk(password, false, config.key, config.iv)
|
|
return createDecipheriv(suite, keys.key, keys.iv)
|
|
}
|
|
|
|
exports.createDecipher = createDecipher
|
|
exports.createDecipheriv = createDecipheriv
|
|
|
|
},{"./aes":101,"./authCipher":102,"./modes":114,"./streamCipher":117,"cipher-base":131,"evp_bytestokey":173,"inherits":190,"safe-buffer":305}],105:[function(require,module,exports){
|
|
var MODES = require('./modes')
|
|
var AuthCipher = require('./authCipher')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var StreamCipher = require('./streamCipher')
|
|
var Transform = require('cipher-base')
|
|
var aes = require('./aes')
|
|
var ebtk = require('evp_bytestokey')
|
|
var inherits = require('inherits')
|
|
|
|
function Cipher (mode, key, iv) {
|
|
Transform.call(this)
|
|
|
|
this._cache = new Splitter()
|
|
this._cipher = new aes.AES(key)
|
|
this._prev = Buffer.from(iv)
|
|
this._mode = mode
|
|
this._autopadding = true
|
|
}
|
|
|
|
inherits(Cipher, Transform)
|
|
|
|
Cipher.prototype._update = function (data) {
|
|
this._cache.add(data)
|
|
var chunk
|
|
var thing
|
|
var out = []
|
|
|
|
while ((chunk = this._cache.get())) {
|
|
thing = this._mode.encrypt(this, chunk)
|
|
out.push(thing)
|
|
}
|
|
|
|
return Buffer.concat(out)
|
|
}
|
|
|
|
var PADDING = Buffer.alloc(16, 0x10)
|
|
|
|
Cipher.prototype._final = function () {
|
|
var chunk = this._cache.flush()
|
|
if (this._autopadding) {
|
|
chunk = this._mode.encrypt(this, chunk)
|
|
this._cipher.scrub()
|
|
return chunk
|
|
}
|
|
|
|
if (!chunk.equals(PADDING)) {
|
|
this._cipher.scrub()
|
|
throw new Error('data not multiple of block length')
|
|
}
|
|
}
|
|
|
|
Cipher.prototype.setAutoPadding = function (setTo) {
|
|
this._autopadding = !!setTo
|
|
return this
|
|
}
|
|
|
|
function Splitter () {
|
|
this.cache = Buffer.allocUnsafe(0)
|
|
}
|
|
|
|
Splitter.prototype.add = function (data) {
|
|
this.cache = Buffer.concat([this.cache, data])
|
|
}
|
|
|
|
Splitter.prototype.get = function () {
|
|
if (this.cache.length > 15) {
|
|
var out = this.cache.slice(0, 16)
|
|
this.cache = this.cache.slice(16)
|
|
return out
|
|
}
|
|
return null
|
|
}
|
|
|
|
Splitter.prototype.flush = function () {
|
|
var len = 16 - this.cache.length
|
|
var padBuff = Buffer.allocUnsafe(len)
|
|
|
|
var i = -1
|
|
while (++i < len) {
|
|
padBuff.writeUInt8(len, i)
|
|
}
|
|
|
|
return Buffer.concat([this.cache, padBuff])
|
|
}
|
|
|
|
function createCipheriv (suite, password, iv) {
|
|
var config = MODES[suite.toLowerCase()]
|
|
if (!config) throw new TypeError('invalid suite type')
|
|
|
|
if (typeof password === 'string') password = Buffer.from(password)
|
|
if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length)
|
|
|
|
if (typeof iv === 'string') iv = Buffer.from(iv)
|
|
if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length)
|
|
|
|
if (config.type === 'stream') {
|
|
return new StreamCipher(config.module, password, iv)
|
|
} else if (config.type === 'auth') {
|
|
return new AuthCipher(config.module, password, iv)
|
|
}
|
|
|
|
return new Cipher(config.module, password, iv)
|
|
}
|
|
|
|
function createCipher (suite, password) {
|
|
var config = MODES[suite.toLowerCase()]
|
|
if (!config) throw new TypeError('invalid suite type')
|
|
|
|
var keys = ebtk(password, false, config.key, config.iv)
|
|
return createCipheriv(suite, keys.key, keys.iv)
|
|
}
|
|
|
|
exports.createCipheriv = createCipheriv
|
|
exports.createCipher = createCipher
|
|
|
|
},{"./aes":101,"./authCipher":102,"./modes":114,"./streamCipher":117,"cipher-base":131,"evp_bytestokey":173,"inherits":190,"safe-buffer":305}],106:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var ZEROES = Buffer.alloc(16, 0)
|
|
|
|
function toArray (buf) {
|
|
return [
|
|
buf.readUInt32BE(0),
|
|
buf.readUInt32BE(4),
|
|
buf.readUInt32BE(8),
|
|
buf.readUInt32BE(12)
|
|
]
|
|
}
|
|
|
|
function fromArray (out) {
|
|
var buf = Buffer.allocUnsafe(16)
|
|
buf.writeUInt32BE(out[0] >>> 0, 0)
|
|
buf.writeUInt32BE(out[1] >>> 0, 4)
|
|
buf.writeUInt32BE(out[2] >>> 0, 8)
|
|
buf.writeUInt32BE(out[3] >>> 0, 12)
|
|
return buf
|
|
}
|
|
|
|
function GHASH (key) {
|
|
this.h = key
|
|
this.state = Buffer.alloc(16, 0)
|
|
this.cache = Buffer.allocUnsafe(0)
|
|
}
|
|
|
|
GHASH.prototype.ghash = function (block) {
|
|
var i = -1
|
|
while (++i < block.length) {
|
|
this.state[i] ^= block[i]
|
|
}
|
|
this._multiply()
|
|
}
|
|
|
|
GHASH.prototype._multiply = function () {
|
|
var Vi = toArray(this.h)
|
|
var Zi = [0, 0, 0, 0]
|
|
var j, xi, lsbVi
|
|
var i = -1
|
|
while (++i < 128) {
|
|
xi = (this.state[~~(i / 8)] & (1 << (7 - (i % 8)))) !== 0
|
|
if (xi) {
|
|
Zi[0] ^= Vi[0]
|
|
Zi[1] ^= Vi[1]
|
|
Zi[2] ^= Vi[2]
|
|
Zi[3] ^= Vi[3]
|
|
}
|
|
|
|
lsbVi = (Vi[3] & 1) !== 0
|
|
|
|
for (j = 3; j > 0; j--) {
|
|
Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31)
|
|
}
|
|
Vi[0] = Vi[0] >>> 1
|
|
|
|
if (lsbVi) {
|
|
Vi[0] = Vi[0] ^ (0xe1 << 24)
|
|
}
|
|
}
|
|
this.state = fromArray(Zi)
|
|
}
|
|
|
|
GHASH.prototype.update = function (buf) {
|
|
this.cache = Buffer.concat([this.cache, buf])
|
|
var chunk
|
|
while (this.cache.length >= 16) {
|
|
chunk = this.cache.slice(0, 16)
|
|
this.cache = this.cache.slice(16)
|
|
this.ghash(chunk)
|
|
}
|
|
}
|
|
|
|
GHASH.prototype.final = function (abl, bl) {
|
|
if (this.cache.length) {
|
|
this.ghash(Buffer.concat([this.cache, ZEROES], 16))
|
|
}
|
|
|
|
this.ghash(fromArray([0, abl, 0, bl]))
|
|
return this.state
|
|
}
|
|
|
|
module.exports = GHASH
|
|
|
|
},{"safe-buffer":305}],107:[function(require,module,exports){
|
|
function incr32 (iv) {
|
|
var len = iv.length
|
|
var item
|
|
while (len--) {
|
|
item = iv.readUInt8(len)
|
|
if (item === 255) {
|
|
iv.writeUInt8(0, len)
|
|
} else {
|
|
item++
|
|
iv.writeUInt8(item, len)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
module.exports = incr32
|
|
|
|
},{}],108:[function(require,module,exports){
|
|
var xor = require('buffer-xor')
|
|
|
|
exports.encrypt = function (self, block) {
|
|
var data = xor(block, self._prev)
|
|
|
|
self._prev = self._cipher.encryptBlock(data)
|
|
return self._prev
|
|
}
|
|
|
|
exports.decrypt = function (self, block) {
|
|
var pad = self._prev
|
|
|
|
self._prev = block
|
|
var out = self._cipher.decryptBlock(block)
|
|
|
|
return xor(out, pad)
|
|
}
|
|
|
|
},{"buffer-xor":129}],109:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var xor = require('buffer-xor')
|
|
|
|
function encryptStart (self, data, decrypt) {
|
|
var len = data.length
|
|
var out = xor(data, self._cache)
|
|
self._cache = self._cache.slice(len)
|
|
self._prev = Buffer.concat([self._prev, decrypt ? data : out])
|
|
return out
|
|
}
|
|
|
|
exports.encrypt = function (self, data, decrypt) {
|
|
var out = Buffer.allocUnsafe(0)
|
|
var len
|
|
|
|
while (data.length) {
|
|
if (self._cache.length === 0) {
|
|
self._cache = self._cipher.encryptBlock(self._prev)
|
|
self._prev = Buffer.allocUnsafe(0)
|
|
}
|
|
|
|
if (self._cache.length <= data.length) {
|
|
len = self._cache.length
|
|
out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)])
|
|
data = data.slice(len)
|
|
} else {
|
|
out = Buffer.concat([out, encryptStart(self, data, decrypt)])
|
|
break
|
|
}
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
},{"buffer-xor":129,"safe-buffer":305}],110:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
function encryptByte (self, byteParam, decrypt) {
|
|
var pad
|
|
var i = -1
|
|
var len = 8
|
|
var out = 0
|
|
var bit, value
|
|
while (++i < len) {
|
|
pad = self._cipher.encryptBlock(self._prev)
|
|
bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0
|
|
value = pad[0] ^ bit
|
|
out += ((value & 0x80) >> (i % 8))
|
|
self._prev = shiftIn(self._prev, decrypt ? bit : value)
|
|
}
|
|
return out
|
|
}
|
|
|
|
function shiftIn (buffer, value) {
|
|
var len = buffer.length
|
|
var i = -1
|
|
var out = Buffer.allocUnsafe(buffer.length)
|
|
buffer = Buffer.concat([buffer, Buffer.from([value])])
|
|
|
|
while (++i < len) {
|
|
out[i] = buffer[i] << 1 | buffer[i + 1] >> (7)
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
exports.encrypt = function (self, chunk, decrypt) {
|
|
var len = chunk.length
|
|
var out = Buffer.allocUnsafe(len)
|
|
var i = -1
|
|
|
|
while (++i < len) {
|
|
out[i] = encryptByte(self, chunk[i], decrypt)
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
},{"safe-buffer":305}],111:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
function encryptByte (self, byteParam, decrypt) {
|
|
var pad = self._cipher.encryptBlock(self._prev)
|
|
var out = pad[0] ^ byteParam
|
|
|
|
self._prev = Buffer.concat([
|
|
self._prev.slice(1),
|
|
Buffer.from([decrypt ? byteParam : out])
|
|
])
|
|
|
|
return out
|
|
}
|
|
|
|
exports.encrypt = function (self, chunk, decrypt) {
|
|
var len = chunk.length
|
|
var out = Buffer.allocUnsafe(len)
|
|
var i = -1
|
|
|
|
while (++i < len) {
|
|
out[i] = encryptByte(self, chunk[i], decrypt)
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
},{"safe-buffer":305}],112:[function(require,module,exports){
|
|
var xor = require('buffer-xor')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var incr32 = require('../incr32')
|
|
|
|
function getBlock (self) {
|
|
var out = self._cipher.encryptBlockRaw(self._prev)
|
|
incr32(self._prev)
|
|
return out
|
|
}
|
|
|
|
var blockSize = 16
|
|
exports.encrypt = function (self, chunk) {
|
|
var chunkNum = Math.ceil(chunk.length / blockSize)
|
|
var start = self._cache.length
|
|
self._cache = Buffer.concat([
|
|
self._cache,
|
|
Buffer.allocUnsafe(chunkNum * blockSize)
|
|
])
|
|
for (var i = 0; i < chunkNum; i++) {
|
|
var out = getBlock(self)
|
|
var offset = start + i * blockSize
|
|
self._cache.writeUInt32BE(out[0], offset + 0)
|
|
self._cache.writeUInt32BE(out[1], offset + 4)
|
|
self._cache.writeUInt32BE(out[2], offset + 8)
|
|
self._cache.writeUInt32BE(out[3], offset + 12)
|
|
}
|
|
var pad = self._cache.slice(0, chunk.length)
|
|
self._cache = self._cache.slice(chunk.length)
|
|
return xor(chunk, pad)
|
|
}
|
|
|
|
},{"../incr32":107,"buffer-xor":129,"safe-buffer":305}],113:[function(require,module,exports){
|
|
exports.encrypt = function (self, block) {
|
|
return self._cipher.encryptBlock(block)
|
|
}
|
|
|
|
exports.decrypt = function (self, block) {
|
|
return self._cipher.decryptBlock(block)
|
|
}
|
|
|
|
},{}],114:[function(require,module,exports){
|
|
var modeModules = {
|
|
ECB: require('./ecb'),
|
|
CBC: require('./cbc'),
|
|
CFB: require('./cfb'),
|
|
CFB8: require('./cfb8'),
|
|
CFB1: require('./cfb1'),
|
|
OFB: require('./ofb'),
|
|
CTR: require('./ctr'),
|
|
GCM: require('./ctr')
|
|
}
|
|
|
|
var modes = require('./list.json')
|
|
|
|
for (var key in modes) {
|
|
modes[key].module = modeModules[modes[key].mode]
|
|
}
|
|
|
|
module.exports = modes
|
|
|
|
},{"./cbc":108,"./cfb":109,"./cfb1":110,"./cfb8":111,"./ctr":112,"./ecb":113,"./list.json":115,"./ofb":116}],115:[function(require,module,exports){
|
|
module.exports={
|
|
"aes-128-ecb": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 0,
|
|
"mode": "ECB",
|
|
"type": "block"
|
|
},
|
|
"aes-192-ecb": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 0,
|
|
"mode": "ECB",
|
|
"type": "block"
|
|
},
|
|
"aes-256-ecb": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 0,
|
|
"mode": "ECB",
|
|
"type": "block"
|
|
},
|
|
"aes-128-cbc": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "CBC",
|
|
"type": "block"
|
|
},
|
|
"aes-192-cbc": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "CBC",
|
|
"type": "block"
|
|
},
|
|
"aes-256-cbc": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "CBC",
|
|
"type": "block"
|
|
},
|
|
"aes128": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "CBC",
|
|
"type": "block"
|
|
},
|
|
"aes192": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "CBC",
|
|
"type": "block"
|
|
},
|
|
"aes256": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "CBC",
|
|
"type": "block"
|
|
},
|
|
"aes-128-cfb": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "CFB",
|
|
"type": "stream"
|
|
},
|
|
"aes-192-cfb": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "CFB",
|
|
"type": "stream"
|
|
},
|
|
"aes-256-cfb": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "CFB",
|
|
"type": "stream"
|
|
},
|
|
"aes-128-cfb8": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "CFB8",
|
|
"type": "stream"
|
|
},
|
|
"aes-192-cfb8": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "CFB8",
|
|
"type": "stream"
|
|
},
|
|
"aes-256-cfb8": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "CFB8",
|
|
"type": "stream"
|
|
},
|
|
"aes-128-cfb1": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "CFB1",
|
|
"type": "stream"
|
|
},
|
|
"aes-192-cfb1": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "CFB1",
|
|
"type": "stream"
|
|
},
|
|
"aes-256-cfb1": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "CFB1",
|
|
"type": "stream"
|
|
},
|
|
"aes-128-ofb": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "OFB",
|
|
"type": "stream"
|
|
},
|
|
"aes-192-ofb": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "OFB",
|
|
"type": "stream"
|
|
},
|
|
"aes-256-ofb": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "OFB",
|
|
"type": "stream"
|
|
},
|
|
"aes-128-ctr": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 16,
|
|
"mode": "CTR",
|
|
"type": "stream"
|
|
},
|
|
"aes-192-ctr": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 16,
|
|
"mode": "CTR",
|
|
"type": "stream"
|
|
},
|
|
"aes-256-ctr": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 16,
|
|
"mode": "CTR",
|
|
"type": "stream"
|
|
},
|
|
"aes-128-gcm": {
|
|
"cipher": "AES",
|
|
"key": 128,
|
|
"iv": 12,
|
|
"mode": "GCM",
|
|
"type": "auth"
|
|
},
|
|
"aes-192-gcm": {
|
|
"cipher": "AES",
|
|
"key": 192,
|
|
"iv": 12,
|
|
"mode": "GCM",
|
|
"type": "auth"
|
|
},
|
|
"aes-256-gcm": {
|
|
"cipher": "AES",
|
|
"key": 256,
|
|
"iv": 12,
|
|
"mode": "GCM",
|
|
"type": "auth"
|
|
}
|
|
}
|
|
|
|
},{}],116:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var xor = require('buffer-xor')
|
|
|
|
function getBlock (self) {
|
|
self._prev = self._cipher.encryptBlock(self._prev)
|
|
return self._prev
|
|
}
|
|
|
|
exports.encrypt = function (self, chunk) {
|
|
while (self._cache.length < chunk.length) {
|
|
self._cache = Buffer.concat([self._cache, getBlock(self)])
|
|
}
|
|
|
|
var pad = self._cache.slice(0, chunk.length)
|
|
self._cache = self._cache.slice(chunk.length)
|
|
return xor(chunk, pad)
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130,"buffer-xor":129}],117:[function(require,module,exports){
|
|
var aes = require('./aes')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var Transform = require('cipher-base')
|
|
var inherits = require('inherits')
|
|
|
|
function StreamCipher (mode, key, iv, decrypt) {
|
|
Transform.call(this)
|
|
|
|
this._cipher = new aes.AES(key)
|
|
this._prev = Buffer.from(iv)
|
|
this._cache = Buffer.allocUnsafe(0)
|
|
this._secCache = Buffer.allocUnsafe(0)
|
|
this._decrypt = decrypt
|
|
this._mode = mode
|
|
}
|
|
|
|
inherits(StreamCipher, Transform)
|
|
|
|
StreamCipher.prototype._update = function (chunk) {
|
|
return this._mode.encrypt(this, chunk, this._decrypt)
|
|
}
|
|
|
|
StreamCipher.prototype._final = function () {
|
|
this._cipher.scrub()
|
|
}
|
|
|
|
module.exports = StreamCipher
|
|
|
|
},{"./aes":101,"cipher-base":131,"inherits":190,"safe-buffer":305}],118:[function(require,module,exports){
|
|
var ebtk = require('evp_bytestokey')
|
|
var aes = require('browserify-aes/browser')
|
|
var DES = require('browserify-des')
|
|
var desModes = require('browserify-des/modes')
|
|
var aesModes = require('browserify-aes/modes')
|
|
function createCipher (suite, password) {
|
|
var keyLen, ivLen
|
|
suite = suite.toLowerCase()
|
|
if (aesModes[suite]) {
|
|
keyLen = aesModes[suite].key
|
|
ivLen = aesModes[suite].iv
|
|
} else if (desModes[suite]) {
|
|
keyLen = desModes[suite].key * 8
|
|
ivLen = desModes[suite].iv
|
|
} else {
|
|
throw new TypeError('invalid suite type')
|
|
}
|
|
var keys = ebtk(password, false, keyLen, ivLen)
|
|
return createCipheriv(suite, keys.key, keys.iv)
|
|
}
|
|
function createDecipher (suite, password) {
|
|
var keyLen, ivLen
|
|
suite = suite.toLowerCase()
|
|
if (aesModes[suite]) {
|
|
keyLen = aesModes[suite].key
|
|
ivLen = aesModes[suite].iv
|
|
} else if (desModes[suite]) {
|
|
keyLen = desModes[suite].key * 8
|
|
ivLen = desModes[suite].iv
|
|
} else {
|
|
throw new TypeError('invalid suite type')
|
|
}
|
|
var keys = ebtk(password, false, keyLen, ivLen)
|
|
return createDecipheriv(suite, keys.key, keys.iv)
|
|
}
|
|
|
|
function createCipheriv (suite, key, iv) {
|
|
suite = suite.toLowerCase()
|
|
if (aesModes[suite]) {
|
|
return aes.createCipheriv(suite, key, iv)
|
|
} else if (desModes[suite]) {
|
|
return new DES({
|
|
key: key,
|
|
iv: iv,
|
|
mode: suite
|
|
})
|
|
} else {
|
|
throw new TypeError('invalid suite type')
|
|
}
|
|
}
|
|
function createDecipheriv (suite, key, iv) {
|
|
suite = suite.toLowerCase()
|
|
if (aesModes[suite]) {
|
|
return aes.createDecipheriv(suite, key, iv)
|
|
} else if (desModes[suite]) {
|
|
return new DES({
|
|
key: key,
|
|
iv: iv,
|
|
mode: suite,
|
|
decrypt: true
|
|
})
|
|
} else {
|
|
throw new TypeError('invalid suite type')
|
|
}
|
|
}
|
|
exports.createCipher = exports.Cipher = createCipher
|
|
exports.createCipheriv = exports.Cipheriv = createCipheriv
|
|
exports.createDecipher = exports.Decipher = createDecipher
|
|
exports.createDecipheriv = exports.Decipheriv = createDecipheriv
|
|
function getCiphers () {
|
|
return Object.keys(desModes).concat(aes.getCiphers())
|
|
}
|
|
exports.listCiphers = exports.getCiphers = getCiphers
|
|
|
|
},{"browserify-aes/browser":103,"browserify-aes/modes":114,"browserify-des":119,"browserify-des/modes":120,"evp_bytestokey":173}],119:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var CipherBase = require('cipher-base')
|
|
var des = require('des.js')
|
|
var inherits = require('inherits')
|
|
|
|
var modes = {
|
|
'des-ede3-cbc': des.CBC.instantiate(des.EDE),
|
|
'des-ede3': des.EDE,
|
|
'des-ede-cbc': des.CBC.instantiate(des.EDE),
|
|
'des-ede': des.EDE,
|
|
'des-cbc': des.CBC.instantiate(des.DES),
|
|
'des-ecb': des.DES
|
|
}
|
|
modes.des = modes['des-cbc']
|
|
modes.des3 = modes['des-ede3-cbc']
|
|
module.exports = DES
|
|
inherits(DES, CipherBase)
|
|
function DES (opts) {
|
|
CipherBase.call(this)
|
|
var modeName = opts.mode.toLowerCase()
|
|
var mode = modes[modeName]
|
|
var type
|
|
if (opts.decrypt) {
|
|
type = 'decrypt'
|
|
} else {
|
|
type = 'encrypt'
|
|
}
|
|
var key = opts.key
|
|
if (modeName === 'des-ede' || modeName === 'des-ede-cbc') {
|
|
key = Buffer.concat([key, key.slice(0, 8)])
|
|
}
|
|
var iv = opts.iv
|
|
this._des = mode.create({
|
|
key: key,
|
|
iv: iv,
|
|
type: type
|
|
})
|
|
}
|
|
DES.prototype._update = function (data) {
|
|
return new Buffer(this._des.update(data))
|
|
}
|
|
DES.prototype._final = function () {
|
|
return new Buffer(this._des.final())
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130,"cipher-base":131,"des.js":146,"inherits":190}],120:[function(require,module,exports){
|
|
exports['des-ecb'] = {
|
|
key: 8,
|
|
iv: 0
|
|
}
|
|
exports['des-cbc'] = exports.des = {
|
|
key: 8,
|
|
iv: 8
|
|
}
|
|
exports['des-ede3-cbc'] = exports.des3 = {
|
|
key: 24,
|
|
iv: 8
|
|
}
|
|
exports['des-ede3'] = {
|
|
key: 24,
|
|
iv: 0
|
|
}
|
|
exports['des-ede-cbc'] = {
|
|
key: 16,
|
|
iv: 8
|
|
}
|
|
exports['des-ede'] = {
|
|
key: 16,
|
|
iv: 0
|
|
}
|
|
|
|
},{}],121:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var bn = require('bn.js');
|
|
var randomBytes = require('randombytes');
|
|
module.exports = crt;
|
|
function blind(priv) {
|
|
var r = getr(priv);
|
|
var blinder = r.toRed(bn.mont(priv.modulus))
|
|
.redPow(new bn(priv.publicExponent)).fromRed();
|
|
return {
|
|
blinder: blinder,
|
|
unblinder:r.invm(priv.modulus)
|
|
};
|
|
}
|
|
function crt(msg, priv) {
|
|
var blinds = blind(priv);
|
|
var len = priv.modulus.byteLength();
|
|
var mod = bn.mont(priv.modulus);
|
|
var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus);
|
|
var c1 = blinded.toRed(bn.mont(priv.prime1));
|
|
var c2 = blinded.toRed(bn.mont(priv.prime2));
|
|
var qinv = priv.coefficient;
|
|
var p = priv.prime1;
|
|
var q = priv.prime2;
|
|
var m1 = c1.redPow(priv.exponent1);
|
|
var m2 = c2.redPow(priv.exponent2);
|
|
m1 = m1.fromRed();
|
|
m2 = m2.fromRed();
|
|
var h = m1.isub(m2).imul(qinv).umod(p);
|
|
h.imul(q);
|
|
m2.iadd(h);
|
|
return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len));
|
|
}
|
|
crt.getr = getr;
|
|
function getr(priv) {
|
|
var len = priv.modulus.byteLength();
|
|
var r = new bn(randomBytes(len));
|
|
while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) {
|
|
r = new bn(randomBytes(len));
|
|
}
|
|
return r;
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"bn.js":98,"buffer":130,"randombytes":288}],122:[function(require,module,exports){
|
|
module.exports = require('./browser/algorithms.json')
|
|
|
|
},{"./browser/algorithms.json":123}],123:[function(require,module,exports){
|
|
module.exports={
|
|
"sha224WithRSAEncryption": {
|
|
"sign": "rsa",
|
|
"hash": "sha224",
|
|
"id": "302d300d06096086480165030402040500041c"
|
|
},
|
|
"RSA-SHA224": {
|
|
"sign": "ecdsa/rsa",
|
|
"hash": "sha224",
|
|
"id": "302d300d06096086480165030402040500041c"
|
|
},
|
|
"sha256WithRSAEncryption": {
|
|
"sign": "rsa",
|
|
"hash": "sha256",
|
|
"id": "3031300d060960864801650304020105000420"
|
|
},
|
|
"RSA-SHA256": {
|
|
"sign": "ecdsa/rsa",
|
|
"hash": "sha256",
|
|
"id": "3031300d060960864801650304020105000420"
|
|
},
|
|
"sha384WithRSAEncryption": {
|
|
"sign": "rsa",
|
|
"hash": "sha384",
|
|
"id": "3041300d060960864801650304020205000430"
|
|
},
|
|
"RSA-SHA384": {
|
|
"sign": "ecdsa/rsa",
|
|
"hash": "sha384",
|
|
"id": "3041300d060960864801650304020205000430"
|
|
},
|
|
"sha512WithRSAEncryption": {
|
|
"sign": "rsa",
|
|
"hash": "sha512",
|
|
"id": "3051300d060960864801650304020305000440"
|
|
},
|
|
"RSA-SHA512": {
|
|
"sign": "ecdsa/rsa",
|
|
"hash": "sha512",
|
|
"id": "3051300d060960864801650304020305000440"
|
|
},
|
|
"RSA-SHA1": {
|
|
"sign": "rsa",
|
|
"hash": "sha1",
|
|
"id": "3021300906052b0e03021a05000414"
|
|
},
|
|
"ecdsa-with-SHA1": {
|
|
"sign": "ecdsa",
|
|
"hash": "sha1",
|
|
"id": ""
|
|
},
|
|
"sha256": {
|
|
"sign": "ecdsa",
|
|
"hash": "sha256",
|
|
"id": ""
|
|
},
|
|
"sha224": {
|
|
"sign": "ecdsa",
|
|
"hash": "sha224",
|
|
"id": ""
|
|
},
|
|
"sha384": {
|
|
"sign": "ecdsa",
|
|
"hash": "sha384",
|
|
"id": ""
|
|
},
|
|
"sha512": {
|
|
"sign": "ecdsa",
|
|
"hash": "sha512",
|
|
"id": ""
|
|
},
|
|
"DSA-SHA": {
|
|
"sign": "dsa",
|
|
"hash": "sha1",
|
|
"id": ""
|
|
},
|
|
"DSA-SHA1": {
|
|
"sign": "dsa",
|
|
"hash": "sha1",
|
|
"id": ""
|
|
},
|
|
"DSA": {
|
|
"sign": "dsa",
|
|
"hash": "sha1",
|
|
"id": ""
|
|
},
|
|
"DSA-WITH-SHA224": {
|
|
"sign": "dsa",
|
|
"hash": "sha224",
|
|
"id": ""
|
|
},
|
|
"DSA-SHA224": {
|
|
"sign": "dsa",
|
|
"hash": "sha224",
|
|
"id": ""
|
|
},
|
|
"DSA-WITH-SHA256": {
|
|
"sign": "dsa",
|
|
"hash": "sha256",
|
|
"id": ""
|
|
},
|
|
"DSA-SHA256": {
|
|
"sign": "dsa",
|
|
"hash": "sha256",
|
|
"id": ""
|
|
},
|
|
"DSA-WITH-SHA384": {
|
|
"sign": "dsa",
|
|
"hash": "sha384",
|
|
"id": ""
|
|
},
|
|
"DSA-SHA384": {
|
|
"sign": "dsa",
|
|
"hash": "sha384",
|
|
"id": ""
|
|
},
|
|
"DSA-WITH-SHA512": {
|
|
"sign": "dsa",
|
|
"hash": "sha512",
|
|
"id": ""
|
|
},
|
|
"DSA-SHA512": {
|
|
"sign": "dsa",
|
|
"hash": "sha512",
|
|
"id": ""
|
|
},
|
|
"DSA-RIPEMD160": {
|
|
"sign": "dsa",
|
|
"hash": "rmd160",
|
|
"id": ""
|
|
},
|
|
"ripemd160WithRSA": {
|
|
"sign": "rsa",
|
|
"hash": "rmd160",
|
|
"id": "3021300906052b2403020105000414"
|
|
},
|
|
"RSA-RIPEMD160": {
|
|
"sign": "rsa",
|
|
"hash": "rmd160",
|
|
"id": "3021300906052b2403020105000414"
|
|
},
|
|
"md5WithRSAEncryption": {
|
|
"sign": "rsa",
|
|
"hash": "md5",
|
|
"id": "3020300c06082a864886f70d020505000410"
|
|
},
|
|
"RSA-MD5": {
|
|
"sign": "rsa",
|
|
"hash": "md5",
|
|
"id": "3020300c06082a864886f70d020505000410"
|
|
}
|
|
}
|
|
|
|
},{}],124:[function(require,module,exports){
|
|
module.exports={
|
|
"1.3.132.0.10": "secp256k1",
|
|
"1.3.132.0.33": "p224",
|
|
"1.2.840.10045.3.1.1": "p192",
|
|
"1.2.840.10045.3.1.7": "p256",
|
|
"1.3.132.0.34": "p384",
|
|
"1.3.132.0.35": "p521"
|
|
}
|
|
|
|
},{}],125:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var createHash = require('create-hash')
|
|
var stream = require('stream')
|
|
var inherits = require('inherits')
|
|
var sign = require('./sign')
|
|
var verify = require('./verify')
|
|
|
|
var algorithms = require('./algorithms.json')
|
|
Object.keys(algorithms).forEach(function (key) {
|
|
algorithms[key].id = new Buffer(algorithms[key].id, 'hex')
|
|
algorithms[key.toLowerCase()] = algorithms[key]
|
|
})
|
|
|
|
function Sign (algorithm) {
|
|
stream.Writable.call(this)
|
|
|
|
var data = algorithms[algorithm]
|
|
if (!data) throw new Error('Unknown message digest')
|
|
|
|
this._hashType = data.hash
|
|
this._hash = createHash(data.hash)
|
|
this._tag = data.id
|
|
this._signType = data.sign
|
|
}
|
|
inherits(Sign, stream.Writable)
|
|
|
|
Sign.prototype._write = function _write (data, _, done) {
|
|
this._hash.update(data)
|
|
done()
|
|
}
|
|
|
|
Sign.prototype.update = function update (data, enc) {
|
|
if (typeof data === 'string') data = new Buffer(data, enc)
|
|
|
|
this._hash.update(data)
|
|
return this
|
|
}
|
|
|
|
Sign.prototype.sign = function signMethod (key, enc) {
|
|
this.end()
|
|
var hash = this._hash.digest()
|
|
var sig = sign(hash, key, this._hashType, this._signType, this._tag)
|
|
|
|
return enc ? sig.toString(enc) : sig
|
|
}
|
|
|
|
function Verify (algorithm) {
|
|
stream.Writable.call(this)
|
|
|
|
var data = algorithms[algorithm]
|
|
if (!data) throw new Error('Unknown message digest')
|
|
|
|
this._hash = createHash(data.hash)
|
|
this._tag = data.id
|
|
this._signType = data.sign
|
|
}
|
|
inherits(Verify, stream.Writable)
|
|
|
|
Verify.prototype._write = function _write (data, _, done) {
|
|
this._hash.update(data)
|
|
done()
|
|
}
|
|
|
|
Verify.prototype.update = function update (data, enc) {
|
|
if (typeof data === 'string') data = new Buffer(data, enc)
|
|
|
|
this._hash.update(data)
|
|
return this
|
|
}
|
|
|
|
Verify.prototype.verify = function verifyMethod (key, sig, enc) {
|
|
if (typeof sig === 'string') sig = new Buffer(sig, enc)
|
|
|
|
this.end()
|
|
var hash = this._hash.digest()
|
|
return verify(sig, hash, key, this._signType, this._tag)
|
|
}
|
|
|
|
function createSign (algorithm) {
|
|
return new Sign(algorithm)
|
|
}
|
|
|
|
function createVerify (algorithm) {
|
|
return new Verify(algorithm)
|
|
}
|
|
|
|
module.exports = {
|
|
Sign: createSign,
|
|
Verify: createVerify,
|
|
createSign: createSign,
|
|
createVerify: createVerify
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./algorithms.json":123,"./sign":126,"./verify":127,"buffer":130,"create-hash":135,"inherits":190,"stream":314}],126:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var createHmac = require('create-hmac')
|
|
var crt = require('browserify-rsa')
|
|
var EC = require('elliptic').ec
|
|
var BN = require('bn.js')
|
|
var parseKeys = require('parse-asn1')
|
|
var curves = require('./curves.json')
|
|
|
|
function sign (hash, key, hashType, signType, tag) {
|
|
var priv = parseKeys(key)
|
|
if (priv.curve) {
|
|
if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type')
|
|
return ecSign(hash, priv)
|
|
} else if (priv.type === 'dsa') {
|
|
if (signType !== 'dsa') throw new Error('wrong private key type')
|
|
return dsaSign(hash, priv, hashType)
|
|
} else {
|
|
if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type')
|
|
}
|
|
hash = Buffer.concat([tag, hash])
|
|
var len = priv.modulus.byteLength()
|
|
var pad = [ 0, 1 ]
|
|
while (hash.length + pad.length + 1 < len) pad.push(0xff)
|
|
pad.push(0x00)
|
|
var i = -1
|
|
while (++i < hash.length) pad.push(hash[i])
|
|
|
|
var out = crt(pad, priv)
|
|
return out
|
|
}
|
|
|
|
function ecSign (hash, priv) {
|
|
var curveId = curves[priv.curve.join('.')]
|
|
if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.'))
|
|
|
|
var curve = new EC(curveId)
|
|
var key = curve.keyFromPrivate(priv.privateKey)
|
|
var out = key.sign(hash)
|
|
|
|
return new Buffer(out.toDER())
|
|
}
|
|
|
|
function dsaSign (hash, priv, algo) {
|
|
var x = priv.params.priv_key
|
|
var p = priv.params.p
|
|
var q = priv.params.q
|
|
var g = priv.params.g
|
|
var r = new BN(0)
|
|
var k
|
|
var H = bits2int(hash, q).mod(q)
|
|
var s = false
|
|
var kv = getKey(x, q, hash, algo)
|
|
while (s === false) {
|
|
k = makeKey(q, kv, algo)
|
|
r = makeR(g, k, p, q)
|
|
s = k.invm(q).imul(H.add(x.mul(r))).mod(q)
|
|
if (s.cmpn(0) === 0) {
|
|
s = false
|
|
r = new BN(0)
|
|
}
|
|
}
|
|
return toDER(r, s)
|
|
}
|
|
|
|
function toDER (r, s) {
|
|
r = r.toArray()
|
|
s = s.toArray()
|
|
|
|
if (r[0] & 0x80) r = [ 0 ].concat(r)
|
|
if (s[0] & 0x80) s = [ 0 ].concat(s)
|
|
|
|
var total = r.length + s.length + 4
|
|
var res = [ 0x30, total, 0x02, r.length ]
|
|
res = res.concat(r, [ 0x02, s.length ], s)
|
|
return new Buffer(res)
|
|
}
|
|
|
|
function getKey (x, q, hash, algo) {
|
|
x = new Buffer(x.toArray())
|
|
if (x.length < q.byteLength()) {
|
|
var zeros = new Buffer(q.byteLength() - x.length)
|
|
zeros.fill(0)
|
|
x = Buffer.concat([ zeros, x ])
|
|
}
|
|
var hlen = hash.length
|
|
var hbits = bits2octets(hash, q)
|
|
var v = new Buffer(hlen)
|
|
v.fill(1)
|
|
var k = new Buffer(hlen)
|
|
k.fill(0)
|
|
k = createHmac(algo, k).update(v).update(new Buffer([ 0 ])).update(x).update(hbits).digest()
|
|
v = createHmac(algo, k).update(v).digest()
|
|
k = createHmac(algo, k).update(v).update(new Buffer([ 1 ])).update(x).update(hbits).digest()
|
|
v = createHmac(algo, k).update(v).digest()
|
|
return { k: k, v: v }
|
|
}
|
|
|
|
function bits2int (obits, q) {
|
|
var bits = new BN(obits)
|
|
var shift = (obits.length << 3) - q.bitLength()
|
|
if (shift > 0) bits.ishrn(shift)
|
|
return bits
|
|
}
|
|
|
|
function bits2octets (bits, q) {
|
|
bits = bits2int(bits, q)
|
|
bits = bits.mod(q)
|
|
var out = new Buffer(bits.toArray())
|
|
if (out.length < q.byteLength()) {
|
|
var zeros = new Buffer(q.byteLength() - out.length)
|
|
zeros.fill(0)
|
|
out = Buffer.concat([ zeros, out ])
|
|
}
|
|
return out
|
|
}
|
|
|
|
function makeKey (q, kv, algo) {
|
|
var t
|
|
var k
|
|
|
|
do {
|
|
t = new Buffer(0)
|
|
|
|
while (t.length * 8 < q.bitLength()) {
|
|
kv.v = createHmac(algo, kv.k).update(kv.v).digest()
|
|
t = Buffer.concat([ t, kv.v ])
|
|
}
|
|
|
|
k = bits2int(t, q)
|
|
kv.k = createHmac(algo, kv.k).update(kv.v).update(new Buffer([ 0 ])).digest()
|
|
kv.v = createHmac(algo, kv.k).update(kv.v).digest()
|
|
} while (k.cmp(q) !== -1)
|
|
|
|
return k
|
|
}
|
|
|
|
function makeR (g, k, p, q) {
|
|
return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q)
|
|
}
|
|
|
|
module.exports = sign
|
|
module.exports.getKey = getKey
|
|
module.exports.makeKey = makeKey
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./curves.json":124,"bn.js":98,"browserify-rsa":121,"buffer":130,"create-hmac":138,"elliptic":156,"parse-asn1":267}],127:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var BN = require('bn.js')
|
|
var EC = require('elliptic').ec
|
|
var parseKeys = require('parse-asn1')
|
|
var curves = require('./curves.json')
|
|
|
|
function verify (sig, hash, key, signType, tag) {
|
|
var pub = parseKeys(key)
|
|
if (pub.type === 'ec') {
|
|
if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type')
|
|
return ecVerify(sig, hash, pub)
|
|
} else if (pub.type === 'dsa') {
|
|
if (signType !== 'dsa') throw new Error('wrong public key type')
|
|
return dsaVerify(sig, hash, pub)
|
|
} else {
|
|
if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type')
|
|
}
|
|
hash = Buffer.concat([tag, hash])
|
|
var len = pub.modulus.byteLength()
|
|
var pad = [ 1 ]
|
|
var padNum = 0
|
|
while (hash.length + pad.length + 2 < len) {
|
|
pad.push(0xff)
|
|
padNum++
|
|
}
|
|
pad.push(0x00)
|
|
var i = -1
|
|
while (++i < hash.length) {
|
|
pad.push(hash[i])
|
|
}
|
|
pad = new Buffer(pad)
|
|
var red = BN.mont(pub.modulus)
|
|
sig = new BN(sig).toRed(red)
|
|
|
|
sig = sig.redPow(new BN(pub.publicExponent))
|
|
sig = new Buffer(sig.fromRed().toArray())
|
|
var out = padNum < 8 ? 1 : 0
|
|
len = Math.min(sig.length, pad.length)
|
|
if (sig.length !== pad.length) out = 1
|
|
|
|
i = -1
|
|
while (++i < len) out |= sig[i] ^ pad[i]
|
|
return out === 0
|
|
}
|
|
|
|
function ecVerify (sig, hash, pub) {
|
|
var curveId = curves[pub.data.algorithm.curve.join('.')]
|
|
if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.'))
|
|
|
|
var curve = new EC(curveId)
|
|
var pubkey = pub.data.subjectPrivateKey.data
|
|
|
|
return curve.verify(hash, sig, pubkey)
|
|
}
|
|
|
|
function dsaVerify (sig, hash, pub) {
|
|
var p = pub.data.p
|
|
var q = pub.data.q
|
|
var g = pub.data.g
|
|
var y = pub.data.pub_key
|
|
var unpacked = parseKeys.signature.decode(sig, 'der')
|
|
var s = unpacked.s
|
|
var r = unpacked.r
|
|
checkValue(s, q)
|
|
checkValue(r, q)
|
|
var montp = BN.mont(p)
|
|
var w = s.invm(q)
|
|
var v = g.toRed(montp)
|
|
.redPow(new BN(hash).mul(w).mod(q))
|
|
.fromRed()
|
|
.mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed())
|
|
.mod(p)
|
|
.mod(q)
|
|
return v.cmp(r) === 0
|
|
}
|
|
|
|
function checkValue (b, q) {
|
|
if (b.cmpn(0) <= 0) throw new Error('invalid sig')
|
|
if (b.cmp(q) >= q) throw new Error('invalid sig')
|
|
}
|
|
|
|
module.exports = verify
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./curves.json":124,"bn.js":98,"buffer":130,"elliptic":156,"parse-asn1":267}],128:[function(require,module,exports){
|
|
'use strict'
|
|
|
|
exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes')
|
|
exports.createHash = exports.Hash = require('create-hash')
|
|
exports.createHmac = exports.Hmac = require('create-hmac')
|
|
|
|
var algos = require('browserify-sign/algos')
|
|
var algoKeys = Object.keys(algos)
|
|
var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys)
|
|
exports.getHashes = function () {
|
|
return hashes
|
|
}
|
|
|
|
var p = require('pbkdf2')
|
|
exports.pbkdf2 = p.pbkdf2
|
|
exports.pbkdf2Sync = p.pbkdf2Sync
|
|
|
|
var aes = require('browserify-cipher')
|
|
|
|
exports.Cipher = aes.Cipher
|
|
exports.createCipher = aes.createCipher
|
|
exports.Cipheriv = aes.Cipheriv
|
|
exports.createCipheriv = aes.createCipheriv
|
|
exports.Decipher = aes.Decipher
|
|
exports.createDecipher = aes.createDecipher
|
|
exports.Decipheriv = aes.Decipheriv
|
|
exports.createDecipheriv = aes.createDecipheriv
|
|
exports.getCiphers = aes.getCiphers
|
|
exports.listCiphers = aes.listCiphers
|
|
|
|
var dh = require('diffie-hellman')
|
|
|
|
exports.DiffieHellmanGroup = dh.DiffieHellmanGroup
|
|
exports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup
|
|
exports.getDiffieHellman = dh.getDiffieHellman
|
|
exports.createDiffieHellman = dh.createDiffieHellman
|
|
exports.DiffieHellman = dh.DiffieHellman
|
|
|
|
var sign = require('browserify-sign')
|
|
|
|
exports.createSign = sign.createSign
|
|
exports.Sign = sign.Sign
|
|
exports.createVerify = sign.createVerify
|
|
exports.Verify = sign.Verify
|
|
|
|
exports.createECDH = require('create-ecdh')
|
|
|
|
var publicEncrypt = require('public-encrypt')
|
|
|
|
exports.publicEncrypt = publicEncrypt.publicEncrypt
|
|
exports.privateEncrypt = publicEncrypt.privateEncrypt
|
|
exports.publicDecrypt = publicEncrypt.publicDecrypt
|
|
exports.privateDecrypt = publicEncrypt.privateDecrypt
|
|
|
|
|
|
var rf = require('randomfill')
|
|
|
|
exports.randomFill = rf.randomFill
|
|
exports.randomFillSync = rf.randomFillSync
|
|
|
|
exports.createCredentials = function () {
|
|
throw new Error([
|
|
'sorry, createCredentials is not implemented yet',
|
|
'we accept pull requests',
|
|
'https://github.com/crypto-browserify/crypto-browserify'
|
|
].join('\n'))
|
|
}
|
|
|
|
exports.constants = {
|
|
'DH_CHECK_P_NOT_SAFE_PRIME': 2,
|
|
'DH_CHECK_P_NOT_PRIME': 1,
|
|
'DH_UNABLE_TO_CHECK_GENERATOR': 4,
|
|
'DH_NOT_SUITABLE_GENERATOR': 8,
|
|
'NPN_ENABLED': 1,
|
|
'ALPN_ENABLED': 1,
|
|
'RSA_PKCS1_PADDING': 1,
|
|
'RSA_SSLV23_PADDING': 2,
|
|
'RSA_NO_PADDING': 3,
|
|
'RSA_PKCS1_OAEP_PADDING': 4,
|
|
'RSA_X931_PADDING': 5,
|
|
'RSA_PKCS1_PSS_PADDING': 6,
|
|
'POINT_CONVERSION_COMPRESSED': 2,
|
|
'POINT_CONVERSION_UNCOMPRESSED': 4,
|
|
'POINT_CONVERSION_HYBRID': 6
|
|
}
|
|
|
|
},{"browserify-cipher":118,"browserify-sign":125,"browserify-sign/algos":122,"create-ecdh":134,"create-hash":135,"create-hmac":138,"diffie-hellman":152,"pbkdf2":268,"public-encrypt":275,"randombytes":288,"randomfill":289}],129:[function(require,module,exports){
|
|
(function (Buffer){
|
|
module.exports = function xor (a, b) {
|
|
var length = Math.min(a.length, b.length)
|
|
var buffer = new Buffer(length)
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
buffer[i] = a[i] ^ b[i]
|
|
}
|
|
|
|
return buffer
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130}],130:[function(require,module,exports){
|
|
(function (global){
|
|
|
|
|
|
|
|
'use strict'
|
|
|
|
var base64 = require('base64-js')
|
|
var ieee754 = require('ieee754')
|
|
var isArray = require('isarray')
|
|
|
|
exports.Buffer = Buffer
|
|
exports.SlowBuffer = SlowBuffer
|
|
exports.INSPECT_MAX_BYTES = 50
|
|
|
|
|
|
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
|
|
? global.TYPED_ARRAY_SUPPORT
|
|
: typedArraySupport()
|
|
|
|
|
|
exports.kMaxLength = kMaxLength()
|
|
|
|
function typedArraySupport () {
|
|
try {
|
|
var arr = new Uint8Array(1)
|
|
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
|
|
return arr.foo() === 42 && // typed array instances can be augmented
|
|
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
|
|
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
|
|
} catch (e) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
function kMaxLength () {
|
|
return Buffer.TYPED_ARRAY_SUPPORT
|
|
? 0x7fffffff
|
|
: 0x3fffffff
|
|
}
|
|
|
|
function createBuffer (that, length) {
|
|
if (kMaxLength() < length) {
|
|
throw new RangeError('Invalid typed array length')
|
|
}
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
that = new Uint8Array(length)
|
|
that.__proto__ = Buffer.prototype
|
|
} else {
|
|
if (that === null) {
|
|
that = new Buffer(length)
|
|
}
|
|
that.length = length
|
|
}
|
|
|
|
return that
|
|
}
|
|
|
|
|
|
|
|
function Buffer (arg, encodingOrOffset, length) {
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
|
|
return new Buffer(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
if (typeof arg === 'number') {
|
|
if (typeof encodingOrOffset === 'string') {
|
|
throw new Error(
|
|
'If encoding is specified then the first argument must be a string'
|
|
)
|
|
}
|
|
return allocUnsafe(this, arg)
|
|
}
|
|
return from(this, arg, encodingOrOffset, length)
|
|
}
|
|
|
|
Buffer.poolSize = 8192 // not used by this implementation
|
|
|
|
Buffer._augment = function (arr) {
|
|
arr.__proto__ = Buffer.prototype
|
|
return arr
|
|
}
|
|
|
|
function from (that, value, encodingOrOffset, length) {
|
|
if (typeof value === 'number') {
|
|
throw new TypeError('"value" argument must not be a number')
|
|
}
|
|
|
|
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
|
|
return fromArrayBuffer(that, value, encodingOrOffset, length)
|
|
}
|
|
|
|
if (typeof value === 'string') {
|
|
return fromString(that, value, encodingOrOffset)
|
|
}
|
|
|
|
return fromObject(that, value)
|
|
}
|
|
|
|
|
|
Buffer.from = function (value, encodingOrOffset, length) {
|
|
return from(null, value, encodingOrOffset, length)
|
|
}
|
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
Buffer.prototype.__proto__ = Uint8Array.prototype
|
|
Buffer.__proto__ = Uint8Array
|
|
if (typeof Symbol !== 'undefined' && Symbol.species &&
|
|
Buffer[Symbol.species] === Buffer) {
|
|
Object.defineProperty(Buffer, Symbol.species, {
|
|
value: null,
|
|
configurable: true
|
|
})
|
|
}
|
|
}
|
|
|
|
function assertSize (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('"size" argument must be a number')
|
|
} else if (size < 0) {
|
|
throw new RangeError('"size" argument must not be negative')
|
|
}
|
|
}
|
|
|
|
function alloc (that, size, fill, encoding) {
|
|
assertSize(size)
|
|
if (size <= 0) {
|
|
return createBuffer(that, size)
|
|
}
|
|
if (fill !== undefined) {
|
|
return typeof encoding === 'string'
|
|
? createBuffer(that, size).fill(fill, encoding)
|
|
: createBuffer(that, size).fill(fill)
|
|
}
|
|
return createBuffer(that, size)
|
|
}
|
|
|
|
|
|
Buffer.alloc = function (size, fill, encoding) {
|
|
return alloc(null, size, fill, encoding)
|
|
}
|
|
|
|
function allocUnsafe (that, size) {
|
|
assertSize(size)
|
|
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT) {
|
|
for (var i = 0; i < size; ++i) {
|
|
that[i] = 0
|
|
}
|
|
}
|
|
return that
|
|
}
|
|
|
|
|
|
Buffer.allocUnsafe = function (size) {
|
|
return allocUnsafe(null, size)
|
|
}
|
|
|
|
Buffer.allocUnsafeSlow = function (size) {
|
|
return allocUnsafe(null, size)
|
|
}
|
|
|
|
function fromString (that, string, encoding) {
|
|
if (typeof encoding !== 'string' || encoding === '') {
|
|
encoding = 'utf8'
|
|
}
|
|
|
|
if (!Buffer.isEncoding(encoding)) {
|
|
throw new TypeError('"encoding" must be a valid string encoding')
|
|
}
|
|
|
|
var length = byteLength(string, encoding) | 0
|
|
that = createBuffer(that, length)
|
|
|
|
var actual = that.write(string, encoding)
|
|
|
|
if (actual !== length) {
|
|
that = that.slice(0, actual)
|
|
}
|
|
|
|
return that
|
|
}
|
|
|
|
function fromArrayLike (that, array) {
|
|
var length = array.length < 0 ? 0 : checked(array.length) | 0
|
|
that = createBuffer(that, length)
|
|
for (var i = 0; i < length; i += 1) {
|
|
that[i] = array[i] & 255
|
|
}
|
|
return that
|
|
}
|
|
|
|
function fromArrayBuffer (that, array, byteOffset, length) {
|
|
array.byteLength // this throws if `array` is not a valid ArrayBuffer
|
|
|
|
if (byteOffset < 0 || array.byteLength < byteOffset) {
|
|
throw new RangeError('\'offset\' is out of bounds')
|
|
}
|
|
|
|
if (array.byteLength < byteOffset + (length || 0)) {
|
|
throw new RangeError('\'length\' is out of bounds')
|
|
}
|
|
|
|
if (byteOffset === undefined && length === undefined) {
|
|
array = new Uint8Array(array)
|
|
} else if (length === undefined) {
|
|
array = new Uint8Array(array, byteOffset)
|
|
} else {
|
|
array = new Uint8Array(array, byteOffset, length)
|
|
}
|
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
that = array
|
|
that.__proto__ = Buffer.prototype
|
|
} else {
|
|
that = fromArrayLike(that, array)
|
|
}
|
|
return that
|
|
}
|
|
|
|
function fromObject (that, obj) {
|
|
if (Buffer.isBuffer(obj)) {
|
|
var len = checked(obj.length) | 0
|
|
that = createBuffer(that, len)
|
|
|
|
if (that.length === 0) {
|
|
return that
|
|
}
|
|
|
|
obj.copy(that, 0, 0, len)
|
|
return that
|
|
}
|
|
|
|
if (obj) {
|
|
if ((typeof ArrayBuffer !== 'undefined' &&
|
|
obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
|
|
if (typeof obj.length !== 'number' || isnan(obj.length)) {
|
|
return createBuffer(that, 0)
|
|
}
|
|
return fromArrayLike(that, obj)
|
|
}
|
|
|
|
if (obj.type === 'Buffer' && isArray(obj.data)) {
|
|
return fromArrayLike(that, obj.data)
|
|
}
|
|
}
|
|
|
|
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
|
|
}
|
|
|
|
function checked (length) {
|
|
if (length >= kMaxLength()) {
|
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
|
'size: 0x' + kMaxLength().toString(16) + ' bytes')
|
|
}
|
|
return length | 0
|
|
}
|
|
|
|
function SlowBuffer (length) {
|
|
if (+length != length) { // eslint-disable-line eqeqeq
|
|
length = 0
|
|
}
|
|
return Buffer.alloc(+length)
|
|
}
|
|
|
|
Buffer.isBuffer = function isBuffer (b) {
|
|
return !!(b != null && b._isBuffer)
|
|
}
|
|
|
|
Buffer.compare = function compare (a, b) {
|
|
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
|
|
throw new TypeError('Arguments must be Buffers')
|
|
}
|
|
|
|
if (a === b) return 0
|
|
|
|
var x = a.length
|
|
var y = b.length
|
|
|
|
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
|
if (a[i] !== b[i]) {
|
|
x = a[i]
|
|
y = b[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if (x < y) return -1
|
|
if (y < x) return 1
|
|
return 0
|
|
}
|
|
|
|
Buffer.isEncoding = function isEncoding (encoding) {
|
|
switch (String(encoding).toLowerCase()) {
|
|
case 'hex':
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
case 'ascii':
|
|
case 'latin1':
|
|
case 'binary':
|
|
case 'base64':
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
Buffer.concat = function concat (list, length) {
|
|
if (!isArray(list)) {
|
|
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
}
|
|
|
|
if (list.length === 0) {
|
|
return Buffer.alloc(0)
|
|
}
|
|
|
|
var i
|
|
if (length === undefined) {
|
|
length = 0
|
|
for (i = 0; i < list.length; ++i) {
|
|
length += list[i].length
|
|
}
|
|
}
|
|
|
|
var buffer = Buffer.allocUnsafe(length)
|
|
var pos = 0
|
|
for (i = 0; i < list.length; ++i) {
|
|
var buf = list[i]
|
|
if (!Buffer.isBuffer(buf)) {
|
|
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
}
|
|
buf.copy(buffer, pos)
|
|
pos += buf.length
|
|
}
|
|
return buffer
|
|
}
|
|
|
|
function byteLength (string, encoding) {
|
|
if (Buffer.isBuffer(string)) {
|
|
return string.length
|
|
}
|
|
if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
|
|
(ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
|
|
return string.byteLength
|
|
}
|
|
if (typeof string !== 'string') {
|
|
string = '' + string
|
|
}
|
|
|
|
var len = string.length
|
|
if (len === 0) return 0
|
|
|
|
var loweredCase = false
|
|
for (;;) {
|
|
switch (encoding) {
|
|
case 'ascii':
|
|
case 'latin1':
|
|
case 'binary':
|
|
return len
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
case undefined:
|
|
return utf8ToBytes(string).length
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return len * 2
|
|
case 'hex':
|
|
return len >>> 1
|
|
case 'base64':
|
|
return base64ToBytes(string).length
|
|
default:
|
|
if (loweredCase) return utf8ToBytes(string).length // assume utf8
|
|
encoding = ('' + encoding).toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
Buffer.byteLength = byteLength
|
|
|
|
function slowToString (encoding, start, end) {
|
|
var loweredCase = false
|
|
|
|
|
|
if (start === undefined || start < 0) {
|
|
start = 0
|
|
}
|
|
if (start > this.length) {
|
|
return ''
|
|
}
|
|
|
|
if (end === undefined || end > this.length) {
|
|
end = this.length
|
|
}
|
|
|
|
if (end <= 0) {
|
|
return ''
|
|
}
|
|
|
|
end >>>= 0
|
|
start >>>= 0
|
|
|
|
if (end <= start) {
|
|
return ''
|
|
}
|
|
|
|
if (!encoding) encoding = 'utf8'
|
|
|
|
while (true) {
|
|
switch (encoding) {
|
|
case 'hex':
|
|
return hexSlice(this, start, end)
|
|
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8Slice(this, start, end)
|
|
|
|
case 'ascii':
|
|
return asciiSlice(this, start, end)
|
|
|
|
case 'latin1':
|
|
case 'binary':
|
|
return latin1Slice(this, start, end)
|
|
|
|
case 'base64':
|
|
return base64Slice(this, start, end)
|
|
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return utf16leSlice(this, start, end)
|
|
|
|
default:
|
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
encoding = (encoding + '').toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
|
|
Buffer.prototype._isBuffer = true
|
|
|
|
function swap (b, n, m) {
|
|
var i = b[n]
|
|
b[n] = b[m]
|
|
b[m] = i
|
|
}
|
|
|
|
Buffer.prototype.swap16 = function swap16 () {
|
|
var len = this.length
|
|
if (len % 2 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 16-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 2) {
|
|
swap(this, i, i + 1)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.swap32 = function swap32 () {
|
|
var len = this.length
|
|
if (len % 4 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 32-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 4) {
|
|
swap(this, i, i + 3)
|
|
swap(this, i + 1, i + 2)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.swap64 = function swap64 () {
|
|
var len = this.length
|
|
if (len % 8 !== 0) {
|
|
throw new RangeError('Buffer size must be a multiple of 64-bits')
|
|
}
|
|
for (var i = 0; i < len; i += 8) {
|
|
swap(this, i, i + 7)
|
|
swap(this, i + 1, i + 6)
|
|
swap(this, i + 2, i + 5)
|
|
swap(this, i + 3, i + 4)
|
|
}
|
|
return this
|
|
}
|
|
|
|
Buffer.prototype.toString = function toString () {
|
|
var length = this.length | 0
|
|
if (length === 0) return ''
|
|
if (arguments.length === 0) return utf8Slice(this, 0, length)
|
|
return slowToString.apply(this, arguments)
|
|
}
|
|
|
|
Buffer.prototype.equals = function equals (b) {
|
|
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|
if (this === b) return true
|
|
return Buffer.compare(this, b) === 0
|
|
}
|
|
|
|
Buffer.prototype.inspect = function inspect () {
|
|
var str = ''
|
|
var max = exports.INSPECT_MAX_BYTES
|
|
if (this.length > 0) {
|
|
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
|
|
if (this.length > max) str += ' ... '
|
|
}
|
|
return '<Buffer ' + str + '>'
|
|
}
|
|
|
|
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
|
if (!Buffer.isBuffer(target)) {
|
|
throw new TypeError('Argument must be a Buffer')
|
|
}
|
|
|
|
if (start === undefined) {
|
|
start = 0
|
|
}
|
|
if (end === undefined) {
|
|
end = target ? target.length : 0
|
|
}
|
|
if (thisStart === undefined) {
|
|
thisStart = 0
|
|
}
|
|
if (thisEnd === undefined) {
|
|
thisEnd = this.length
|
|
}
|
|
|
|
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
|
throw new RangeError('out of range index')
|
|
}
|
|
|
|
if (thisStart >= thisEnd && start >= end) {
|
|
return 0
|
|
}
|
|
if (thisStart >= thisEnd) {
|
|
return -1
|
|
}
|
|
if (start >= end) {
|
|
return 1
|
|
}
|
|
|
|
start >>>= 0
|
|
end >>>= 0
|
|
thisStart >>>= 0
|
|
thisEnd >>>= 0
|
|
|
|
if (this === target) return 0
|
|
|
|
var x = thisEnd - thisStart
|
|
var y = end - start
|
|
var len = Math.min(x, y)
|
|
|
|
var thisCopy = this.slice(thisStart, thisEnd)
|
|
var targetCopy = target.slice(start, end)
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
if (thisCopy[i] !== targetCopy[i]) {
|
|
x = thisCopy[i]
|
|
y = targetCopy[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if (x < y) return -1
|
|
if (y < x) return 1
|
|
return 0
|
|
}
|
|
|
|
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
|
if (buffer.length === 0) return -1
|
|
|
|
if (typeof byteOffset === 'string') {
|
|
encoding = byteOffset
|
|
byteOffset = 0
|
|
} else if (byteOffset > 0x7fffffff) {
|
|
byteOffset = 0x7fffffff
|
|
} else if (byteOffset < -0x80000000) {
|
|
byteOffset = -0x80000000
|
|
}
|
|
byteOffset = +byteOffset // Coerce to Number.
|
|
if (isNaN(byteOffset)) {
|
|
byteOffset = dir ? 0 : (buffer.length - 1)
|
|
}
|
|
|
|
if (byteOffset < 0) byteOffset = buffer.length + byteOffset
|
|
if (byteOffset >= buffer.length) {
|
|
if (dir) return -1
|
|
else byteOffset = buffer.length - 1
|
|
} else if (byteOffset < 0) {
|
|
if (dir) byteOffset = 0
|
|
else return -1
|
|
}
|
|
|
|
if (typeof val === 'string') {
|
|
val = Buffer.from(val, encoding)
|
|
}
|
|
|
|
if (Buffer.isBuffer(val)) {
|
|
if (val.length === 0) {
|
|
return -1
|
|
}
|
|
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
|
} else if (typeof val === 'number') {
|
|
val = val & 0xFF // Search for a byte value [0-255]
|
|
if (Buffer.TYPED_ARRAY_SUPPORT &&
|
|
typeof Uint8Array.prototype.indexOf === 'function') {
|
|
if (dir) {
|
|
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
|
} else {
|
|
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
|
}
|
|
}
|
|
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
|
}
|
|
|
|
throw new TypeError('val must be string, number or Buffer')
|
|
}
|
|
|
|
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
|
var indexSize = 1
|
|
var arrLength = arr.length
|
|
var valLength = val.length
|
|
|
|
if (encoding !== undefined) {
|
|
encoding = String(encoding).toLowerCase()
|
|
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
|
encoding === 'utf16le' || encoding === 'utf-16le') {
|
|
if (arr.length < 2 || val.length < 2) {
|
|
return -1
|
|
}
|
|
indexSize = 2
|
|
arrLength /= 2
|
|
valLength /= 2
|
|
byteOffset /= 2
|
|
}
|
|
}
|
|
|
|
function read (buf, i) {
|
|
if (indexSize === 1) {
|
|
return buf[i]
|
|
} else {
|
|
return buf.readUInt16BE(i * indexSize)
|
|
}
|
|
}
|
|
|
|
var i
|
|
if (dir) {
|
|
var foundIndex = -1
|
|
for (i = byteOffset; i < arrLength; i++) {
|
|
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
|
if (foundIndex === -1) foundIndex = i
|
|
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
|
} else {
|
|
if (foundIndex !== -1) i -= i - foundIndex
|
|
foundIndex = -1
|
|
}
|
|
}
|
|
} else {
|
|
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
|
|
for (i = byteOffset; i >= 0; i--) {
|
|
var found = true
|
|
for (var j = 0; j < valLength; j++) {
|
|
if (read(arr, i + j) !== read(val, j)) {
|
|
found = false
|
|
break
|
|
}
|
|
}
|
|
if (found) return i
|
|
}
|
|
}
|
|
|
|
return -1
|
|
}
|
|
|
|
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
|
return this.indexOf(val, byteOffset, encoding) !== -1
|
|
}
|
|
|
|
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
|
}
|
|
|
|
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
|
}
|
|
|
|
function hexWrite (buf, string, offset, length) {
|
|
offset = Number(offset) || 0
|
|
var remaining = buf.length - offset
|
|
if (!length) {
|
|
length = remaining
|
|
} else {
|
|
length = Number(length)
|
|
if (length > remaining) {
|
|
length = remaining
|
|
}
|
|
}
|
|
|
|
var strLen = string.length
|
|
if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
|
|
|
|
if (length > strLen / 2) {
|
|
length = strLen / 2
|
|
}
|
|
for (var i = 0; i < length; ++i) {
|
|
var parsed = parseInt(string.substr(i * 2, 2), 16)
|
|
if (isNaN(parsed)) return i
|
|
buf[offset + i] = parsed
|
|
}
|
|
return i
|
|
}
|
|
|
|
function utf8Write (buf, string, offset, length) {
|
|
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
|
}
|
|
|
|
function asciiWrite (buf, string, offset, length) {
|
|
return blitBuffer(asciiToBytes(string), buf, offset, length)
|
|
}
|
|
|
|
function latin1Write (buf, string, offset, length) {
|
|
return asciiWrite(buf, string, offset, length)
|
|
}
|
|
|
|
function base64Write (buf, string, offset, length) {
|
|
return blitBuffer(base64ToBytes(string), buf, offset, length)
|
|
}
|
|
|
|
function ucs2Write (buf, string, offset, length) {
|
|
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
|
}
|
|
|
|
Buffer.prototype.write = function write (string, offset, length, encoding) {
|
|
if (offset === undefined) {
|
|
encoding = 'utf8'
|
|
length = this.length
|
|
offset = 0
|
|
} else if (length === undefined && typeof offset === 'string') {
|
|
encoding = offset
|
|
length = this.length
|
|
offset = 0
|
|
} else if (isFinite(offset)) {
|
|
offset = offset | 0
|
|
if (isFinite(length)) {
|
|
length = length | 0
|
|
if (encoding === undefined) encoding = 'utf8'
|
|
} else {
|
|
encoding = length
|
|
length = undefined
|
|
}
|
|
} else {
|
|
throw new Error(
|
|
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
|
)
|
|
}
|
|
|
|
var remaining = this.length - offset
|
|
if (length === undefined || length > remaining) length = remaining
|
|
|
|
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
|
throw new RangeError('Attempt to write outside buffer bounds')
|
|
}
|
|
|
|
if (!encoding) encoding = 'utf8'
|
|
|
|
var loweredCase = false
|
|
for (;;) {
|
|
switch (encoding) {
|
|
case 'hex':
|
|
return hexWrite(this, string, offset, length)
|
|
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return utf8Write(this, string, offset, length)
|
|
|
|
case 'ascii':
|
|
return asciiWrite(this, string, offset, length)
|
|
|
|
case 'latin1':
|
|
case 'binary':
|
|
return latin1Write(this, string, offset, length)
|
|
|
|
case 'base64':
|
|
return base64Write(this, string, offset, length)
|
|
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return ucs2Write(this, string, offset, length)
|
|
|
|
default:
|
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
encoding = ('' + encoding).toLowerCase()
|
|
loweredCase = true
|
|
}
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.toJSON = function toJSON () {
|
|
return {
|
|
type: 'Buffer',
|
|
data: Array.prototype.slice.call(this._arr || this, 0)
|
|
}
|
|
}
|
|
|
|
function base64Slice (buf, start, end) {
|
|
if (start === 0 && end === buf.length) {
|
|
return base64.fromByteArray(buf)
|
|
} else {
|
|
return base64.fromByteArray(buf.slice(start, end))
|
|
}
|
|
}
|
|
|
|
function utf8Slice (buf, start, end) {
|
|
end = Math.min(buf.length, end)
|
|
var res = []
|
|
|
|
var i = start
|
|
while (i < end) {
|
|
var firstByte = buf[i]
|
|
var codePoint = null
|
|
var bytesPerSequence = (firstByte > 0xEF) ? 4
|
|
: (firstByte > 0xDF) ? 3
|
|
: (firstByte > 0xBF) ? 2
|
|
: 1
|
|
|
|
if (i + bytesPerSequence <= end) {
|
|
var secondByte, thirdByte, fourthByte, tempCodePoint
|
|
|
|
switch (bytesPerSequence) {
|
|
case 1:
|
|
if (firstByte < 0x80) {
|
|
codePoint = firstByte
|
|
}
|
|
break
|
|
case 2:
|
|
secondByte = buf[i + 1]
|
|
if ((secondByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
|
|
if (tempCodePoint > 0x7F) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
break
|
|
case 3:
|
|
secondByte = buf[i + 1]
|
|
thirdByte = buf[i + 2]
|
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
|
|
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
break
|
|
case 4:
|
|
secondByte = buf[i + 1]
|
|
thirdByte = buf[i + 2]
|
|
fourthByte = buf[i + 3]
|
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
|
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
|
|
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
|
codePoint = tempCodePoint
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (codePoint === null) {
|
|
codePoint = 0xFFFD
|
|
bytesPerSequence = 1
|
|
} else if (codePoint > 0xFFFF) {
|
|
codePoint -= 0x10000
|
|
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
|
|
codePoint = 0xDC00 | codePoint & 0x3FF
|
|
}
|
|
|
|
res.push(codePoint)
|
|
i += bytesPerSequence
|
|
}
|
|
|
|
return decodeCodePointsArray(res)
|
|
}
|
|
|
|
var MAX_ARGUMENTS_LENGTH = 0x1000
|
|
|
|
function decodeCodePointsArray (codePoints) {
|
|
var len = codePoints.length
|
|
if (len <= MAX_ARGUMENTS_LENGTH) {
|
|
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
|
}
|
|
|
|
var res = ''
|
|
var i = 0
|
|
while (i < len) {
|
|
res += String.fromCharCode.apply(
|
|
String,
|
|
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
|
)
|
|
}
|
|
return res
|
|
}
|
|
|
|
function asciiSlice (buf, start, end) {
|
|
var ret = ''
|
|
end = Math.min(buf.length, end)
|
|
|
|
for (var i = start; i < end; ++i) {
|
|
ret += String.fromCharCode(buf[i] & 0x7F)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function latin1Slice (buf, start, end) {
|
|
var ret = ''
|
|
end = Math.min(buf.length, end)
|
|
|
|
for (var i = start; i < end; ++i) {
|
|
ret += String.fromCharCode(buf[i])
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function hexSlice (buf, start, end) {
|
|
var len = buf.length
|
|
|
|
if (!start || start < 0) start = 0
|
|
if (!end || end < 0 || end > len) end = len
|
|
|
|
var out = ''
|
|
for (var i = start; i < end; ++i) {
|
|
out += toHex(buf[i])
|
|
}
|
|
return out
|
|
}
|
|
|
|
function utf16leSlice (buf, start, end) {
|
|
var bytes = buf.slice(start, end)
|
|
var res = ''
|
|
for (var i = 0; i < bytes.length; i += 2) {
|
|
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
|
|
}
|
|
return res
|
|
}
|
|
|
|
Buffer.prototype.slice = function slice (start, end) {
|
|
var len = this.length
|
|
start = ~~start
|
|
end = end === undefined ? len : ~~end
|
|
|
|
if (start < 0) {
|
|
start += len
|
|
if (start < 0) start = 0
|
|
} else if (start > len) {
|
|
start = len
|
|
}
|
|
|
|
if (end < 0) {
|
|
end += len
|
|
if (end < 0) end = 0
|
|
} else if (end > len) {
|
|
end = len
|
|
}
|
|
|
|
if (end < start) end = start
|
|
|
|
var newBuf
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
newBuf = this.subarray(start, end)
|
|
newBuf.__proto__ = Buffer.prototype
|
|
} else {
|
|
var sliceLen = end - start
|
|
newBuf = new Buffer(sliceLen, undefined)
|
|
for (var i = 0; i < sliceLen; ++i) {
|
|
newBuf[i] = this[i + start]
|
|
}
|
|
}
|
|
|
|
return newBuf
|
|
}
|
|
|
|
|
|
function checkOffset (offset, ext, length) {
|
|
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
|
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
|
}
|
|
|
|
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var val = this[offset]
|
|
var mul = 1
|
|
var i = 0
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
val += this[offset + i] * mul
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) {
|
|
checkOffset(offset, byteLength, this.length)
|
|
}
|
|
|
|
var val = this[offset + --byteLength]
|
|
var mul = 1
|
|
while (byteLength > 0 && (mul *= 0x100)) {
|
|
val += this[offset + --byteLength] * mul
|
|
}
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
return this[offset]
|
|
}
|
|
|
|
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
return this[offset] | (this[offset + 1] << 8)
|
|
}
|
|
|
|
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
return (this[offset] << 8) | this[offset + 1]
|
|
}
|
|
|
|
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return ((this[offset]) |
|
|
(this[offset + 1] << 8) |
|
|
(this[offset + 2] << 16)) +
|
|
(this[offset + 3] * 0x1000000)
|
|
}
|
|
|
|
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset] * 0x1000000) +
|
|
((this[offset + 1] << 16) |
|
|
(this[offset + 2] << 8) |
|
|
this[offset + 3])
|
|
}
|
|
|
|
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var val = this[offset]
|
|
var mul = 1
|
|
var i = 0
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
val += this[offset + i] * mul
|
|
}
|
|
mul *= 0x80
|
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
|
|
var i = byteLength
|
|
var mul = 1
|
|
var val = this[offset + --i]
|
|
while (i > 0 && (mul *= 0x100)) {
|
|
val += this[offset + --i] * mul
|
|
}
|
|
mul *= 0x80
|
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
|
|
return val
|
|
}
|
|
|
|
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
if (!(this[offset] & 0x80)) return (this[offset])
|
|
return ((0xff - this[offset] + 1) * -1)
|
|
}
|
|
|
|
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
var val = this[offset] | (this[offset + 1] << 8)
|
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
}
|
|
|
|
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
var val = this[offset + 1] | (this[offset] << 8)
|
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
}
|
|
|
|
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset]) |
|
|
(this[offset + 1] << 8) |
|
|
(this[offset + 2] << 16) |
|
|
(this[offset + 3] << 24)
|
|
}
|
|
|
|
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
|
|
return (this[offset] << 24) |
|
|
(this[offset + 1] << 16) |
|
|
(this[offset + 2] << 8) |
|
|
(this[offset + 3])
|
|
}
|
|
|
|
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
return ieee754.read(this, offset, true, 23, 4)
|
|
}
|
|
|
|
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
return ieee754.read(this, offset, false, 23, 4)
|
|
}
|
|
|
|
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
return ieee754.read(this, offset, true, 52, 8)
|
|
}
|
|
|
|
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
|
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
return ieee754.read(this, offset, false, 52, 8)
|
|
}
|
|
|
|
function checkInt (buf, value, offset, ext, max, min) {
|
|
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
|
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
|
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
}
|
|
|
|
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) {
|
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
}
|
|
|
|
var mul = 1
|
|
var i = 0
|
|
this[offset] = value & 0xFF
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
this[offset + i] = (value / mul) & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
byteLength = byteLength | 0
|
|
if (!noAssert) {
|
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
}
|
|
|
|
var i = byteLength - 1
|
|
var mul = 1
|
|
this[offset + i] = value & 0xFF
|
|
while (--i >= 0 && (mul *= 0x100)) {
|
|
this[offset + i] = (value / mul) & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
|
|
this[offset] = (value & 0xff)
|
|
return offset + 1
|
|
}
|
|
|
|
function objectWriteUInt16 (buf, value, offset, littleEndian) {
|
|
if (value < 0) value = 0xffff + value + 1
|
|
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
|
|
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
|
|
(littleEndian ? i : 1 - i) * 8
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, true)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 8)
|
|
this[offset + 1] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, false)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
function objectWriteUInt32 (buf, value, offset, littleEndian) {
|
|
if (value < 0) value = 0xffffffff + value + 1
|
|
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
|
|
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
|
|
}
|
|
}
|
|
|
|
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset + 3] = (value >>> 24)
|
|
this[offset + 2] = (value >>> 16)
|
|
this[offset + 1] = (value >>> 8)
|
|
this[offset] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, true)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 24)
|
|
this[offset + 1] = (value >>> 16)
|
|
this[offset + 2] = (value >>> 8)
|
|
this[offset + 3] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, false)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) {
|
|
var limit = Math.pow(2, 8 * byteLength - 1)
|
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
}
|
|
|
|
var i = 0
|
|
var mul = 1
|
|
var sub = 0
|
|
this[offset] = value & 0xFF
|
|
while (++i < byteLength && (mul *= 0x100)) {
|
|
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
|
sub = 1
|
|
}
|
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) {
|
|
var limit = Math.pow(2, 8 * byteLength - 1)
|
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
}
|
|
|
|
var i = byteLength - 1
|
|
var mul = 1
|
|
var sub = 0
|
|
this[offset + i] = value & 0xFF
|
|
while (--i >= 0 && (mul *= 0x100)) {
|
|
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
|
sub = 1
|
|
}
|
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
}
|
|
|
|
return offset + byteLength
|
|
}
|
|
|
|
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
|
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
|
|
if (value < 0) value = 0xff + value + 1
|
|
this[offset] = (value & 0xff)
|
|
return offset + 1
|
|
}
|
|
|
|
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, true)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 8)
|
|
this[offset + 1] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt16(this, value, offset, false)
|
|
}
|
|
return offset + 2
|
|
}
|
|
|
|
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value & 0xff)
|
|
this[offset + 1] = (value >>> 8)
|
|
this[offset + 2] = (value >>> 16)
|
|
this[offset + 3] = (value >>> 24)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, true)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
|
value = +value
|
|
offset = offset | 0
|
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
if (value < 0) value = 0xffffffff + value + 1
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|
this[offset] = (value >>> 24)
|
|
this[offset + 1] = (value >>> 16)
|
|
this[offset + 2] = (value >>> 8)
|
|
this[offset + 3] = (value & 0xff)
|
|
} else {
|
|
objectWriteUInt32(this, value, offset, false)
|
|
}
|
|
return offset + 4
|
|
}
|
|
|
|
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
|
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
if (offset < 0) throw new RangeError('Index out of range')
|
|
}
|
|
|
|
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
|
if (!noAssert) {
|
|
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
|
}
|
|
ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
|
return offset + 4
|
|
}
|
|
|
|
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
|
return writeFloat(this, value, offset, true, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
|
return writeFloat(this, value, offset, false, noAssert)
|
|
}
|
|
|
|
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
|
if (!noAssert) {
|
|
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
|
}
|
|
ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
|
return offset + 8
|
|
}
|
|
|
|
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
|
return writeDouble(this, value, offset, true, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
|
return writeDouble(this, value, offset, false, noAssert)
|
|
}
|
|
|
|
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
|
if (!start) start = 0
|
|
if (!end && end !== 0) end = this.length
|
|
if (targetStart >= target.length) targetStart = target.length
|
|
if (!targetStart) targetStart = 0
|
|
if (end > 0 && end < start) end = start
|
|
|
|
if (end === start) return 0
|
|
if (target.length === 0 || this.length === 0) return 0
|
|
|
|
if (targetStart < 0) {
|
|
throw new RangeError('targetStart out of bounds')
|
|
}
|
|
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
|
|
if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
|
|
|
if (end > this.length) end = this.length
|
|
if (target.length - targetStart < end - start) {
|
|
end = target.length - targetStart + start
|
|
}
|
|
|
|
var len = end - start
|
|
var i
|
|
|
|
if (this === target && start < targetStart && targetStart < end) {
|
|
for (i = len - 1; i >= 0; --i) {
|
|
target[i + targetStart] = this[i + start]
|
|
}
|
|
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
|
|
for (i = 0; i < len; ++i) {
|
|
target[i + targetStart] = this[i + start]
|
|
}
|
|
} else {
|
|
Uint8Array.prototype.set.call(
|
|
target,
|
|
this.subarray(start, start + len),
|
|
targetStart
|
|
)
|
|
}
|
|
|
|
return len
|
|
}
|
|
|
|
Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
|
if (typeof val === 'string') {
|
|
if (typeof start === 'string') {
|
|
encoding = start
|
|
start = 0
|
|
end = this.length
|
|
} else if (typeof end === 'string') {
|
|
encoding = end
|
|
end = this.length
|
|
}
|
|
if (val.length === 1) {
|
|
var code = val.charCodeAt(0)
|
|
if (code < 256) {
|
|
val = code
|
|
}
|
|
}
|
|
if (encoding !== undefined && typeof encoding !== 'string') {
|
|
throw new TypeError('encoding must be a string')
|
|
}
|
|
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
|
throw new TypeError('Unknown encoding: ' + encoding)
|
|
}
|
|
} else if (typeof val === 'number') {
|
|
val = val & 255
|
|
}
|
|
|
|
if (start < 0 || this.length < start || this.length < end) {
|
|
throw new RangeError('Out of range index')
|
|
}
|
|
|
|
if (end <= start) {
|
|
return this
|
|
}
|
|
|
|
start = start >>> 0
|
|
end = end === undefined ? this.length : end >>> 0
|
|
|
|
if (!val) val = 0
|
|
|
|
var i
|
|
if (typeof val === 'number') {
|
|
for (i = start; i < end; ++i) {
|
|
this[i] = val
|
|
}
|
|
} else {
|
|
var bytes = Buffer.isBuffer(val)
|
|
? val
|
|
: utf8ToBytes(new Buffer(val, encoding).toString())
|
|
var len = bytes.length
|
|
for (i = 0; i < end - start; ++i) {
|
|
this[i + start] = bytes[i % len]
|
|
}
|
|
}
|
|
|
|
return this
|
|
}
|
|
|
|
|
|
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
|
|
|
|
function base64clean (str) {
|
|
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
|
|
if (str.length < 2) return ''
|
|
while (str.length % 4 !== 0) {
|
|
str = str + '='
|
|
}
|
|
return str
|
|
}
|
|
|
|
function stringtrim (str) {
|
|
if (str.trim) return str.trim()
|
|
return str.replace(/^\s+|\s+$/g, '')
|
|
}
|
|
|
|
function toHex (n) {
|
|
if (n < 16) return '0' + n.toString(16)
|
|
return n.toString(16)
|
|
}
|
|
|
|
function utf8ToBytes (string, units) {
|
|
units = units || Infinity
|
|
var codePoint
|
|
var length = string.length
|
|
var leadSurrogate = null
|
|
var bytes = []
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
codePoint = string.charCodeAt(i)
|
|
|
|
if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
|
if (!leadSurrogate) {
|
|
if (codePoint > 0xDBFF) {
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
continue
|
|
} else if (i + 1 === length) {
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
continue
|
|
}
|
|
|
|
leadSurrogate = codePoint
|
|
|
|
continue
|
|
}
|
|
|
|
if (codePoint < 0xDC00) {
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
leadSurrogate = codePoint
|
|
continue
|
|
}
|
|
|
|
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
|
|
} else if (leadSurrogate) {
|
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
}
|
|
|
|
leadSurrogate = null
|
|
|
|
if (codePoint < 0x80) {
|
|
if ((units -= 1) < 0) break
|
|
bytes.push(codePoint)
|
|
} else if (codePoint < 0x800) {
|
|
if ((units -= 2) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0x6 | 0xC0,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else if (codePoint < 0x10000) {
|
|
if ((units -= 3) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0xC | 0xE0,
|
|
codePoint >> 0x6 & 0x3F | 0x80,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else if (codePoint < 0x110000) {
|
|
if ((units -= 4) < 0) break
|
|
bytes.push(
|
|
codePoint >> 0x12 | 0xF0,
|
|
codePoint >> 0xC & 0x3F | 0x80,
|
|
codePoint >> 0x6 & 0x3F | 0x80,
|
|
codePoint & 0x3F | 0x80
|
|
)
|
|
} else {
|
|
throw new Error('Invalid code point')
|
|
}
|
|
}
|
|
|
|
return bytes
|
|
}
|
|
|
|
function asciiToBytes (str) {
|
|
var byteArray = []
|
|
for (var i = 0; i < str.length; ++i) {
|
|
byteArray.push(str.charCodeAt(i) & 0xFF)
|
|
}
|
|
return byteArray
|
|
}
|
|
|
|
function utf16leToBytes (str, units) {
|
|
var c, hi, lo
|
|
var byteArray = []
|
|
for (var i = 0; i < str.length; ++i) {
|
|
if ((units -= 2) < 0) break
|
|
|
|
c = str.charCodeAt(i)
|
|
hi = c >> 8
|
|
lo = c % 256
|
|
byteArray.push(lo)
|
|
byteArray.push(hi)
|
|
}
|
|
|
|
return byteArray
|
|
}
|
|
|
|
function base64ToBytes (str) {
|
|
return base64.toByteArray(base64clean(str))
|
|
}
|
|
|
|
function blitBuffer (src, dst, offset, length) {
|
|
for (var i = 0; i < length; ++i) {
|
|
if ((i + offset >= dst.length) || (i >= src.length)) break
|
|
dst[i + offset] = src[i]
|
|
}
|
|
return i
|
|
}
|
|
|
|
function isnan (val) {
|
|
return val !== val // eslint-disable-line no-self-compare
|
|
}
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"base64-js":97,"ieee754":188,"isarray":192}],131:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var Transform = require('stream').Transform
|
|
var StringDecoder = require('string_decoder').StringDecoder
|
|
var inherits = require('inherits')
|
|
|
|
function CipherBase (hashMode) {
|
|
Transform.call(this)
|
|
this.hashMode = typeof hashMode === 'string'
|
|
if (this.hashMode) {
|
|
this[hashMode] = this._finalOrDigest
|
|
} else {
|
|
this.final = this._finalOrDigest
|
|
}
|
|
if (this._final) {
|
|
this.__final = this._final
|
|
this._final = null
|
|
}
|
|
this._decoder = null
|
|
this._encoding = null
|
|
}
|
|
inherits(CipherBase, Transform)
|
|
|
|
CipherBase.prototype.update = function (data, inputEnc, outputEnc) {
|
|
if (typeof data === 'string') {
|
|
data = Buffer.from(data, inputEnc)
|
|
}
|
|
|
|
var outData = this._update(data)
|
|
if (this.hashMode) return this
|
|
|
|
if (outputEnc) {
|
|
outData = this._toString(outData, outputEnc)
|
|
}
|
|
|
|
return outData
|
|
}
|
|
|
|
CipherBase.prototype.setAutoPadding = function () {}
|
|
CipherBase.prototype.getAuthTag = function () {
|
|
throw new Error('trying to get auth tag in unsupported state')
|
|
}
|
|
|
|
CipherBase.prototype.setAuthTag = function () {
|
|
throw new Error('trying to set auth tag in unsupported state')
|
|
}
|
|
|
|
CipherBase.prototype.setAAD = function () {
|
|
throw new Error('trying to set aad in unsupported state')
|
|
}
|
|
|
|
CipherBase.prototype._transform = function (data, _, next) {
|
|
var err
|
|
try {
|
|
if (this.hashMode) {
|
|
this._update(data)
|
|
} else {
|
|
this.push(this._update(data))
|
|
}
|
|
} catch (e) {
|
|
err = e
|
|
} finally {
|
|
next(err)
|
|
}
|
|
}
|
|
CipherBase.prototype._flush = function (done) {
|
|
var err
|
|
try {
|
|
this.push(this.__final())
|
|
} catch (e) {
|
|
err = e
|
|
}
|
|
|
|
done(err)
|
|
}
|
|
CipherBase.prototype._finalOrDigest = function (outputEnc) {
|
|
var outData = this.__final() || Buffer.alloc(0)
|
|
if (outputEnc) {
|
|
outData = this._toString(outData, outputEnc, true)
|
|
}
|
|
return outData
|
|
}
|
|
|
|
CipherBase.prototype._toString = function (value, enc, fin) {
|
|
if (!this._decoder) {
|
|
this._decoder = new StringDecoder(enc)
|
|
this._encoding = enc
|
|
}
|
|
|
|
if (this._encoding !== enc) throw new Error('can\'t switch encodings')
|
|
|
|
var out = this._decoder.write(value)
|
|
if (fin) {
|
|
out += this._decoder.end()
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
module.exports = CipherBase
|
|
|
|
},{"inherits":190,"safe-buffer":305,"stream":314,"string_decoder":315}],132:[function(require,module,exports){
|
|
module.exports={
|
|
"O_RDONLY": 0,
|
|
"O_WRONLY": 1,
|
|
"O_RDWR": 2,
|
|
"S_IFMT": 61440,
|
|
"S_IFREG": 32768,
|
|
"S_IFDIR": 16384,
|
|
"S_IFCHR": 8192,
|
|
"S_IFBLK": 24576,
|
|
"S_IFIFO": 4096,
|
|
"S_IFLNK": 40960,
|
|
"S_IFSOCK": 49152,
|
|
"O_CREAT": 512,
|
|
"O_EXCL": 2048,
|
|
"O_NOCTTY": 131072,
|
|
"O_TRUNC": 1024,
|
|
"O_APPEND": 8,
|
|
"O_DIRECTORY": 1048576,
|
|
"O_NOFOLLOW": 256,
|
|
"O_SYNC": 128,
|
|
"O_SYMLINK": 2097152,
|
|
"O_NONBLOCK": 4,
|
|
"S_IRWXU": 448,
|
|
"S_IRUSR": 256,
|
|
"S_IWUSR": 128,
|
|
"S_IXUSR": 64,
|
|
"S_IRWXG": 56,
|
|
"S_IRGRP": 32,
|
|
"S_IWGRP": 16,
|
|
"S_IXGRP": 8,
|
|
"S_IRWXO": 7,
|
|
"S_IROTH": 4,
|
|
"S_IWOTH": 2,
|
|
"S_IXOTH": 1,
|
|
"E2BIG": 7,
|
|
"EACCES": 13,
|
|
"EADDRINUSE": 48,
|
|
"EADDRNOTAVAIL": 49,
|
|
"EAFNOSUPPORT": 47,
|
|
"EAGAIN": 35,
|
|
"EALREADY": 37,
|
|
"EBADF": 9,
|
|
"EBADMSG": 94,
|
|
"EBUSY": 16,
|
|
"ECANCELED": 89,
|
|
"ECHILD": 10,
|
|
"ECONNABORTED": 53,
|
|
"ECONNREFUSED": 61,
|
|
"ECONNRESET": 54,
|
|
"EDEADLK": 11,
|
|
"EDESTADDRREQ": 39,
|
|
"EDOM": 33,
|
|
"EDQUOT": 69,
|
|
"EEXIST": 17,
|
|
"EFAULT": 14,
|
|
"EFBIG": 27,
|
|
"EHOSTUNREACH": 65,
|
|
"EIDRM": 90,
|
|
"EILSEQ": 92,
|
|
"EINPROGRESS": 36,
|
|
"EINTR": 4,
|
|
"EINVAL": 22,
|
|
"EIO": 5,
|
|
"EISCONN": 56,
|
|
"EISDIR": 21,
|
|
"ELOOP": 62,
|
|
"EMFILE": 24,
|
|
"EMLINK": 31,
|
|
"EMSGSIZE": 40,
|
|
"EMULTIHOP": 95,
|
|
"ENAMETOOLONG": 63,
|
|
"ENETDOWN": 50,
|
|
"ENETRESET": 52,
|
|
"ENETUNREACH": 51,
|
|
"ENFILE": 23,
|
|
"ENOBUFS": 55,
|
|
"ENODATA": 96,
|
|
"ENODEV": 19,
|
|
"ENOENT": 2,
|
|
"ENOEXEC": 8,
|
|
"ENOLCK": 77,
|
|
"ENOLINK": 97,
|
|
"ENOMEM": 12,
|
|
"ENOMSG": 91,
|
|
"ENOPROTOOPT": 42,
|
|
"ENOSPC": 28,
|
|
"ENOSR": 98,
|
|
"ENOSTR": 99,
|
|
"ENOSYS": 78,
|
|
"ENOTCONN": 57,
|
|
"ENOTDIR": 20,
|
|
"ENOTEMPTY": 66,
|
|
"ENOTSOCK": 38,
|
|
"ENOTSUP": 45,
|
|
"ENOTTY": 25,
|
|
"ENXIO": 6,
|
|
"EOPNOTSUPP": 102,
|
|
"EOVERFLOW": 84,
|
|
"EPERM": 1,
|
|
"EPIPE": 32,
|
|
"EPROTO": 100,
|
|
"EPROTONOSUPPORT": 43,
|
|
"EPROTOTYPE": 41,
|
|
"ERANGE": 34,
|
|
"EROFS": 30,
|
|
"ESPIPE": 29,
|
|
"ESRCH": 3,
|
|
"ESTALE": 70,
|
|
"ETIME": 101,
|
|
"ETIMEDOUT": 60,
|
|
"ETXTBSY": 26,
|
|
"EWOULDBLOCK": 35,
|
|
"EXDEV": 18,
|
|
"SIGHUP": 1,
|
|
"SIGINT": 2,
|
|
"SIGQUIT": 3,
|
|
"SIGILL": 4,
|
|
"SIGTRAP": 5,
|
|
"SIGABRT": 6,
|
|
"SIGIOT": 6,
|
|
"SIGBUS": 10,
|
|
"SIGFPE": 8,
|
|
"SIGKILL": 9,
|
|
"SIGUSR1": 30,
|
|
"SIGSEGV": 11,
|
|
"SIGUSR2": 31,
|
|
"SIGPIPE": 13,
|
|
"SIGALRM": 14,
|
|
"SIGTERM": 15,
|
|
"SIGCHLD": 20,
|
|
"SIGCONT": 19,
|
|
"SIGSTOP": 17,
|
|
"SIGTSTP": 18,
|
|
"SIGTTIN": 21,
|
|
"SIGTTOU": 22,
|
|
"SIGURG": 16,
|
|
"SIGXCPU": 24,
|
|
"SIGXFSZ": 25,
|
|
"SIGVTALRM": 26,
|
|
"SIGPROF": 27,
|
|
"SIGWINCH": 28,
|
|
"SIGIO": 23,
|
|
"SIGSYS": 12,
|
|
"SSL_OP_ALL": 2147486719,
|
|
"SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION": 262144,
|
|
"SSL_OP_CIPHER_SERVER_PREFERENCE": 4194304,
|
|
"SSL_OP_CISCO_ANYCONNECT": 32768,
|
|
"SSL_OP_COOKIE_EXCHANGE": 8192,
|
|
"SSL_OP_CRYPTOPRO_TLSEXT_BUG": 2147483648,
|
|
"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS": 2048,
|
|
"SSL_OP_EPHEMERAL_RSA": 0,
|
|
"SSL_OP_LEGACY_SERVER_CONNECT": 4,
|
|
"SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER": 32,
|
|
"SSL_OP_MICROSOFT_SESS_ID_BUG": 1,
|
|
"SSL_OP_MSIE_SSLV2_RSA_PADDING": 0,
|
|
"SSL_OP_NETSCAPE_CA_DN_BUG": 536870912,
|
|
"SSL_OP_NETSCAPE_CHALLENGE_BUG": 2,
|
|
"SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG": 1073741824,
|
|
"SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG": 8,
|
|
"SSL_OP_NO_COMPRESSION": 131072,
|
|
"SSL_OP_NO_QUERY_MTU": 4096,
|
|
"SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION": 65536,
|
|
"SSL_OP_NO_SSLv2": 16777216,
|
|
"SSL_OP_NO_SSLv3": 33554432,
|
|
"SSL_OP_NO_TICKET": 16384,
|
|
"SSL_OP_NO_TLSv1": 67108864,
|
|
"SSL_OP_NO_TLSv1_1": 268435456,
|
|
"SSL_OP_NO_TLSv1_2": 134217728,
|
|
"SSL_OP_PKCS1_CHECK_1": 0,
|
|
"SSL_OP_PKCS1_CHECK_2": 0,
|
|
"SSL_OP_SINGLE_DH_USE": 1048576,
|
|
"SSL_OP_SINGLE_ECDH_USE": 524288,
|
|
"SSL_OP_SSLEAY_080_CLIENT_DH_BUG": 128,
|
|
"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG": 0,
|
|
"SSL_OP_TLS_BLOCK_PADDING_BUG": 512,
|
|
"SSL_OP_TLS_D5_BUG": 256,
|
|
"SSL_OP_TLS_ROLLBACK_BUG": 8388608,
|
|
"ENGINE_METHOD_DSA": 2,
|
|
"ENGINE_METHOD_DH": 4,
|
|
"ENGINE_METHOD_RAND": 8,
|
|
"ENGINE_METHOD_ECDH": 16,
|
|
"ENGINE_METHOD_ECDSA": 32,
|
|
"ENGINE_METHOD_CIPHERS": 64,
|
|
"ENGINE_METHOD_DIGESTS": 128,
|
|
"ENGINE_METHOD_STORE": 256,
|
|
"ENGINE_METHOD_PKEY_METHS": 512,
|
|
"ENGINE_METHOD_PKEY_ASN1_METHS": 1024,
|
|
"ENGINE_METHOD_ALL": 65535,
|
|
"ENGINE_METHOD_NONE": 0,
|
|
"DH_CHECK_P_NOT_SAFE_PRIME": 2,
|
|
"DH_CHECK_P_NOT_PRIME": 1,
|
|
"DH_UNABLE_TO_CHECK_GENERATOR": 4,
|
|
"DH_NOT_SUITABLE_GENERATOR": 8,
|
|
"NPN_ENABLED": 1,
|
|
"RSA_PKCS1_PADDING": 1,
|
|
"RSA_SSLV23_PADDING": 2,
|
|
"RSA_NO_PADDING": 3,
|
|
"RSA_PKCS1_OAEP_PADDING": 4,
|
|
"RSA_X931_PADDING": 5,
|
|
"RSA_PKCS1_PSS_PADDING": 6,
|
|
"POINT_CONVERSION_COMPRESSED": 2,
|
|
"POINT_CONVERSION_UNCOMPRESSED": 4,
|
|
"POINT_CONVERSION_HYBRID": 6,
|
|
"F_OK": 0,
|
|
"R_OK": 4,
|
|
"W_OK": 2,
|
|
"X_OK": 1,
|
|
"UV_UDP_REUSEADDR": 4
|
|
}
|
|
|
|
},{}],133:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
function isArray(arg) {
|
|
if (Array.isArray) {
|
|
return Array.isArray(arg);
|
|
}
|
|
return objectToString(arg) === '[object Array]';
|
|
}
|
|
exports.isArray = isArray;
|
|
|
|
function isBoolean(arg) {
|
|
return typeof arg === 'boolean';
|
|
}
|
|
exports.isBoolean = isBoolean;
|
|
|
|
function isNull(arg) {
|
|
return arg === null;
|
|
}
|
|
exports.isNull = isNull;
|
|
|
|
function isNullOrUndefined(arg) {
|
|
return arg == null;
|
|
}
|
|
exports.isNullOrUndefined = isNullOrUndefined;
|
|
|
|
function isNumber(arg) {
|
|
return typeof arg === 'number';
|
|
}
|
|
exports.isNumber = isNumber;
|
|
|
|
function isString(arg) {
|
|
return typeof arg === 'string';
|
|
}
|
|
exports.isString = isString;
|
|
|
|
function isSymbol(arg) {
|
|
return typeof arg === 'symbol';
|
|
}
|
|
exports.isSymbol = isSymbol;
|
|
|
|
function isUndefined(arg) {
|
|
return arg === void 0;
|
|
}
|
|
exports.isUndefined = isUndefined;
|
|
|
|
function isRegExp(re) {
|
|
return objectToString(re) === '[object RegExp]';
|
|
}
|
|
exports.isRegExp = isRegExp;
|
|
|
|
function isObject(arg) {
|
|
return typeof arg === 'object' && arg !== null;
|
|
}
|
|
exports.isObject = isObject;
|
|
|
|
function isDate(d) {
|
|
return objectToString(d) === '[object Date]';
|
|
}
|
|
exports.isDate = isDate;
|
|
|
|
function isError(e) {
|
|
return (objectToString(e) === '[object Error]' || e instanceof Error);
|
|
}
|
|
exports.isError = isError;
|
|
|
|
function isFunction(arg) {
|
|
return typeof arg === 'function';
|
|
}
|
|
exports.isFunction = isFunction;
|
|
|
|
function isPrimitive(arg) {
|
|
return arg === null ||
|
|
typeof arg === 'boolean' ||
|
|
typeof arg === 'number' ||
|
|
typeof arg === 'string' ||
|
|
typeof arg === 'symbol' || // ES6 symbol
|
|
typeof arg === 'undefined';
|
|
}
|
|
exports.isPrimitive = isPrimitive;
|
|
|
|
exports.isBuffer = Buffer.isBuffer;
|
|
|
|
function objectToString(o) {
|
|
return Object.prototype.toString.call(o);
|
|
}
|
|
|
|
}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
|
|
},{"../../is-buffer/index.js":191}],134:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var elliptic = require('elliptic');
|
|
var BN = require('bn.js');
|
|
|
|
module.exports = function createECDH(curve) {
|
|
return new ECDH(curve);
|
|
};
|
|
|
|
var aliases = {
|
|
secp256k1: {
|
|
name: 'secp256k1',
|
|
byteLength: 32
|
|
},
|
|
secp224r1: {
|
|
name: 'p224',
|
|
byteLength: 28
|
|
},
|
|
prime256v1: {
|
|
name: 'p256',
|
|
byteLength: 32
|
|
},
|
|
prime192v1: {
|
|
name: 'p192',
|
|
byteLength: 24
|
|
},
|
|
ed25519: {
|
|
name: 'ed25519',
|
|
byteLength: 32
|
|
},
|
|
secp384r1: {
|
|
name: 'p384',
|
|
byteLength: 48
|
|
},
|
|
secp521r1: {
|
|
name: 'p521',
|
|
byteLength: 66
|
|
}
|
|
};
|
|
|
|
aliases.p224 = aliases.secp224r1;
|
|
aliases.p256 = aliases.secp256r1 = aliases.prime256v1;
|
|
aliases.p192 = aliases.secp192r1 = aliases.prime192v1;
|
|
aliases.p384 = aliases.secp384r1;
|
|
aliases.p521 = aliases.secp521r1;
|
|
|
|
function ECDH(curve) {
|
|
this.curveType = aliases[curve];
|
|
if (!this.curveType ) {
|
|
this.curveType = {
|
|
name: curve
|
|
};
|
|
}
|
|
this.curve = new elliptic.ec(this.curveType.name);
|
|
this.keys = void 0;
|
|
}
|
|
|
|
ECDH.prototype.generateKeys = function (enc, format) {
|
|
this.keys = this.curve.genKeyPair();
|
|
return this.getPublicKey(enc, format);
|
|
};
|
|
|
|
ECDH.prototype.computeSecret = function (other, inenc, enc) {
|
|
inenc = inenc || 'utf8';
|
|
if (!Buffer.isBuffer(other)) {
|
|
other = new Buffer(other, inenc);
|
|
}
|
|
var otherPub = this.curve.keyFromPublic(other).getPublic();
|
|
var out = otherPub.mul(this.keys.getPrivate()).getX();
|
|
return formatReturnValue(out, enc, this.curveType.byteLength);
|
|
};
|
|
|
|
ECDH.prototype.getPublicKey = function (enc, format) {
|
|
var key = this.keys.getPublic(format === 'compressed', true);
|
|
if (format === 'hybrid') {
|
|
if (key[key.length - 1] % 2) {
|
|
key[0] = 7;
|
|
} else {
|
|
key [0] = 6;
|
|
}
|
|
}
|
|
return formatReturnValue(key, enc);
|
|
};
|
|
|
|
ECDH.prototype.getPrivateKey = function (enc) {
|
|
return formatReturnValue(this.keys.getPrivate(), enc);
|
|
};
|
|
|
|
ECDH.prototype.setPublicKey = function (pub, enc) {
|
|
enc = enc || 'utf8';
|
|
if (!Buffer.isBuffer(pub)) {
|
|
pub = new Buffer(pub, enc);
|
|
}
|
|
this.keys._importPublic(pub);
|
|
return this;
|
|
};
|
|
|
|
ECDH.prototype.setPrivateKey = function (priv, enc) {
|
|
enc = enc || 'utf8';
|
|
if (!Buffer.isBuffer(priv)) {
|
|
priv = new Buffer(priv, enc);
|
|
}
|
|
var _priv = new BN(priv);
|
|
_priv = _priv.toString(16);
|
|
this.keys._importPrivate(_priv);
|
|
return this;
|
|
};
|
|
|
|
function formatReturnValue(bn, enc, len) {
|
|
if (!Array.isArray(bn)) {
|
|
bn = bn.toArray();
|
|
}
|
|
var buf = new Buffer(bn);
|
|
if (len && buf.length < len) {
|
|
var zeros = new Buffer(len - buf.length);
|
|
zeros.fill(0);
|
|
buf = Buffer.concat([zeros, buf]);
|
|
}
|
|
if (!enc) {
|
|
return buf;
|
|
} else {
|
|
return buf.toString(enc);
|
|
}
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"bn.js":98,"buffer":130,"elliptic":156}],135:[function(require,module,exports){
|
|
(function (Buffer){
|
|
'use strict'
|
|
var inherits = require('inherits')
|
|
var md5 = require('./md5')
|
|
var RIPEMD160 = require('ripemd160')
|
|
var sha = require('sha.js')
|
|
|
|
var Base = require('cipher-base')
|
|
|
|
function HashNoConstructor (hash) {
|
|
Base.call(this, 'digest')
|
|
|
|
this._hash = hash
|
|
this.buffers = []
|
|
}
|
|
|
|
inherits(HashNoConstructor, Base)
|
|
|
|
HashNoConstructor.prototype._update = function (data) {
|
|
this.buffers.push(data)
|
|
}
|
|
|
|
HashNoConstructor.prototype._final = function () {
|
|
var buf = Buffer.concat(this.buffers)
|
|
var r = this._hash(buf)
|
|
this.buffers = null
|
|
|
|
return r
|
|
}
|
|
|
|
function Hash (hash) {
|
|
Base.call(this, 'digest')
|
|
|
|
this._hash = hash
|
|
}
|
|
|
|
inherits(Hash, Base)
|
|
|
|
Hash.prototype._update = function (data) {
|
|
this._hash.update(data)
|
|
}
|
|
|
|
Hash.prototype._final = function () {
|
|
return this._hash.digest()
|
|
}
|
|
|
|
module.exports = function createHash (alg) {
|
|
alg = alg.toLowerCase()
|
|
if (alg === 'md5') return new HashNoConstructor(md5)
|
|
if (alg === 'rmd160' || alg === 'ripemd160') return new Hash(new RIPEMD160())
|
|
|
|
return new Hash(sha(alg))
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./md5":137,"buffer":130,"cipher-base":131,"inherits":190,"ripemd160":304,"sha.js":307}],136:[function(require,module,exports){
|
|
(function (Buffer){
|
|
'use strict'
|
|
var intSize = 4
|
|
var zeroBuffer = new Buffer(intSize)
|
|
zeroBuffer.fill(0)
|
|
|
|
var charSize = 8
|
|
var hashSize = 16
|
|
|
|
function toArray (buf) {
|
|
if ((buf.length % intSize) !== 0) {
|
|
var len = buf.length + (intSize - (buf.length % intSize))
|
|
buf = Buffer.concat([buf, zeroBuffer], len)
|
|
}
|
|
|
|
var arr = new Array(buf.length >>> 2)
|
|
for (var i = 0, j = 0; i < buf.length; i += intSize, j++) {
|
|
arr[j] = buf.readInt32LE(i)
|
|
}
|
|
|
|
return arr
|
|
}
|
|
|
|
module.exports = function hash (buf, fn) {
|
|
var arr = fn(toArray(buf), buf.length * charSize)
|
|
buf = new Buffer(hashSize)
|
|
for (var i = 0; i < arr.length; i++) {
|
|
buf.writeInt32LE(arr[i], i << 2, true)
|
|
}
|
|
return buf
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130}],137:[function(require,module,exports){
|
|
'use strict'
|
|
|
|
|
|
var makeHash = require('./make-hash')
|
|
|
|
|
|
function core_md5 (x, len) {
|
|
|
|
x[len >> 5] |= 0x80 << ((len) % 32)
|
|
x[(((len + 64) >>> 9) << 4) + 14] = len
|
|
|
|
var a = 1732584193
|
|
var b = -271733879
|
|
var c = -1732584194
|
|
var d = 271733878
|
|
|
|
for (var i = 0; i < x.length; i += 16) {
|
|
var olda = a
|
|
var oldb = b
|
|
var oldc = c
|
|
var oldd = d
|
|
|
|
a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936)
|
|
d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586)
|
|
c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819)
|
|
b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330)
|
|
a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897)
|
|
d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426)
|
|
c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341)
|
|
b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983)
|
|
a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416)
|
|
d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417)
|
|
c = md5_ff(c, d, a, b, x[i + 10], 17, -42063)
|
|
b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162)
|
|
a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682)
|
|
d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101)
|
|
c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290)
|
|
b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329)
|
|
|
|
a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510)
|
|
d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632)
|
|
c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713)
|
|
b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302)
|
|
a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691)
|
|
d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083)
|
|
c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335)
|
|
b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848)
|
|
a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438)
|
|
d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690)
|
|
c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961)
|
|
b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501)
|
|
a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467)
|
|
d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784)
|
|
c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473)
|
|
b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734)
|
|
|
|
a = md5_hh(a, b, c, d, x[i + 5], 4, -378558)
|
|
d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463)
|
|
c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562)
|
|
b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556)
|
|
a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060)
|
|
d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353)
|
|
c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632)
|
|
b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640)
|
|
a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174)
|
|
d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222)
|
|
c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979)
|
|
b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189)
|
|
a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487)
|
|
d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835)
|
|
c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520)
|
|
b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651)
|
|
|
|
a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844)
|
|
d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415)
|
|
c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905)
|
|
b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055)
|
|
a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571)
|
|
d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606)
|
|
c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523)
|
|
b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799)
|
|
a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359)
|
|
d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744)
|
|
c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380)
|
|
b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649)
|
|
a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070)
|
|
d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379)
|
|
c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259)
|
|
b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551)
|
|
|
|
a = safe_add(a, olda)
|
|
b = safe_add(b, oldb)
|
|
c = safe_add(c, oldc)
|
|
d = safe_add(d, oldd)
|
|
}
|
|
|
|
return [a, b, c, d]
|
|
}
|
|
|
|
|
|
function md5_cmn (q, a, b, x, s, t) {
|
|
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)
|
|
}
|
|
|
|
function md5_ff (a, b, c, d, x, s, t) {
|
|
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t)
|
|
}
|
|
|
|
function md5_gg (a, b, c, d, x, s, t) {
|
|
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t)
|
|
}
|
|
|
|
function md5_hh (a, b, c, d, x, s, t) {
|
|
return md5_cmn(b ^ c ^ d, a, b, x, s, t)
|
|
}
|
|
|
|
function md5_ii (a, b, c, d, x, s, t) {
|
|
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t)
|
|
}
|
|
|
|
|
|
function safe_add (x, y) {
|
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF)
|
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
|
|
return (msw << 16) | (lsw & 0xFFFF)
|
|
}
|
|
|
|
|
|
function bit_rol (num, cnt) {
|
|
return (num << cnt) | (num >>> (32 - cnt))
|
|
}
|
|
|
|
module.exports = function md5 (buf) {
|
|
return makeHash(buf, core_md5)
|
|
}
|
|
|
|
},{"./make-hash":136}],138:[function(require,module,exports){
|
|
'use strict'
|
|
var inherits = require('inherits')
|
|
var Legacy = require('./legacy')
|
|
var Base = require('cipher-base')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var md5 = require('create-hash/md5')
|
|
var RIPEMD160 = require('ripemd160')
|
|
|
|
var sha = require('sha.js')
|
|
|
|
var ZEROS = Buffer.alloc(128)
|
|
|
|
function Hmac (alg, key) {
|
|
Base.call(this, 'digest')
|
|
if (typeof key === 'string') {
|
|
key = Buffer.from(key)
|
|
}
|
|
|
|
var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64
|
|
|
|
this._alg = alg
|
|
this._key = key
|
|
if (key.length > blocksize) {
|
|
var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg)
|
|
key = hash.update(key).digest()
|
|
} else if (key.length < blocksize) {
|
|
key = Buffer.concat([key, ZEROS], blocksize)
|
|
}
|
|
|
|
var ipad = this._ipad = Buffer.allocUnsafe(blocksize)
|
|
var opad = this._opad = Buffer.allocUnsafe(blocksize)
|
|
|
|
for (var i = 0; i < blocksize; i++) {
|
|
ipad[i] = key[i] ^ 0x36
|
|
opad[i] = key[i] ^ 0x5C
|
|
}
|
|
this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg)
|
|
this._hash.update(ipad)
|
|
}
|
|
|
|
inherits(Hmac, Base)
|
|
|
|
Hmac.prototype._update = function (data) {
|
|
this._hash.update(data)
|
|
}
|
|
|
|
Hmac.prototype._final = function () {
|
|
var h = this._hash.digest()
|
|
var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg)
|
|
return hash.update(this._opad).update(h).digest()
|
|
}
|
|
|
|
module.exports = function createHmac (alg, key) {
|
|
alg = alg.toLowerCase()
|
|
if (alg === 'rmd160' || alg === 'ripemd160') {
|
|
return new Hmac('rmd160', key)
|
|
}
|
|
if (alg === 'md5') {
|
|
return new Legacy(md5, key)
|
|
}
|
|
return new Hmac(alg, key)
|
|
}
|
|
|
|
},{"./legacy":139,"cipher-base":131,"create-hash/md5":137,"inherits":190,"ripemd160":304,"safe-buffer":305,"sha.js":307}],139:[function(require,module,exports){
|
|
'use strict'
|
|
var inherits = require('inherits')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var Base = require('cipher-base')
|
|
|
|
var ZEROS = Buffer.alloc(128)
|
|
var blocksize = 64
|
|
|
|
function Hmac (alg, key) {
|
|
Base.call(this, 'digest')
|
|
if (typeof key === 'string') {
|
|
key = Buffer.from(key)
|
|
}
|
|
|
|
this._alg = alg
|
|
this._key = key
|
|
|
|
if (key.length > blocksize) {
|
|
key = alg(key)
|
|
} else if (key.length < blocksize) {
|
|
key = Buffer.concat([key, ZEROS], blocksize)
|
|
}
|
|
|
|
var ipad = this._ipad = Buffer.allocUnsafe(blocksize)
|
|
var opad = this._opad = Buffer.allocUnsafe(blocksize)
|
|
|
|
for (var i = 0; i < blocksize; i++) {
|
|
ipad[i] = key[i] ^ 0x36
|
|
opad[i] = key[i] ^ 0x5C
|
|
}
|
|
|
|
this._hash = [ipad]
|
|
}
|
|
|
|
inherits(Hmac, Base)
|
|
|
|
Hmac.prototype._update = function (data) {
|
|
this._hash.push(data)
|
|
}
|
|
|
|
Hmac.prototype._final = function () {
|
|
var h = this._alg(Buffer.concat(this._hash))
|
|
return this._alg(Buffer.concat([this._opad, h]))
|
|
}
|
|
module.exports = Hmac
|
|
|
|
},{"cipher-base":131,"inherits":190,"safe-buffer":305}],140:[function(require,module,exports){
|
|
var Buffer = require('buffer').Buffer;
|
|
var intSize = 4;
|
|
var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0);
|
|
var chrsz = 8;
|
|
|
|
function toArray(buf, bigEndian) {
|
|
if ((buf.length % intSize) !== 0) {
|
|
var len = buf.length + (intSize - (buf.length % intSize));
|
|
buf = Buffer.concat([buf, zeroBuffer], len);
|
|
}
|
|
|
|
var arr = [];
|
|
var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE;
|
|
for (var i = 0; i < buf.length; i += intSize) {
|
|
arr.push(fn.call(buf, i));
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
function toBuffer(arr, size, bigEndian) {
|
|
var buf = new Buffer(size);
|
|
var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE;
|
|
for (var i = 0; i < arr.length; i++) {
|
|
fn.call(buf, arr[i], i * 4, true);
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
function hash(buf, fn, hashSize, bigEndian) {
|
|
if (!Buffer.isBuffer(buf)) buf = new Buffer(buf);
|
|
var arr = fn(toArray(buf, bigEndian), buf.length * chrsz);
|
|
return toBuffer(arr, hashSize, bigEndian);
|
|
}
|
|
|
|
module.exports = { hash: hash };
|
|
|
|
},{"buffer":130}],141:[function(require,module,exports){
|
|
var Buffer = require('buffer').Buffer
|
|
var sha = require('./sha')
|
|
var sha256 = require('./sha256')
|
|
var rng = require('./rng')
|
|
var md5 = require('./md5')
|
|
|
|
var algorithms = {
|
|
sha1: sha,
|
|
sha256: sha256,
|
|
md5: md5
|
|
}
|
|
|
|
var blocksize = 64
|
|
var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(0)
|
|
function hmac(fn, key, data) {
|
|
if(!Buffer.isBuffer(key)) key = new Buffer(key)
|
|
if(!Buffer.isBuffer(data)) data = new Buffer(data)
|
|
|
|
if(key.length > blocksize) {
|
|
key = fn(key)
|
|
} else if(key.length < blocksize) {
|
|
key = Buffer.concat([key, zeroBuffer], blocksize)
|
|
}
|
|
|
|
var ipad = new Buffer(blocksize), opad = new Buffer(blocksize)
|
|
for(var i = 0; i < blocksize; i++) {
|
|
ipad[i] = key[i] ^ 0x36
|
|
opad[i] = key[i] ^ 0x5C
|
|
}
|
|
|
|
var hash = fn(Buffer.concat([ipad, data]))
|
|
return fn(Buffer.concat([opad, hash]))
|
|
}
|
|
|
|
function hash(alg, key) {
|
|
alg = alg || 'sha1'
|
|
var fn = algorithms[alg]
|
|
var bufs = []
|
|
var length = 0
|
|
if(!fn) error('algorithm:', alg, 'is not yet supported')
|
|
return {
|
|
update: function (data) {
|
|
if(!Buffer.isBuffer(data)) data = new Buffer(data)
|
|
|
|
bufs.push(data)
|
|
length += data.length
|
|
return this
|
|
},
|
|
digest: function (enc) {
|
|
var buf = Buffer.concat(bufs)
|
|
var r = key ? hmac(fn, key, buf) : fn(buf)
|
|
bufs = null
|
|
return enc ? r.toString(enc) : r
|
|
}
|
|
}
|
|
}
|
|
|
|
function error () {
|
|
var m = [].slice.call(arguments).join(' ')
|
|
throw new Error([
|
|
m,
|
|
'we accept pull requests',
|
|
'http://github.com/dominictarr/crypto-browserify'
|
|
].join('\n'))
|
|
}
|
|
|
|
exports.createHash = function (alg) { return hash(alg) }
|
|
exports.createHmac = function (alg, key) { return hash(alg, key) }
|
|
exports.randomBytes = function(size, callback) {
|
|
if (callback && callback.call) {
|
|
try {
|
|
callback.call(this, undefined, new Buffer(rng(size)))
|
|
} catch (err) { callback(err) }
|
|
} else {
|
|
return new Buffer(rng(size))
|
|
}
|
|
}
|
|
|
|
function each(a, f) {
|
|
for(var i in a)
|
|
f(a[i], i)
|
|
}
|
|
|
|
each(['createCredentials'
|
|
, 'createCipher'
|
|
, 'createCipheriv'
|
|
, 'createDecipher'
|
|
, 'createDecipheriv'
|
|
, 'createSign'
|
|
, 'createVerify'
|
|
, 'createDiffieHellman'
|
|
, 'pbkdf2'], function (name) {
|
|
exports[name] = function () {
|
|
error('sorry,', name, 'is not implemented yet')
|
|
}
|
|
})
|
|
|
|
},{"./md5":142,"./rng":143,"./sha":144,"./sha256":145,"buffer":130}],142:[function(require,module,exports){
|
|
|
|
|
|
var helpers = require('./helpers');
|
|
|
|
|
|
function md5_vm_test()
|
|
{
|
|
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
|
|
}
|
|
|
|
|
|
function core_md5(x, len)
|
|
{
|
|
|
|
x[len >> 5] |= 0x80 << ((len) % 32);
|
|
x[(((len + 64) >>> 9) << 4) + 14] = len;
|
|
|
|
var a = 1732584193;
|
|
var b = -271733879;
|
|
var c = -1732584194;
|
|
var d = 271733878;
|
|
|
|
for(var i = 0; i < x.length; i += 16)
|
|
{
|
|
var olda = a;
|
|
var oldb = b;
|
|
var oldc = c;
|
|
var oldd = d;
|
|
|
|
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
|
|
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
|
|
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
|
|
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
|
|
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
|
|
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
|
|
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
|
|
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
|
|
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
|
|
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
|
|
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
|
|
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
|
|
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
|
|
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
|
|
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
|
|
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
|
|
|
|
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
|
|
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
|
|
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
|
|
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
|
|
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
|
|
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
|
|
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
|
|
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
|
|
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
|
|
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
|
|
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
|
|
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
|
|
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
|
|
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
|
|
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
|
|
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
|
|
|
|
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
|
|
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
|
|
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
|
|
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
|
|
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
|
|
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
|
|
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
|
|
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
|
|
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
|
|
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
|
|
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
|
|
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
|
|
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
|
|
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
|
|
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
|
|
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
|
|
|
|
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
|
|
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
|
|
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
|
|
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
|
|
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
|
|
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
|
|
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
|
|
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
|
|
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
|
|
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
|
|
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
|
|
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
|
|
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
|
|
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
|
|
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
|
|
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
|
|
|
|
a = safe_add(a, olda);
|
|
b = safe_add(b, oldb);
|
|
c = safe_add(c, oldc);
|
|
d = safe_add(d, oldd);
|
|
}
|
|
return Array(a, b, c, d);
|
|
|
|
}
|
|
|
|
|
|
function md5_cmn(q, a, b, x, s, t)
|
|
{
|
|
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
|
|
}
|
|
function md5_ff(a, b, c, d, x, s, t)
|
|
{
|
|
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
|
|
}
|
|
function md5_gg(a, b, c, d, x, s, t)
|
|
{
|
|
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
|
|
}
|
|
function md5_hh(a, b, c, d, x, s, t)
|
|
{
|
|
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
|
|
}
|
|
function md5_ii(a, b, c, d, x, s, t)
|
|
{
|
|
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
|
|
}
|
|
|
|
|
|
function safe_add(x, y)
|
|
{
|
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
return (msw << 16) | (lsw & 0xFFFF);
|
|
}
|
|
|
|
|
|
function bit_rol(num, cnt)
|
|
{
|
|
return (num << cnt) | (num >>> (32 - cnt));
|
|
}
|
|
|
|
module.exports = function md5(buf) {
|
|
return helpers.hash(buf, core_md5, 16);
|
|
};
|
|
|
|
},{"./helpers":140}],143:[function(require,module,exports){
|
|
(function() {
|
|
var _global = this;
|
|
|
|
var mathRNG, whatwgRNG;
|
|
|
|
mathRNG = function(size) {
|
|
var bytes = new Array(size);
|
|
var r;
|
|
|
|
for (var i = 0, r; i < size; i++) {
|
|
if ((i & 0x03) == 0) r = Math.random() * 0x100000000;
|
|
bytes[i] = r >>> ((i & 0x03) << 3) & 0xff;
|
|
}
|
|
|
|
return bytes;
|
|
}
|
|
|
|
if (_global.crypto && crypto.getRandomValues) {
|
|
whatwgRNG = function(size) {
|
|
var bytes = new Uint8Array(size);
|
|
crypto.getRandomValues(bytes);
|
|
return bytes;
|
|
}
|
|
}
|
|
|
|
module.exports = whatwgRNG || mathRNG;
|
|
|
|
}())
|
|
|
|
},{}],144:[function(require,module,exports){
|
|
|
|
|
|
var helpers = require('./helpers');
|
|
|
|
|
|
function core_sha1(x, len)
|
|
{
|
|
|
|
x[len >> 5] |= 0x80 << (24 - len % 32);
|
|
x[((len + 64 >> 9) << 4) + 15] = len;
|
|
|
|
var w = Array(80);
|
|
var a = 1732584193;
|
|
var b = -271733879;
|
|
var c = -1732584194;
|
|
var d = 271733878;
|
|
var e = -1009589776;
|
|
|
|
for(var i = 0; i < x.length; i += 16)
|
|
{
|
|
var olda = a;
|
|
var oldb = b;
|
|
var oldc = c;
|
|
var oldd = d;
|
|
var olde = e;
|
|
|
|
for(var j = 0; j < 80; j++)
|
|
{
|
|
if(j < 16) w[j] = x[i + j];
|
|
else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
|
|
var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
|
|
safe_add(safe_add(e, w[j]), sha1_kt(j)));
|
|
e = d;
|
|
d = c;
|
|
c = rol(b, 30);
|
|
b = a;
|
|
a = t;
|
|
}
|
|
|
|
a = safe_add(a, olda);
|
|
b = safe_add(b, oldb);
|
|
c = safe_add(c, oldc);
|
|
d = safe_add(d, oldd);
|
|
e = safe_add(e, olde);
|
|
}
|
|
return Array(a, b, c, d, e);
|
|
|
|
}
|
|
|
|
|
|
function sha1_ft(t, b, c, d)
|
|
{
|
|
if(t < 20) return (b & c) | ((~b) & d);
|
|
if(t < 40) return b ^ c ^ d;
|
|
if(t < 60) return (b & c) | (b & d) | (c & d);
|
|
return b ^ c ^ d;
|
|
}
|
|
|
|
|
|
function sha1_kt(t)
|
|
{
|
|
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
|
|
(t < 60) ? -1894007588 : -899497514;
|
|
}
|
|
|
|
|
|
function safe_add(x, y)
|
|
{
|
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
return (msw << 16) | (lsw & 0xFFFF);
|
|
}
|
|
|
|
|
|
function rol(num, cnt)
|
|
{
|
|
return (num << cnt) | (num >>> (32 - cnt));
|
|
}
|
|
|
|
module.exports = function sha1(buf) {
|
|
return helpers.hash(buf, core_sha1, 20, true);
|
|
};
|
|
|
|
},{"./helpers":140}],145:[function(require,module,exports){
|
|
|
|
|
|
|
|
var helpers = require('./helpers');
|
|
|
|
var safe_add = function(x, y) {
|
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
|
return (msw << 16) | (lsw & 0xFFFF);
|
|
};
|
|
|
|
var S = function(X, n) {
|
|
return (X >>> n) | (X << (32 - n));
|
|
};
|
|
|
|
var R = function(X, n) {
|
|
return (X >>> n);
|
|
};
|
|
|
|
var Ch = function(x, y, z) {
|
|
return ((x & y) ^ ((~x) & z));
|
|
};
|
|
|
|
var Maj = function(x, y, z) {
|
|
return ((x & y) ^ (x & z) ^ (y & z));
|
|
};
|
|
|
|
var Sigma0256 = function(x) {
|
|
return (S(x, 2) ^ S(x, 13) ^ S(x, 22));
|
|
};
|
|
|
|
var Sigma1256 = function(x) {
|
|
return (S(x, 6) ^ S(x, 11) ^ S(x, 25));
|
|
};
|
|
|
|
var Gamma0256 = function(x) {
|
|
return (S(x, 7) ^ S(x, 18) ^ R(x, 3));
|
|
};
|
|
|
|
var Gamma1256 = function(x) {
|
|
return (S(x, 17) ^ S(x, 19) ^ R(x, 10));
|
|
};
|
|
|
|
var core_sha256 = function(m, l) {
|
|
var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
|
|
var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
|
|
var W = new Array(64);
|
|
var a, b, c, d, e, f, g, h, i, j;
|
|
var T1, T2;
|
|
|
|
m[l >> 5] |= 0x80 << (24 - l % 32);
|
|
m[((l + 64 >> 9) << 4) + 15] = l;
|
|
for (var i = 0; i < m.length; i += 16) {
|
|
a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7];
|
|
for (var j = 0; j < 64; j++) {
|
|
if (j < 16) {
|
|
W[j] = m[j + i];
|
|
} else {
|
|
W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
|
|
}
|
|
T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
|
|
T2 = safe_add(Sigma0256(a), Maj(a, b, c));
|
|
h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
|
|
}
|
|
HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]);
|
|
HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
|
|
}
|
|
return HASH;
|
|
};
|
|
|
|
module.exports = function sha256(buf) {
|
|
return helpers.hash(buf, core_sha256, 32, true);
|
|
};
|
|
|
|
},{"./helpers":140}],146:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
exports.utils = require('./des/utils');
|
|
exports.Cipher = require('./des/cipher');
|
|
exports.DES = require('./des/des');
|
|
exports.CBC = require('./des/cbc');
|
|
exports.EDE = require('./des/ede');
|
|
|
|
},{"./des/cbc":147,"./des/cipher":148,"./des/des":149,"./des/ede":150,"./des/utils":151}],147:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var assert = require('minimalistic-assert');
|
|
var inherits = require('inherits');
|
|
|
|
var proto = {};
|
|
|
|
function CBCState(iv) {
|
|
assert.equal(iv.length, 8, 'Invalid IV length');
|
|
|
|
this.iv = new Array(8);
|
|
for (var i = 0; i < this.iv.length; i++)
|
|
this.iv[i] = iv[i];
|
|
}
|
|
|
|
function instantiate(Base) {
|
|
function CBC(options) {
|
|
Base.call(this, options);
|
|
this._cbcInit();
|
|
}
|
|
inherits(CBC, Base);
|
|
|
|
var keys = Object.keys(proto);
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var key = keys[i];
|
|
CBC.prototype[key] = proto[key];
|
|
}
|
|
|
|
CBC.create = function create(options) {
|
|
return new CBC(options);
|
|
};
|
|
|
|
return CBC;
|
|
}
|
|
|
|
exports.instantiate = instantiate;
|
|
|
|
proto._cbcInit = function _cbcInit() {
|
|
var state = new CBCState(this.options.iv);
|
|
this._cbcState = state;
|
|
};
|
|
|
|
proto._update = function _update(inp, inOff, out, outOff) {
|
|
var state = this._cbcState;
|
|
var superProto = this.constructor.super_.prototype;
|
|
|
|
var iv = state.iv;
|
|
if (this.type === 'encrypt') {
|
|
for (var i = 0; i < this.blockSize; i++)
|
|
iv[i] ^= inp[inOff + i];
|
|
|
|
superProto._update.call(this, iv, 0, out, outOff);
|
|
|
|
for (var i = 0; i < this.blockSize; i++)
|
|
iv[i] = out[outOff + i];
|
|
} else {
|
|
superProto._update.call(this, inp, inOff, out, outOff);
|
|
|
|
for (var i = 0; i < this.blockSize; i++)
|
|
out[outOff + i] ^= iv[i];
|
|
|
|
for (var i = 0; i < this.blockSize; i++)
|
|
iv[i] = inp[inOff + i];
|
|
}
|
|
};
|
|
|
|
},{"inherits":190,"minimalistic-assert":245}],148:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var assert = require('minimalistic-assert');
|
|
|
|
function Cipher(options) {
|
|
this.options = options;
|
|
|
|
this.type = this.options.type;
|
|
this.blockSize = 8;
|
|
this._init();
|
|
|
|
this.buffer = new Array(this.blockSize);
|
|
this.bufferOff = 0;
|
|
}
|
|
module.exports = Cipher;
|
|
|
|
Cipher.prototype._init = function _init() {
|
|
};
|
|
|
|
Cipher.prototype.update = function update(data) {
|
|
if (data.length === 0)
|
|
return [];
|
|
|
|
if (this.type === 'decrypt')
|
|
return this._updateDecrypt(data);
|
|
else
|
|
return this._updateEncrypt(data);
|
|
};
|
|
|
|
Cipher.prototype._buffer = function _buffer(data, off) {
|
|
var min = Math.min(this.buffer.length - this.bufferOff, data.length - off);
|
|
for (var i = 0; i < min; i++)
|
|
this.buffer[this.bufferOff + i] = data[off + i];
|
|
this.bufferOff += min;
|
|
|
|
return min;
|
|
};
|
|
|
|
Cipher.prototype._flushBuffer = function _flushBuffer(out, off) {
|
|
this._update(this.buffer, 0, out, off);
|
|
this.bufferOff = 0;
|
|
return this.blockSize;
|
|
};
|
|
|
|
Cipher.prototype._updateEncrypt = function _updateEncrypt(data) {
|
|
var inputOff = 0;
|
|
var outputOff = 0;
|
|
|
|
var count = ((this.bufferOff + data.length) / this.blockSize) | 0;
|
|
var out = new Array(count * this.blockSize);
|
|
|
|
if (this.bufferOff !== 0) {
|
|
inputOff += this._buffer(data, inputOff);
|
|
|
|
if (this.bufferOff === this.buffer.length)
|
|
outputOff += this._flushBuffer(out, outputOff);
|
|
}
|
|
|
|
var max = data.length - ((data.length - inputOff) % this.blockSize);
|
|
for (; inputOff < max; inputOff += this.blockSize) {
|
|
this._update(data, inputOff, out, outputOff);
|
|
outputOff += this.blockSize;
|
|
}
|
|
|
|
for (; inputOff < data.length; inputOff++, this.bufferOff++)
|
|
this.buffer[this.bufferOff] = data[inputOff];
|
|
|
|
return out;
|
|
};
|
|
|
|
Cipher.prototype._updateDecrypt = function _updateDecrypt(data) {
|
|
var inputOff = 0;
|
|
var outputOff = 0;
|
|
|
|
var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1;
|
|
var out = new Array(count * this.blockSize);
|
|
|
|
for (; count > 0; count--) {
|
|
inputOff += this._buffer(data, inputOff);
|
|
outputOff += this._flushBuffer(out, outputOff);
|
|
}
|
|
|
|
inputOff += this._buffer(data, inputOff);
|
|
|
|
return out;
|
|
};
|
|
|
|
Cipher.prototype.final = function final(buffer) {
|
|
var first;
|
|
if (buffer)
|
|
first = this.update(buffer);
|
|
|
|
var last;
|
|
if (this.type === 'encrypt')
|
|
last = this._finalEncrypt();
|
|
else
|
|
last = this._finalDecrypt();
|
|
|
|
if (first)
|
|
return first.concat(last);
|
|
else
|
|
return last;
|
|
};
|
|
|
|
Cipher.prototype._pad = function _pad(buffer, off) {
|
|
if (off === 0)
|
|
return false;
|
|
|
|
while (off < buffer.length)
|
|
buffer[off++] = 0;
|
|
|
|
return true;
|
|
};
|
|
|
|
Cipher.prototype._finalEncrypt = function _finalEncrypt() {
|
|
if (!this._pad(this.buffer, this.bufferOff))
|
|
return [];
|
|
|
|
var out = new Array(this.blockSize);
|
|
this._update(this.buffer, 0, out, 0);
|
|
return out;
|
|
};
|
|
|
|
Cipher.prototype._unpad = function _unpad(buffer) {
|
|
return buffer;
|
|
};
|
|
|
|
Cipher.prototype._finalDecrypt = function _finalDecrypt() {
|
|
assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt');
|
|
var out = new Array(this.blockSize);
|
|
this._flushBuffer(out, 0);
|
|
|
|
return this._unpad(out);
|
|
};
|
|
|
|
},{"minimalistic-assert":245}],149:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var assert = require('minimalistic-assert');
|
|
var inherits = require('inherits');
|
|
|
|
var des = require('../des');
|
|
var utils = des.utils;
|
|
var Cipher = des.Cipher;
|
|
|
|
function DESState() {
|
|
this.tmp = new Array(2);
|
|
this.keys = null;
|
|
}
|
|
|
|
function DES(options) {
|
|
Cipher.call(this, options);
|
|
|
|
var state = new DESState();
|
|
this._desState = state;
|
|
|
|
this.deriveKeys(state, options.key);
|
|
}
|
|
inherits(DES, Cipher);
|
|
module.exports = DES;
|
|
|
|
DES.create = function create(options) {
|
|
return new DES(options);
|
|
};
|
|
|
|
var shiftTable = [
|
|
1, 1, 2, 2, 2, 2, 2, 2,
|
|
1, 2, 2, 2, 2, 2, 2, 1
|
|
];
|
|
|
|
DES.prototype.deriveKeys = function deriveKeys(state, key) {
|
|
state.keys = new Array(16 * 2);
|
|
|
|
assert.equal(key.length, this.blockSize, 'Invalid key length');
|
|
|
|
var kL = utils.readUInt32BE(key, 0);
|
|
var kR = utils.readUInt32BE(key, 4);
|
|
|
|
utils.pc1(kL, kR, state.tmp, 0);
|
|
kL = state.tmp[0];
|
|
kR = state.tmp[1];
|
|
for (var i = 0; i < state.keys.length; i += 2) {
|
|
var shift = shiftTable[i >>> 1];
|
|
kL = utils.r28shl(kL, shift);
|
|
kR = utils.r28shl(kR, shift);
|
|
utils.pc2(kL, kR, state.keys, i);
|
|
}
|
|
};
|
|
|
|
DES.prototype._update = function _update(inp, inOff, out, outOff) {
|
|
var state = this._desState;
|
|
|
|
var l = utils.readUInt32BE(inp, inOff);
|
|
var r = utils.readUInt32BE(inp, inOff + 4);
|
|
|
|
utils.ip(l, r, state.tmp, 0);
|
|
l = state.tmp[0];
|
|
r = state.tmp[1];
|
|
|
|
if (this.type === 'encrypt')
|
|
this._encrypt(state, l, r, state.tmp, 0);
|
|
else
|
|
this._decrypt(state, l, r, state.tmp, 0);
|
|
|
|
l = state.tmp[0];
|
|
r = state.tmp[1];
|
|
|
|
utils.writeUInt32BE(out, l, outOff);
|
|
utils.writeUInt32BE(out, r, outOff + 4);
|
|
};
|
|
|
|
DES.prototype._pad = function _pad(buffer, off) {
|
|
var value = buffer.length - off;
|
|
for (var i = off; i < buffer.length; i++)
|
|
buffer[i] = value;
|
|
|
|
return true;
|
|
};
|
|
|
|
DES.prototype._unpad = function _unpad(buffer) {
|
|
var pad = buffer[buffer.length - 1];
|
|
for (var i = buffer.length - pad; i < buffer.length; i++)
|
|
assert.equal(buffer[i], pad);
|
|
|
|
return buffer.slice(0, buffer.length - pad);
|
|
};
|
|
|
|
DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) {
|
|
var l = lStart;
|
|
var r = rStart;
|
|
|
|
for (var i = 0; i < state.keys.length; i += 2) {
|
|
var keyL = state.keys[i];
|
|
var keyR = state.keys[i + 1];
|
|
|
|
utils.expand(r, state.tmp, 0);
|
|
|
|
keyL ^= state.tmp[0];
|
|
keyR ^= state.tmp[1];
|
|
var s = utils.substitute(keyL, keyR);
|
|
var f = utils.permute(s);
|
|
|
|
var t = r;
|
|
r = (l ^ f) >>> 0;
|
|
l = t;
|
|
}
|
|
|
|
utils.rip(r, l, out, off);
|
|
};
|
|
|
|
DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) {
|
|
var l = rStart;
|
|
var r = lStart;
|
|
|
|
for (var i = state.keys.length - 2; i >= 0; i -= 2) {
|
|
var keyL = state.keys[i];
|
|
var keyR = state.keys[i + 1];
|
|
|
|
utils.expand(l, state.tmp, 0);
|
|
|
|
keyL ^= state.tmp[0];
|
|
keyR ^= state.tmp[1];
|
|
var s = utils.substitute(keyL, keyR);
|
|
var f = utils.permute(s);
|
|
|
|
var t = l;
|
|
l = (r ^ f) >>> 0;
|
|
r = t;
|
|
}
|
|
|
|
utils.rip(l, r, out, off);
|
|
};
|
|
|
|
},{"../des":146,"inherits":190,"minimalistic-assert":245}],150:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var assert = require('minimalistic-assert');
|
|
var inherits = require('inherits');
|
|
|
|
var des = require('../des');
|
|
var Cipher = des.Cipher;
|
|
var DES = des.DES;
|
|
|
|
function EDEState(type, key) {
|
|
assert.equal(key.length, 24, 'Invalid key length');
|
|
|
|
var k1 = key.slice(0, 8);
|
|
var k2 = key.slice(8, 16);
|
|
var k3 = key.slice(16, 24);
|
|
|
|
if (type === 'encrypt') {
|
|
this.ciphers = [
|
|
DES.create({ type: 'encrypt', key: k1 }),
|
|
DES.create({ type: 'decrypt', key: k2 }),
|
|
DES.create({ type: 'encrypt', key: k3 })
|
|
];
|
|
} else {
|
|
this.ciphers = [
|
|
DES.create({ type: 'decrypt', key: k3 }),
|
|
DES.create({ type: 'encrypt', key: k2 }),
|
|
DES.create({ type: 'decrypt', key: k1 })
|
|
];
|
|
}
|
|
}
|
|
|
|
function EDE(options) {
|
|
Cipher.call(this, options);
|
|
|
|
var state = new EDEState(this.type, this.options.key);
|
|
this._edeState = state;
|
|
}
|
|
inherits(EDE, Cipher);
|
|
|
|
module.exports = EDE;
|
|
|
|
EDE.create = function create(options) {
|
|
return new EDE(options);
|
|
};
|
|
|
|
EDE.prototype._update = function _update(inp, inOff, out, outOff) {
|
|
var state = this._edeState;
|
|
|
|
state.ciphers[0]._update(inp, inOff, out, outOff);
|
|
state.ciphers[1]._update(out, outOff, out, outOff);
|
|
state.ciphers[2]._update(out, outOff, out, outOff);
|
|
};
|
|
|
|
EDE.prototype._pad = DES.prototype._pad;
|
|
EDE.prototype._unpad = DES.prototype._unpad;
|
|
|
|
},{"../des":146,"inherits":190,"minimalistic-assert":245}],151:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
exports.readUInt32BE = function readUInt32BE(bytes, off) {
|
|
var res = (bytes[0 + off] << 24) |
|
|
(bytes[1 + off] << 16) |
|
|
(bytes[2 + off] << 8) |
|
|
bytes[3 + off];
|
|
return res >>> 0;
|
|
};
|
|
|
|
exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) {
|
|
bytes[0 + off] = value >>> 24;
|
|
bytes[1 + off] = (value >>> 16) & 0xff;
|
|
bytes[2 + off] = (value >>> 8) & 0xff;
|
|
bytes[3 + off] = value & 0xff;
|
|
};
|
|
|
|
exports.ip = function ip(inL, inR, out, off) {
|
|
var outL = 0;
|
|
var outR = 0;
|
|
|
|
for (var i = 6; i >= 0; i -= 2) {
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outL <<= 1;
|
|
outL |= (inR >>> (j + i)) & 1;
|
|
}
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outL <<= 1;
|
|
outL |= (inL >>> (j + i)) & 1;
|
|
}
|
|
}
|
|
|
|
for (var i = 6; i >= 0; i -= 2) {
|
|
for (var j = 1; j <= 25; j += 8) {
|
|
outR <<= 1;
|
|
outR |= (inR >>> (j + i)) & 1;
|
|
}
|
|
for (var j = 1; j <= 25; j += 8) {
|
|
outR <<= 1;
|
|
outR |= (inL >>> (j + i)) & 1;
|
|
}
|
|
}
|
|
|
|
out[off + 0] = outL >>> 0;
|
|
out[off + 1] = outR >>> 0;
|
|
};
|
|
|
|
exports.rip = function rip(inL, inR, out, off) {
|
|
var outL = 0;
|
|
var outR = 0;
|
|
|
|
for (var i = 0; i < 4; i++) {
|
|
for (var j = 24; j >= 0; j -= 8) {
|
|
outL <<= 1;
|
|
outL |= (inR >>> (j + i)) & 1;
|
|
outL <<= 1;
|
|
outL |= (inL >>> (j + i)) & 1;
|
|
}
|
|
}
|
|
for (var i = 4; i < 8; i++) {
|
|
for (var j = 24; j >= 0; j -= 8) {
|
|
outR <<= 1;
|
|
outR |= (inR >>> (j + i)) & 1;
|
|
outR <<= 1;
|
|
outR |= (inL >>> (j + i)) & 1;
|
|
}
|
|
}
|
|
|
|
out[off + 0] = outL >>> 0;
|
|
out[off + 1] = outR >>> 0;
|
|
};
|
|
|
|
exports.pc1 = function pc1(inL, inR, out, off) {
|
|
var outL = 0;
|
|
var outR = 0;
|
|
|
|
for (var i = 7; i >= 5; i--) {
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outL <<= 1;
|
|
outL |= (inR >> (j + i)) & 1;
|
|
}
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outL <<= 1;
|
|
outL |= (inL >> (j + i)) & 1;
|
|
}
|
|
}
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outL <<= 1;
|
|
outL |= (inR >> (j + i)) & 1;
|
|
}
|
|
|
|
for (var i = 1; i <= 3; i++) {
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outR <<= 1;
|
|
outR |= (inR >> (j + i)) & 1;
|
|
}
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outR <<= 1;
|
|
outR |= (inL >> (j + i)) & 1;
|
|
}
|
|
}
|
|
for (var j = 0; j <= 24; j += 8) {
|
|
outR <<= 1;
|
|
outR |= (inL >> (j + i)) & 1;
|
|
}
|
|
|
|
out[off + 0] = outL >>> 0;
|
|
out[off + 1] = outR >>> 0;
|
|
};
|
|
|
|
exports.r28shl = function r28shl(num, shift) {
|
|
return ((num << shift) & 0xfffffff) | (num >>> (28 - shift));
|
|
};
|
|
|
|
var pc2table = [
|
|
14, 11, 17, 4, 27, 23, 25, 0,
|
|
13, 22, 7, 18, 5, 9, 16, 24,
|
|
2, 20, 12, 21, 1, 8, 15, 26,
|
|
|
|
15, 4, 25, 19, 9, 1, 26, 16,
|
|
5, 11, 23, 8, 12, 7, 17, 0,
|
|
22, 3, 10, 14, 6, 20, 27, 24
|
|
];
|
|
|
|
exports.pc2 = function pc2(inL, inR, out, off) {
|
|
var outL = 0;
|
|
var outR = 0;
|
|
|
|
var len = pc2table.length >>> 1;
|
|
for (var i = 0; i < len; i++) {
|
|
outL <<= 1;
|
|
outL |= (inL >>> pc2table[i]) & 0x1;
|
|
}
|
|
for (var i = len; i < pc2table.length; i++) {
|
|
outR <<= 1;
|
|
outR |= (inR >>> pc2table[i]) & 0x1;
|
|
}
|
|
|
|
out[off + 0] = outL >>> 0;
|
|
out[off + 1] = outR >>> 0;
|
|
};
|
|
|
|
exports.expand = function expand(r, out, off) {
|
|
var outL = 0;
|
|
var outR = 0;
|
|
|
|
outL = ((r & 1) << 5) | (r >>> 27);
|
|
for (var i = 23; i >= 15; i -= 4) {
|
|
outL <<= 6;
|
|
outL |= (r >>> i) & 0x3f;
|
|
}
|
|
for (var i = 11; i >= 3; i -= 4) {
|
|
outR |= (r >>> i) & 0x3f;
|
|
outR <<= 6;
|
|
}
|
|
outR |= ((r & 0x1f) << 1) | (r >>> 31);
|
|
|
|
out[off + 0] = outL >>> 0;
|
|
out[off + 1] = outR >>> 0;
|
|
};
|
|
|
|
var sTable = [
|
|
14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
|
|
3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
|
|
4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
|
|
15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13,
|
|
|
|
15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
|
|
9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
|
|
0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
|
|
5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9,
|
|
|
|
10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
|
|
1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
|
|
13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
|
|
11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12,
|
|
|
|
7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
|
|
1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
|
|
10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
|
|
15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14,
|
|
|
|
2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
|
|
8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
|
|
4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
|
|
15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3,
|
|
|
|
12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
|
|
0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
|
|
9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
|
|
7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13,
|
|
|
|
4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
|
|
3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
|
|
1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
|
|
10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12,
|
|
|
|
13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
|
|
10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
|
|
7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
|
|
0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
|
|
];
|
|
|
|
exports.substitute = function substitute(inL, inR) {
|
|
var out = 0;
|
|
for (var i = 0; i < 4; i++) {
|
|
var b = (inL >>> (18 - i * 6)) & 0x3f;
|
|
var sb = sTable[i * 0x40 + b];
|
|
|
|
out <<= 4;
|
|
out |= sb;
|
|
}
|
|
for (var i = 0; i < 4; i++) {
|
|
var b = (inR >>> (18 - i * 6)) & 0x3f;
|
|
var sb = sTable[4 * 0x40 + i * 0x40 + b];
|
|
|
|
out <<= 4;
|
|
out |= sb;
|
|
}
|
|
return out >>> 0;
|
|
};
|
|
|
|
var permuteTable = [
|
|
16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22,
|
|
30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7
|
|
];
|
|
|
|
exports.permute = function permute(num) {
|
|
var out = 0;
|
|
for (var i = 0; i < permuteTable.length; i++) {
|
|
out <<= 1;
|
|
out |= (num >>> permuteTable[i]) & 0x1;
|
|
}
|
|
return out >>> 0;
|
|
};
|
|
|
|
exports.padSplit = function padSplit(num, size, group) {
|
|
var str = num.toString(2);
|
|
while (str.length < size)
|
|
str = '0' + str;
|
|
|
|
var out = [];
|
|
for (var i = 0; i < size; i += group)
|
|
out.push(str.slice(i, i + group));
|
|
return out.join(' ');
|
|
};
|
|
|
|
},{}],152:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var generatePrime = require('./lib/generatePrime')
|
|
var primes = require('./lib/primes.json')
|
|
|
|
var DH = require('./lib/dh')
|
|
|
|
function getDiffieHellman (mod) {
|
|
var prime = new Buffer(primes[mod].prime, 'hex')
|
|
var gen = new Buffer(primes[mod].gen, 'hex')
|
|
|
|
return new DH(prime, gen)
|
|
}
|
|
|
|
var ENCODINGS = {
|
|
'binary': true, 'hex': true, 'base64': true
|
|
}
|
|
|
|
function createDiffieHellman (prime, enc, generator, genc) {
|
|
if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) {
|
|
return createDiffieHellman(prime, 'binary', enc, generator)
|
|
}
|
|
|
|
enc = enc || 'binary'
|
|
genc = genc || 'binary'
|
|
generator = generator || new Buffer([2])
|
|
|
|
if (!Buffer.isBuffer(generator)) {
|
|
generator = new Buffer(generator, genc)
|
|
}
|
|
|
|
if (typeof prime === 'number') {
|
|
return new DH(generatePrime(prime, generator), generator, true)
|
|
}
|
|
|
|
if (!Buffer.isBuffer(prime)) {
|
|
prime = new Buffer(prime, enc)
|
|
}
|
|
|
|
return new DH(prime, generator, true)
|
|
}
|
|
|
|
exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman
|
|
exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./lib/dh":153,"./lib/generatePrime":154,"./lib/primes.json":155,"buffer":130}],153:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var BN = require('bn.js');
|
|
var MillerRabin = require('miller-rabin');
|
|
var millerRabin = new MillerRabin();
|
|
var TWENTYFOUR = new BN(24);
|
|
var ELEVEN = new BN(11);
|
|
var TEN = new BN(10);
|
|
var THREE = new BN(3);
|
|
var SEVEN = new BN(7);
|
|
var primes = require('./generatePrime');
|
|
var randomBytes = require('randombytes');
|
|
module.exports = DH;
|
|
|
|
function setPublicKey(pub, enc) {
|
|
enc = enc || 'utf8';
|
|
if (!Buffer.isBuffer(pub)) {
|
|
pub = new Buffer(pub, enc);
|
|
}
|
|
this._pub = new BN(pub);
|
|
return this;
|
|
}
|
|
|
|
function setPrivateKey(priv, enc) {
|
|
enc = enc || 'utf8';
|
|
if (!Buffer.isBuffer(priv)) {
|
|
priv = new Buffer(priv, enc);
|
|
}
|
|
this._priv = new BN(priv);
|
|
return this;
|
|
}
|
|
|
|
var primeCache = {};
|
|
function checkPrime(prime, generator) {
|
|
var gen = generator.toString('hex');
|
|
var hex = [gen, prime.toString(16)].join('_');
|
|
if (hex in primeCache) {
|
|
return primeCache[hex];
|
|
}
|
|
var error = 0;
|
|
|
|
if (prime.isEven() ||
|
|
!primes.simpleSieve ||
|
|
!primes.fermatTest(prime) ||
|
|
!millerRabin.test(prime)) {
|
|
error += 1;
|
|
|
|
if (gen === '02' || gen === '05') {
|
|
error += 8;
|
|
} else {
|
|
error += 4;
|
|
}
|
|
primeCache[hex] = error;
|
|
return error;
|
|
}
|
|
if (!millerRabin.test(prime.shrn(1))) {
|
|
error += 2;
|
|
}
|
|
var rem;
|
|
switch (gen) {
|
|
case '02':
|
|
if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) {
|
|
error += 8;
|
|
}
|
|
break;
|
|
case '05':
|
|
rem = prime.mod(TEN);
|
|
if (rem.cmp(THREE) && rem.cmp(SEVEN)) {
|
|
error += 8;
|
|
}
|
|
break;
|
|
default:
|
|
error += 4;
|
|
}
|
|
primeCache[hex] = error;
|
|
return error;
|
|
}
|
|
|
|
function DH(prime, generator, malleable) {
|
|
this.setGenerator(generator);
|
|
this.__prime = new BN(prime);
|
|
this._prime = BN.mont(this.__prime);
|
|
this._primeLen = prime.length;
|
|
this._pub = undefined;
|
|
this._priv = undefined;
|
|
this._primeCode = undefined;
|
|
if (malleable) {
|
|
this.setPublicKey = setPublicKey;
|
|
this.setPrivateKey = setPrivateKey;
|
|
} else {
|
|
this._primeCode = 8;
|
|
}
|
|
}
|
|
Object.defineProperty(DH.prototype, 'verifyError', {
|
|
enumerable: true,
|
|
get: function () {
|
|
if (typeof this._primeCode !== 'number') {
|
|
this._primeCode = checkPrime(this.__prime, this.__gen);
|
|
}
|
|
return this._primeCode;
|
|
}
|
|
});
|
|
DH.prototype.generateKeys = function () {
|
|
if (!this._priv) {
|
|
this._priv = new BN(randomBytes(this._primeLen));
|
|
}
|
|
this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed();
|
|
return this.getPublicKey();
|
|
};
|
|
|
|
DH.prototype.computeSecret = function (other) {
|
|
other = new BN(other);
|
|
other = other.toRed(this._prime);
|
|
var secret = other.redPow(this._priv).fromRed();
|
|
var out = new Buffer(secret.toArray());
|
|
var prime = this.getPrime();
|
|
if (out.length < prime.length) {
|
|
var front = new Buffer(prime.length - out.length);
|
|
front.fill(0);
|
|
out = Buffer.concat([front, out]);
|
|
}
|
|
return out;
|
|
};
|
|
|
|
DH.prototype.getPublicKey = function getPublicKey(enc) {
|
|
return formatReturnValue(this._pub, enc);
|
|
};
|
|
|
|
DH.prototype.getPrivateKey = function getPrivateKey(enc) {
|
|
return formatReturnValue(this._priv, enc);
|
|
};
|
|
|
|
DH.prototype.getPrime = function (enc) {
|
|
return formatReturnValue(this.__prime, enc);
|
|
};
|
|
|
|
DH.prototype.getGenerator = function (enc) {
|
|
return formatReturnValue(this._gen, enc);
|
|
};
|
|
|
|
DH.prototype.setGenerator = function (gen, enc) {
|
|
enc = enc || 'utf8';
|
|
if (!Buffer.isBuffer(gen)) {
|
|
gen = new Buffer(gen, enc);
|
|
}
|
|
this.__gen = gen;
|
|
this._gen = new BN(gen);
|
|
return this;
|
|
};
|
|
|
|
function formatReturnValue(bn, enc) {
|
|
var buf = new Buffer(bn.toArray());
|
|
if (!enc) {
|
|
return buf;
|
|
} else {
|
|
return buf.toString(enc);
|
|
}
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./generatePrime":154,"bn.js":98,"buffer":130,"miller-rabin":244,"randombytes":288}],154:[function(require,module,exports){
|
|
var randomBytes = require('randombytes');
|
|
module.exports = findPrime;
|
|
findPrime.simpleSieve = simpleSieve;
|
|
findPrime.fermatTest = fermatTest;
|
|
var BN = require('bn.js');
|
|
var TWENTYFOUR = new BN(24);
|
|
var MillerRabin = require('miller-rabin');
|
|
var millerRabin = new MillerRabin();
|
|
var ONE = new BN(1);
|
|
var TWO = new BN(2);
|
|
var FIVE = new BN(5);
|
|
var SIXTEEN = new BN(16);
|
|
var EIGHT = new BN(8);
|
|
var TEN = new BN(10);
|
|
var THREE = new BN(3);
|
|
var SEVEN = new BN(7);
|
|
var ELEVEN = new BN(11);
|
|
var FOUR = new BN(4);
|
|
var TWELVE = new BN(12);
|
|
var primes = null;
|
|
|
|
function _getPrimes() {
|
|
if (primes !== null)
|
|
return primes;
|
|
|
|
var limit = 0x100000;
|
|
var res = [];
|
|
res[0] = 2;
|
|
for (var i = 1, k = 3; k < limit; k += 2) {
|
|
var sqrt = Math.ceil(Math.sqrt(k));
|
|
for (var j = 0; j < i && res[j] <= sqrt; j++)
|
|
if (k % res[j] === 0)
|
|
break;
|
|
|
|
if (i !== j && res[j] <= sqrt)
|
|
continue;
|
|
|
|
res[i++] = k;
|
|
}
|
|
primes = res;
|
|
return res;
|
|
}
|
|
|
|
function simpleSieve(p) {
|
|
var primes = _getPrimes();
|
|
|
|
for (var i = 0; i < primes.length; i++)
|
|
if (p.modn(primes[i]) === 0) {
|
|
if (p.cmpn(primes[i]) === 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function fermatTest(p) {
|
|
var red = BN.mont(p);
|
|
return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0;
|
|
}
|
|
|
|
function findPrime(bits, gen) {
|
|
if (bits < 16) {
|
|
if (gen === 2 || gen === 5) {
|
|
return new BN([0x8c, 0x7b]);
|
|
} else {
|
|
return new BN([0x8c, 0x27]);
|
|
}
|
|
}
|
|
gen = new BN(gen);
|
|
|
|
var num, n2;
|
|
|
|
while (true) {
|
|
num = new BN(randomBytes(Math.ceil(bits / 8)));
|
|
while (num.bitLength() > bits) {
|
|
num.ishrn(1);
|
|
}
|
|
if (num.isEven()) {
|
|
num.iadd(ONE);
|
|
}
|
|
if (!num.testn(1)) {
|
|
num.iadd(TWO);
|
|
}
|
|
if (!gen.cmp(TWO)) {
|
|
while (num.mod(TWENTYFOUR).cmp(ELEVEN)) {
|
|
num.iadd(FOUR);
|
|
}
|
|
} else if (!gen.cmp(FIVE)) {
|
|
while (num.mod(TEN).cmp(THREE)) {
|
|
num.iadd(FOUR);
|
|
}
|
|
}
|
|
n2 = num.shrn(1);
|
|
if (simpleSieve(n2) && simpleSieve(num) &&
|
|
fermatTest(n2) && fermatTest(num) &&
|
|
millerRabin.test(n2) && millerRabin.test(num)) {
|
|
return num;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
},{"bn.js":98,"miller-rabin":244,"randombytes":288}],155:[function(require,module,exports){
|
|
module.exports={
|
|
"modp1": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"
|
|
},
|
|
"modp2": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"
|
|
},
|
|
"modp5": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"
|
|
},
|
|
"modp14": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"
|
|
},
|
|
"modp15": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"
|
|
},
|
|
"modp16": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"
|
|
},
|
|
"modp17": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"
|
|
},
|
|
"modp18": {
|
|
"gen": "02",
|
|
"prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"
|
|
}
|
|
}
|
|
},{}],156:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var elliptic = exports;
|
|
|
|
elliptic.version = require('../package.json').version;
|
|
elliptic.utils = require('./elliptic/utils');
|
|
elliptic.rand = require('brorand');
|
|
elliptic.curve = require('./elliptic/curve');
|
|
elliptic.curves = require('./elliptic/curves');
|
|
|
|
elliptic.ec = require('./elliptic/ec');
|
|
elliptic.eddsa = require('./elliptic/eddsa');
|
|
|
|
},{"../package.json":171,"./elliptic/curve":159,"./elliptic/curves":162,"./elliptic/ec":163,"./elliptic/eddsa":166,"./elliptic/utils":170,"brorand":99}],157:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var BN = require('bn.js');
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var getNAF = utils.getNAF;
|
|
var getJSF = utils.getJSF;
|
|
var assert = utils.assert;
|
|
|
|
function BaseCurve(type, conf) {
|
|
this.type = type;
|
|
this.p = new BN(conf.p, 16);
|
|
|
|
this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
|
|
|
|
this.zero = new BN(0).toRed(this.red);
|
|
this.one = new BN(1).toRed(this.red);
|
|
this.two = new BN(2).toRed(this.red);
|
|
|
|
this.n = conf.n && new BN(conf.n, 16);
|
|
this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
|
|
|
|
this._wnafT1 = new Array(4);
|
|
this._wnafT2 = new Array(4);
|
|
this._wnafT3 = new Array(4);
|
|
this._wnafT4 = new Array(4);
|
|
|
|
var adjustCount = this.n && this.p.div(this.n);
|
|
if (!adjustCount || adjustCount.cmpn(100) > 0) {
|
|
this.redN = null;
|
|
} else {
|
|
this._maxwellTrick = true;
|
|
this.redN = this.n.toRed(this.red);
|
|
}
|
|
}
|
|
module.exports = BaseCurve;
|
|
|
|
BaseCurve.prototype.point = function point() {
|
|
throw new Error('Not implemented');
|
|
};
|
|
|
|
BaseCurve.prototype.validate = function validate() {
|
|
throw new Error('Not implemented');
|
|
};
|
|
|
|
BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
|
|
assert(p.precomputed);
|
|
var doubles = p._getDoubles();
|
|
|
|
var naf = getNAF(k, 1);
|
|
var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1);
|
|
I /= 3;
|
|
|
|
var repr = [];
|
|
for (var j = 0; j < naf.length; j += doubles.step) {
|
|
var nafW = 0;
|
|
for (var k = j + doubles.step - 1; k >= j; k--)
|
|
nafW = (nafW << 1) + naf[k];
|
|
repr.push(nafW);
|
|
}
|
|
|
|
var a = this.jpoint(null, null, null);
|
|
var b = this.jpoint(null, null, null);
|
|
for (var i = I; i > 0; i--) {
|
|
for (var j = 0; j < repr.length; j++) {
|
|
var nafW = repr[j];
|
|
if (nafW === i)
|
|
b = b.mixedAdd(doubles.points[j]);
|
|
else if (nafW === -i)
|
|
b = b.mixedAdd(doubles.points[j].neg());
|
|
}
|
|
a = a.add(b);
|
|
}
|
|
return a.toP();
|
|
};
|
|
|
|
BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
|
|
var w = 4;
|
|
|
|
var nafPoints = p._getNAFPoints(w);
|
|
w = nafPoints.wnd;
|
|
var wnd = nafPoints.points;
|
|
|
|
var naf = getNAF(k, w);
|
|
|
|
var acc = this.jpoint(null, null, null);
|
|
for (var i = naf.length - 1; i >= 0; i--) {
|
|
for (var k = 0; i >= 0 && naf[i] === 0; i--)
|
|
k++;
|
|
if (i >= 0)
|
|
k++;
|
|
acc = acc.dblp(k);
|
|
|
|
if (i < 0)
|
|
break;
|
|
var z = naf[i];
|
|
assert(z !== 0);
|
|
if (p.type === 'affine') {
|
|
if (z > 0)
|
|
acc = acc.mixedAdd(wnd[(z - 1) >> 1]);
|
|
else
|
|
acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg());
|
|
} else {
|
|
if (z > 0)
|
|
acc = acc.add(wnd[(z - 1) >> 1]);
|
|
else
|
|
acc = acc.add(wnd[(-z - 1) >> 1].neg());
|
|
}
|
|
}
|
|
return p.type === 'affine' ? acc.toP() : acc;
|
|
};
|
|
|
|
BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW,
|
|
points,
|
|
coeffs,
|
|
len,
|
|
jacobianResult) {
|
|
var wndWidth = this._wnafT1;
|
|
var wnd = this._wnafT2;
|
|
var naf = this._wnafT3;
|
|
|
|
var max = 0;
|
|
for (var i = 0; i < len; i++) {
|
|
var p = points[i];
|
|
var nafPoints = p._getNAFPoints(defW);
|
|
wndWidth[i] = nafPoints.wnd;
|
|
wnd[i] = nafPoints.points;
|
|
}
|
|
|
|
for (var i = len - 1; i >= 1; i -= 2) {
|
|
var a = i - 1;
|
|
var b = i;
|
|
if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
|
|
naf[a] = getNAF(coeffs[a], wndWidth[a]);
|
|
naf[b] = getNAF(coeffs[b], wndWidth[b]);
|
|
max = Math.max(naf[a].length, max);
|
|
max = Math.max(naf[b].length, max);
|
|
continue;
|
|
}
|
|
|
|
var comb = [
|
|
points[a], /* 1 */
|
|
null, /* 3 */
|
|
null, /* 5 */
|
|
points[b] /* 7 */
|
|
];
|
|
|
|
if (points[a].y.cmp(points[b].y) === 0) {
|
|
comb[1] = points[a].add(points[b]);
|
|
comb[2] = points[a].toJ().mixedAdd(points[b].neg());
|
|
} else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
|
|
comb[1] = points[a].toJ().mixedAdd(points[b]);
|
|
comb[2] = points[a].add(points[b].neg());
|
|
} else {
|
|
comb[1] = points[a].toJ().mixedAdd(points[b]);
|
|
comb[2] = points[a].toJ().mixedAdd(points[b].neg());
|
|
}
|
|
|
|
var index = [
|
|
-3, /* -1 -1 */
|
|
-1, /* -1 0 */
|
|
-5, /* -1 1 */
|
|
-7, /* 0 -1 */
|
|
0, /* 0 0 */
|
|
7, /* 0 1 */
|
|
5, /* 1 -1 */
|
|
1, /* 1 0 */
|
|
3 /* 1 1 */
|
|
];
|
|
|
|
var jsf = getJSF(coeffs[a], coeffs[b]);
|
|
max = Math.max(jsf[0].length, max);
|
|
naf[a] = new Array(max);
|
|
naf[b] = new Array(max);
|
|
for (var j = 0; j < max; j++) {
|
|
var ja = jsf[0][j] | 0;
|
|
var jb = jsf[1][j] | 0;
|
|
|
|
naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];
|
|
naf[b][j] = 0;
|
|
wnd[a] = comb;
|
|
}
|
|
}
|
|
|
|
var acc = this.jpoint(null, null, null);
|
|
var tmp = this._wnafT4;
|
|
for (var i = max; i >= 0; i--) {
|
|
var k = 0;
|
|
|
|
while (i >= 0) {
|
|
var zero = true;
|
|
for (var j = 0; j < len; j++) {
|
|
tmp[j] = naf[j][i] | 0;
|
|
if (tmp[j] !== 0)
|
|
zero = false;
|
|
}
|
|
if (!zero)
|
|
break;
|
|
k++;
|
|
i--;
|
|
}
|
|
if (i >= 0)
|
|
k++;
|
|
acc = acc.dblp(k);
|
|
if (i < 0)
|
|
break;
|
|
|
|
for (var j = 0; j < len; j++) {
|
|
var z = tmp[j];
|
|
var p;
|
|
if (z === 0)
|
|
continue;
|
|
else if (z > 0)
|
|
p = wnd[j][(z - 1) >> 1];
|
|
else if (z < 0)
|
|
p = wnd[j][(-z - 1) >> 1].neg();
|
|
|
|
if (p.type === 'affine')
|
|
acc = acc.mixedAdd(p);
|
|
else
|
|
acc = acc.add(p);
|
|
}
|
|
}
|
|
for (var i = 0; i < len; i++)
|
|
wnd[i] = null;
|
|
|
|
if (jacobianResult)
|
|
return acc;
|
|
else
|
|
return acc.toP();
|
|
};
|
|
|
|
function BasePoint(curve, type) {
|
|
this.curve = curve;
|
|
this.type = type;
|
|
this.precomputed = null;
|
|
}
|
|
BaseCurve.BasePoint = BasePoint;
|
|
|
|
BasePoint.prototype.eq = function eq(/*other*/) {
|
|
throw new Error('Not implemented');
|
|
};
|
|
|
|
BasePoint.prototype.validate = function validate() {
|
|
return this.curve.validate(this);
|
|
};
|
|
|
|
BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
|
|
bytes = utils.toArray(bytes, enc);
|
|
|
|
var len = this.p.byteLength();
|
|
|
|
if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&
|
|
bytes.length - 1 === 2 * len) {
|
|
if (bytes[0] === 0x06)
|
|
assert(bytes[bytes.length - 1] % 2 === 0);
|
|
else if (bytes[0] === 0x07)
|
|
assert(bytes[bytes.length - 1] % 2 === 1);
|
|
|
|
var res = this.point(bytes.slice(1, 1 + len),
|
|
bytes.slice(1 + len, 1 + 2 * len));
|
|
|
|
return res;
|
|
} else if ((bytes[0] === 0x02 || bytes[0] === 0x03) &&
|
|
bytes.length - 1 === len) {
|
|
return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);
|
|
}
|
|
throw new Error('Unknown point format');
|
|
};
|
|
|
|
BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
|
|
return this.encode(enc, true);
|
|
};
|
|
|
|
BasePoint.prototype._encode = function _encode(compact) {
|
|
var len = this.curve.p.byteLength();
|
|
var x = this.getX().toArray('be', len);
|
|
|
|
if (compact)
|
|
return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x);
|
|
|
|
return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ;
|
|
};
|
|
|
|
BasePoint.prototype.encode = function encode(enc, compact) {
|
|
return utils.encode(this._encode(compact), enc);
|
|
};
|
|
|
|
BasePoint.prototype.precompute = function precompute(power) {
|
|
if (this.precomputed)
|
|
return this;
|
|
|
|
var precomputed = {
|
|
doubles: null,
|
|
naf: null,
|
|
beta: null
|
|
};
|
|
precomputed.naf = this._getNAFPoints(8);
|
|
precomputed.doubles = this._getDoubles(4, power);
|
|
precomputed.beta = this._getBeta();
|
|
this.precomputed = precomputed;
|
|
|
|
return this;
|
|
};
|
|
|
|
BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
|
|
if (!this.precomputed)
|
|
return false;
|
|
|
|
var doubles = this.precomputed.doubles;
|
|
if (!doubles)
|
|
return false;
|
|
|
|
return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
|
|
};
|
|
|
|
BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
|
|
if (this.precomputed && this.precomputed.doubles)
|
|
return this.precomputed.doubles;
|
|
|
|
var doubles = [ this ];
|
|
var acc = this;
|
|
for (var i = 0; i < power; i += step) {
|
|
for (var j = 0; j < step; j++)
|
|
acc = acc.dbl();
|
|
doubles.push(acc);
|
|
}
|
|
return {
|
|
step: step,
|
|
points: doubles
|
|
};
|
|
};
|
|
|
|
BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
|
|
if (this.precomputed && this.precomputed.naf)
|
|
return this.precomputed.naf;
|
|
|
|
var res = [ this ];
|
|
var max = (1 << wnd) - 1;
|
|
var dbl = max === 1 ? null : this.dbl();
|
|
for (var i = 1; i < max; i++)
|
|
res[i] = res[i - 1].add(dbl);
|
|
return {
|
|
wnd: wnd,
|
|
points: res
|
|
};
|
|
};
|
|
|
|
BasePoint.prototype._getBeta = function _getBeta() {
|
|
return null;
|
|
};
|
|
|
|
BasePoint.prototype.dblp = function dblp(k) {
|
|
var r = this;
|
|
for (var i = 0; i < k; i++)
|
|
r = r.dbl();
|
|
return r;
|
|
};
|
|
|
|
},{"../../elliptic":156,"bn.js":98}],158:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var curve = require('../curve');
|
|
var elliptic = require('../../elliptic');
|
|
var BN = require('bn.js');
|
|
var inherits = require('inherits');
|
|
var Base = curve.base;
|
|
|
|
var assert = elliptic.utils.assert;
|
|
|
|
function EdwardsCurve(conf) {
|
|
this.twisted = (conf.a | 0) !== 1;
|
|
this.mOneA = this.twisted && (conf.a | 0) === -1;
|
|
this.extended = this.mOneA;
|
|
|
|
Base.call(this, 'edwards', conf);
|
|
|
|
this.a = new BN(conf.a, 16).umod(this.red.m);
|
|
this.a = this.a.toRed(this.red);
|
|
this.c = new BN(conf.c, 16).toRed(this.red);
|
|
this.c2 = this.c.redSqr();
|
|
this.d = new BN(conf.d, 16).toRed(this.red);
|
|
this.dd = this.d.redAdd(this.d);
|
|
|
|
assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
|
|
this.oneC = (conf.c | 0) === 1;
|
|
}
|
|
inherits(EdwardsCurve, Base);
|
|
module.exports = EdwardsCurve;
|
|
|
|
EdwardsCurve.prototype._mulA = function _mulA(num) {
|
|
if (this.mOneA)
|
|
return num.redNeg();
|
|
else
|
|
return this.a.redMul(num);
|
|
};
|
|
|
|
EdwardsCurve.prototype._mulC = function _mulC(num) {
|
|
if (this.oneC)
|
|
return num;
|
|
else
|
|
return this.c.redMul(num);
|
|
};
|
|
|
|
EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
|
|
return this.point(x, y, z, t);
|
|
};
|
|
|
|
EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
|
|
x = new BN(x, 16);
|
|
if (!x.red)
|
|
x = x.toRed(this.red);
|
|
|
|
var x2 = x.redSqr();
|
|
var rhs = this.c2.redSub(this.a.redMul(x2));
|
|
var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
|
|
|
|
var y2 = rhs.redMul(lhs.redInvm());
|
|
var y = y2.redSqrt();
|
|
if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
|
|
throw new Error('invalid point');
|
|
|
|
var isOdd = y.fromRed().isOdd();
|
|
if (odd && !isOdd || !odd && isOdd)
|
|
y = y.redNeg();
|
|
|
|
return this.point(x, y);
|
|
};
|
|
|
|
EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
|
|
y = new BN(y, 16);
|
|
if (!y.red)
|
|
y = y.toRed(this.red);
|
|
|
|
var y2 = y.redSqr();
|
|
var lhs = y2.redSub(this.one);
|
|
var rhs = y2.redMul(this.d).redAdd(this.one);
|
|
var x2 = lhs.redMul(rhs.redInvm());
|
|
|
|
if (x2.cmp(this.zero) === 0) {
|
|
if (odd)
|
|
throw new Error('invalid point');
|
|
else
|
|
return this.point(this.zero, y);
|
|
}
|
|
|
|
var x = x2.redSqrt();
|
|
if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
|
|
throw new Error('invalid point');
|
|
|
|
if (x.isOdd() !== odd)
|
|
x = x.redNeg();
|
|
|
|
return this.point(x, y);
|
|
};
|
|
|
|
EdwardsCurve.prototype.validate = function validate(point) {
|
|
if (point.isInfinity())
|
|
return true;
|
|
|
|
point.normalize();
|
|
|
|
var x2 = point.x.redSqr();
|
|
var y2 = point.y.redSqr();
|
|
var lhs = x2.redMul(this.a).redAdd(y2);
|
|
var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
|
|
|
|
return lhs.cmp(rhs) === 0;
|
|
};
|
|
|
|
function Point(curve, x, y, z, t) {
|
|
Base.BasePoint.call(this, curve, 'projective');
|
|
if (x === null && y === null && z === null) {
|
|
this.x = this.curve.zero;
|
|
this.y = this.curve.one;
|
|
this.z = this.curve.one;
|
|
this.t = this.curve.zero;
|
|
this.zOne = true;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
this.z = z ? new BN(z, 16) : this.curve.one;
|
|
this.t = t && new BN(t, 16);
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
if (this.t && !this.t.red)
|
|
this.t = this.t.toRed(this.curve.red);
|
|
this.zOne = this.z === this.curve.one;
|
|
|
|
if (this.curve.extended && !this.t) {
|
|
this.t = this.x.redMul(this.y);
|
|
if (!this.zOne)
|
|
this.t = this.t.redMul(this.z.redInvm());
|
|
}
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
|
|
EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
|
|
return Point.fromJSON(this, obj);
|
|
};
|
|
|
|
EdwardsCurve.prototype.point = function point(x, y, z, t) {
|
|
return new Point(this, x, y, z, t);
|
|
};
|
|
|
|
Point.fromJSON = function fromJSON(curve, obj) {
|
|
return new Point(curve, obj[0], obj[1], obj[2]);
|
|
};
|
|
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return '<EC Point Infinity>';
|
|
return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +
|
|
' y: ' + this.y.fromRed().toString(16, 2) +
|
|
' z: ' + this.z.fromRed().toString(16, 2) + '>';
|
|
};
|
|
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.x.cmpn(0) === 0 &&
|
|
this.y.cmp(this.z) === 0;
|
|
};
|
|
|
|
Point.prototype._extDbl = function _extDbl() {
|
|
|
|
var a = this.x.redSqr();
|
|
var b = this.y.redSqr();
|
|
var c = this.z.redSqr();
|
|
c = c.redIAdd(c);
|
|
var d = this.curve._mulA(a);
|
|
var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
|
|
var g = d.redAdd(b);
|
|
var f = g.redSub(c);
|
|
var h = d.redSub(b);
|
|
var nx = e.redMul(f);
|
|
var ny = g.redMul(h);
|
|
var nt = e.redMul(h);
|
|
var nz = f.redMul(g);
|
|
return this.curve.point(nx, ny, nz, nt);
|
|
};
|
|
|
|
Point.prototype._projDbl = function _projDbl() {
|
|
|
|
var b = this.x.redAdd(this.y).redSqr();
|
|
var c = this.x.redSqr();
|
|
var d = this.y.redSqr();
|
|
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.curve.twisted) {
|
|
var e = this.curve._mulA(c);
|
|
var f = e.redAdd(d);
|
|
if (this.zOne) {
|
|
nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
|
|
ny = f.redMul(e.redSub(d));
|
|
nz = f.redSqr().redSub(f).redSub(f);
|
|
} else {
|
|
var h = this.z.redSqr();
|
|
var j = f.redSub(h).redISub(h);
|
|
nx = b.redSub(c).redISub(d).redMul(j);
|
|
ny = f.redMul(e.redSub(d));
|
|
nz = f.redMul(j);
|
|
}
|
|
} else {
|
|
var e = c.redAdd(d);
|
|
var h = this.curve._mulC(this.c.redMul(this.z)).redSqr();
|
|
var j = e.redSub(h).redSub(h);
|
|
nx = this.curve._mulC(b.redISub(e)).redMul(j);
|
|
ny = this.curve._mulC(e).redMul(c.redISub(d));
|
|
nz = e.redMul(j);
|
|
}
|
|
return this.curve.point(nx, ny, nz);
|
|
};
|
|
|
|
Point.prototype.dbl = function dbl() {
|
|
if (this.isInfinity())
|
|
return this;
|
|
|
|
if (this.curve.extended)
|
|
return this._extDbl();
|
|
else
|
|
return this._projDbl();
|
|
};
|
|
|
|
Point.prototype._extAdd = function _extAdd(p) {
|
|
|
|
var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
|
|
var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
|
|
var c = this.t.redMul(this.curve.dd).redMul(p.t);
|
|
var d = this.z.redMul(p.z.redAdd(p.z));
|
|
var e = b.redSub(a);
|
|
var f = d.redSub(c);
|
|
var g = d.redAdd(c);
|
|
var h = b.redAdd(a);
|
|
var nx = e.redMul(f);
|
|
var ny = g.redMul(h);
|
|
var nt = e.redMul(h);
|
|
var nz = f.redMul(g);
|
|
return this.curve.point(nx, ny, nz, nt);
|
|
};
|
|
|
|
Point.prototype._projAdd = function _projAdd(p) {
|
|
|
|
var a = this.z.redMul(p.z);
|
|
var b = a.redSqr();
|
|
var c = this.x.redMul(p.x);
|
|
var d = this.y.redMul(p.y);
|
|
var e = this.curve.d.redMul(c).redMul(d);
|
|
var f = b.redSub(e);
|
|
var g = b.redAdd(e);
|
|
var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
|
|
var nx = a.redMul(f).redMul(tmp);
|
|
var ny;
|
|
var nz;
|
|
if (this.curve.twisted) {
|
|
ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
|
|
nz = f.redMul(g);
|
|
} else {
|
|
ny = a.redMul(g).redMul(d.redSub(c));
|
|
nz = this.curve._mulC(f).redMul(g);
|
|
}
|
|
return this.curve.point(nx, ny, nz);
|
|
};
|
|
|
|
Point.prototype.add = function add(p) {
|
|
if (this.isInfinity())
|
|
return p;
|
|
if (p.isInfinity())
|
|
return this;
|
|
|
|
if (this.curve.extended)
|
|
return this._extAdd(p);
|
|
else
|
|
return this._projAdd(p);
|
|
};
|
|
|
|
Point.prototype.mul = function mul(k) {
|
|
if (this._hasDoubles(k))
|
|
return this.curve._fixedNafMul(this, k);
|
|
else
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
|
|
Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
|
|
return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false);
|
|
};
|
|
|
|
Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
|
|
return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true);
|
|
};
|
|
|
|
Point.prototype.normalize = function normalize() {
|
|
if (this.zOne)
|
|
return this;
|
|
|
|
var zi = this.z.redInvm();
|
|
this.x = this.x.redMul(zi);
|
|
this.y = this.y.redMul(zi);
|
|
if (this.t)
|
|
this.t = this.t.redMul(zi);
|
|
this.z = this.curve.one;
|
|
this.zOne = true;
|
|
return this;
|
|
};
|
|
|
|
Point.prototype.neg = function neg() {
|
|
return this.curve.point(this.x.redNeg(),
|
|
this.y,
|
|
this.z,
|
|
this.t && this.t.redNeg());
|
|
};
|
|
|
|
Point.prototype.getX = function getX() {
|
|
this.normalize();
|
|
return this.x.fromRed();
|
|
};
|
|
|
|
Point.prototype.getY = function getY() {
|
|
this.normalize();
|
|
return this.y.fromRed();
|
|
};
|
|
|
|
Point.prototype.eq = function eq(other) {
|
|
return this === other ||
|
|
this.getX().cmp(other.getX()) === 0 &&
|
|
this.getY().cmp(other.getY()) === 0;
|
|
};
|
|
|
|
Point.prototype.eqXToP = function eqXToP(x) {
|
|
var rx = x.toRed(this.curve.red).redMul(this.z);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
|
|
var xc = x.clone();
|
|
var t = this.curve.redN.redMul(this.z);
|
|
for (;;) {
|
|
xc.iadd(this.curve.n);
|
|
if (xc.cmp(this.curve.p) >= 0)
|
|
return false;
|
|
|
|
rx.redIAdd(t);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
Point.prototype.toP = Point.prototype.normalize;
|
|
Point.prototype.mixedAdd = Point.prototype.add;
|
|
|
|
},{"../../elliptic":156,"../curve":159,"bn.js":98,"inherits":190}],159:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var curve = exports;
|
|
|
|
curve.base = require('./base');
|
|
curve.short = require('./short');
|
|
curve.mont = require('./mont');
|
|
curve.edwards = require('./edwards');
|
|
|
|
},{"./base":157,"./edwards":158,"./mont":160,"./short":161}],160:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var curve = require('../curve');
|
|
var BN = require('bn.js');
|
|
var inherits = require('inherits');
|
|
var Base = curve.base;
|
|
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
|
|
function MontCurve(conf) {
|
|
Base.call(this, 'mont', conf);
|
|
|
|
this.a = new BN(conf.a, 16).toRed(this.red);
|
|
this.b = new BN(conf.b, 16).toRed(this.red);
|
|
this.i4 = new BN(4).toRed(this.red).redInvm();
|
|
this.two = new BN(2).toRed(this.red);
|
|
this.a24 = this.i4.redMul(this.a.redAdd(this.two));
|
|
}
|
|
inherits(MontCurve, Base);
|
|
module.exports = MontCurve;
|
|
|
|
MontCurve.prototype.validate = function validate(point) {
|
|
var x = point.normalize().x;
|
|
var x2 = x.redSqr();
|
|
var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
|
|
var y = rhs.redSqrt();
|
|
|
|
return y.redSqr().cmp(rhs) === 0;
|
|
};
|
|
|
|
function Point(curve, x, z) {
|
|
Base.BasePoint.call(this, curve, 'projective');
|
|
if (x === null && z === null) {
|
|
this.x = this.curve.one;
|
|
this.z = this.curve.zero;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.z = new BN(z, 16);
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
|
|
MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
|
|
return this.point(utils.toArray(bytes, enc), 1);
|
|
};
|
|
|
|
MontCurve.prototype.point = function point(x, z) {
|
|
return new Point(this, x, z);
|
|
};
|
|
|
|
MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
|
|
return Point.fromJSON(this, obj);
|
|
};
|
|
|
|
Point.prototype.precompute = function precompute() {
|
|
};
|
|
|
|
Point.prototype._encode = function _encode() {
|
|
return this.getX().toArray('be', this.curve.p.byteLength());
|
|
};
|
|
|
|
Point.fromJSON = function fromJSON(curve, obj) {
|
|
return new Point(curve, obj[0], obj[1] || curve.one);
|
|
};
|
|
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return '<EC Point Infinity>';
|
|
return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +
|
|
' z: ' + this.z.fromRed().toString(16, 2) + '>';
|
|
};
|
|
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.z.cmpn(0) === 0;
|
|
};
|
|
|
|
Point.prototype.dbl = function dbl() {
|
|
|
|
var a = this.x.redAdd(this.z);
|
|
var aa = a.redSqr();
|
|
var b = this.x.redSub(this.z);
|
|
var bb = b.redSqr();
|
|
var c = aa.redSub(bb);
|
|
var nx = aa.redMul(bb);
|
|
var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
|
|
return this.curve.point(nx, nz);
|
|
};
|
|
|
|
Point.prototype.add = function add() {
|
|
throw new Error('Not supported on Montgomery curve');
|
|
};
|
|
|
|
Point.prototype.diffAdd = function diffAdd(p, diff) {
|
|
|
|
var a = this.x.redAdd(this.z);
|
|
var b = this.x.redSub(this.z);
|
|
var c = p.x.redAdd(p.z);
|
|
var d = p.x.redSub(p.z);
|
|
var da = d.redMul(a);
|
|
var cb = c.redMul(b);
|
|
var nx = diff.z.redMul(da.redAdd(cb).redSqr());
|
|
var nz = diff.x.redMul(da.redISub(cb).redSqr());
|
|
return this.curve.point(nx, nz);
|
|
};
|
|
|
|
Point.prototype.mul = function mul(k) {
|
|
var t = k.clone();
|
|
var a = this; // (N / 2) * Q + Q
|
|
var b = this.curve.point(null, null); // (N / 2) * Q
|
|
var c = this; // Q
|
|
|
|
for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))
|
|
bits.push(t.andln(1));
|
|
|
|
for (var i = bits.length - 1; i >= 0; i--) {
|
|
if (bits[i] === 0) {
|
|
a = a.diffAdd(b, c);
|
|
b = b.dbl();
|
|
} else {
|
|
b = a.diffAdd(b, c);
|
|
a = a.dbl();
|
|
}
|
|
}
|
|
return b;
|
|
};
|
|
|
|
Point.prototype.mulAdd = function mulAdd() {
|
|
throw new Error('Not supported on Montgomery curve');
|
|
};
|
|
|
|
Point.prototype.jumlAdd = function jumlAdd() {
|
|
throw new Error('Not supported on Montgomery curve');
|
|
};
|
|
|
|
Point.prototype.eq = function eq(other) {
|
|
return this.getX().cmp(other.getX()) === 0;
|
|
};
|
|
|
|
Point.prototype.normalize = function normalize() {
|
|
this.x = this.x.redMul(this.z.redInvm());
|
|
this.z = this.curve.one;
|
|
return this;
|
|
};
|
|
|
|
Point.prototype.getX = function getX() {
|
|
this.normalize();
|
|
|
|
return this.x.fromRed();
|
|
};
|
|
|
|
},{"../../elliptic":156,"../curve":159,"bn.js":98,"inherits":190}],161:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var curve = require('../curve');
|
|
var elliptic = require('../../elliptic');
|
|
var BN = require('bn.js');
|
|
var inherits = require('inherits');
|
|
var Base = curve.base;
|
|
|
|
var assert = elliptic.utils.assert;
|
|
|
|
function ShortCurve(conf) {
|
|
Base.call(this, 'short', conf);
|
|
|
|
this.a = new BN(conf.a, 16).toRed(this.red);
|
|
this.b = new BN(conf.b, 16).toRed(this.red);
|
|
this.tinv = this.two.redInvm();
|
|
|
|
this.zeroA = this.a.fromRed().cmpn(0) === 0;
|
|
this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
|
|
|
|
this.endo = this._getEndomorphism(conf);
|
|
this._endoWnafT1 = new Array(4);
|
|
this._endoWnafT2 = new Array(4);
|
|
}
|
|
inherits(ShortCurve, Base);
|
|
module.exports = ShortCurve;
|
|
|
|
ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
|
|
if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
|
|
return;
|
|
|
|
var beta;
|
|
var lambda;
|
|
if (conf.beta) {
|
|
beta = new BN(conf.beta, 16).toRed(this.red);
|
|
} else {
|
|
var betas = this._getEndoRoots(this.p);
|
|
beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
|
|
beta = beta.toRed(this.red);
|
|
}
|
|
if (conf.lambda) {
|
|
lambda = new BN(conf.lambda, 16);
|
|
} else {
|
|
var lambdas = this._getEndoRoots(this.n);
|
|
if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
|
|
lambda = lambdas[0];
|
|
} else {
|
|
lambda = lambdas[1];
|
|
assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
|
|
}
|
|
}
|
|
|
|
var basis;
|
|
if (conf.basis) {
|
|
basis = conf.basis.map(function(vec) {
|
|
return {
|
|
a: new BN(vec.a, 16),
|
|
b: new BN(vec.b, 16)
|
|
};
|
|
});
|
|
} else {
|
|
basis = this._getEndoBasis(lambda);
|
|
}
|
|
|
|
return {
|
|
beta: beta,
|
|
lambda: lambda,
|
|
basis: basis
|
|
};
|
|
};
|
|
|
|
ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
|
|
var red = num === this.p ? this.red : BN.mont(num);
|
|
var tinv = new BN(2).toRed(red).redInvm();
|
|
var ntinv = tinv.redNeg();
|
|
|
|
var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
|
|
|
|
var l1 = ntinv.redAdd(s).fromRed();
|
|
var l2 = ntinv.redSub(s).fromRed();
|
|
return [ l1, l2 ];
|
|
};
|
|
|
|
ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
|
|
var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
|
|
|
|
var u = lambda;
|
|
var v = this.n.clone();
|
|
var x1 = new BN(1);
|
|
var y1 = new BN(0);
|
|
var x2 = new BN(0);
|
|
var y2 = new BN(1);
|
|
|
|
var a0;
|
|
var b0;
|
|
var a1;
|
|
var b1;
|
|
var a2;
|
|
var b2;
|
|
|
|
var prevR;
|
|
var i = 0;
|
|
var r;
|
|
var x;
|
|
while (u.cmpn(0) !== 0) {
|
|
var q = v.div(u);
|
|
r = v.sub(q.mul(u));
|
|
x = x2.sub(q.mul(x1));
|
|
var y = y2.sub(q.mul(y1));
|
|
|
|
if (!a1 && r.cmp(aprxSqrt) < 0) {
|
|
a0 = prevR.neg();
|
|
b0 = x1;
|
|
a1 = r.neg();
|
|
b1 = x;
|
|
} else if (a1 && ++i === 2) {
|
|
break;
|
|
}
|
|
prevR = r;
|
|
|
|
v = u;
|
|
u = r;
|
|
x2 = x1;
|
|
x1 = x;
|
|
y2 = y1;
|
|
y1 = y;
|
|
}
|
|
a2 = r.neg();
|
|
b2 = x;
|
|
|
|
var len1 = a1.sqr().add(b1.sqr());
|
|
var len2 = a2.sqr().add(b2.sqr());
|
|
if (len2.cmp(len1) >= 0) {
|
|
a2 = a0;
|
|
b2 = b0;
|
|
}
|
|
|
|
if (a1.negative) {
|
|
a1 = a1.neg();
|
|
b1 = b1.neg();
|
|
}
|
|
if (a2.negative) {
|
|
a2 = a2.neg();
|
|
b2 = b2.neg();
|
|
}
|
|
|
|
return [
|
|
{ a: a1, b: b1 },
|
|
{ a: a2, b: b2 }
|
|
];
|
|
};
|
|
|
|
ShortCurve.prototype._endoSplit = function _endoSplit(k) {
|
|
var basis = this.endo.basis;
|
|
var v1 = basis[0];
|
|
var v2 = basis[1];
|
|
|
|
var c1 = v2.b.mul(k).divRound(this.n);
|
|
var c2 = v1.b.neg().mul(k).divRound(this.n);
|
|
|
|
var p1 = c1.mul(v1.a);
|
|
var p2 = c2.mul(v2.a);
|
|
var q1 = c1.mul(v1.b);
|
|
var q2 = c2.mul(v2.b);
|
|
|
|
var k1 = k.sub(p1).sub(p2);
|
|
var k2 = q1.add(q2).neg();
|
|
return { k1: k1, k2: k2 };
|
|
};
|
|
|
|
ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
|
|
x = new BN(x, 16);
|
|
if (!x.red)
|
|
x = x.toRed(this.red);
|
|
|
|
var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
|
|
var y = y2.redSqrt();
|
|
if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
|
|
throw new Error('invalid point');
|
|
|
|
var isOdd = y.fromRed().isOdd();
|
|
if (odd && !isOdd || !odd && isOdd)
|
|
y = y.redNeg();
|
|
|
|
return this.point(x, y);
|
|
};
|
|
|
|
ShortCurve.prototype.validate = function validate(point) {
|
|
if (point.inf)
|
|
return true;
|
|
|
|
var x = point.x;
|
|
var y = point.y;
|
|
|
|
var ax = this.a.redMul(x);
|
|
var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
|
|
return y.redSqr().redISub(rhs).cmpn(0) === 0;
|
|
};
|
|
|
|
ShortCurve.prototype._endoWnafMulAdd =
|
|
function _endoWnafMulAdd(points, coeffs, jacobianResult) {
|
|
var npoints = this._endoWnafT1;
|
|
var ncoeffs = this._endoWnafT2;
|
|
for (var i = 0; i < points.length; i++) {
|
|
var split = this._endoSplit(coeffs[i]);
|
|
var p = points[i];
|
|
var beta = p._getBeta();
|
|
|
|
if (split.k1.negative) {
|
|
split.k1.ineg();
|
|
p = p.neg(true);
|
|
}
|
|
if (split.k2.negative) {
|
|
split.k2.ineg();
|
|
beta = beta.neg(true);
|
|
}
|
|
|
|
npoints[i * 2] = p;
|
|
npoints[i * 2 + 1] = beta;
|
|
ncoeffs[i * 2] = split.k1;
|
|
ncoeffs[i * 2 + 1] = split.k2;
|
|
}
|
|
var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
|
|
|
|
for (var j = 0; j < i * 2; j++) {
|
|
npoints[j] = null;
|
|
ncoeffs[j] = null;
|
|
}
|
|
return res;
|
|
};
|
|
|
|
function Point(curve, x, y, isRed) {
|
|
Base.BasePoint.call(this, curve, 'affine');
|
|
if (x === null && y === null) {
|
|
this.x = null;
|
|
this.y = null;
|
|
this.inf = true;
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
if (isRed) {
|
|
this.x.forceRed(this.curve.red);
|
|
this.y.forceRed(this.curve.red);
|
|
}
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
this.inf = false;
|
|
}
|
|
}
|
|
inherits(Point, Base.BasePoint);
|
|
|
|
ShortCurve.prototype.point = function point(x, y, isRed) {
|
|
return new Point(this, x, y, isRed);
|
|
};
|
|
|
|
ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
|
|
return Point.fromJSON(this, obj, red);
|
|
};
|
|
|
|
Point.prototype._getBeta = function _getBeta() {
|
|
if (!this.curve.endo)
|
|
return;
|
|
|
|
var pre = this.precomputed;
|
|
if (pre && pre.beta)
|
|
return pre.beta;
|
|
|
|
var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
|
|
if (pre) {
|
|
var curve = this.curve;
|
|
var endoMul = function(p) {
|
|
return curve.point(p.x.redMul(curve.endo.beta), p.y);
|
|
};
|
|
pre.beta = beta;
|
|
beta.precomputed = {
|
|
beta: null,
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: pre.naf.points.map(endoMul)
|
|
},
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: pre.doubles.points.map(endoMul)
|
|
}
|
|
};
|
|
}
|
|
return beta;
|
|
};
|
|
|
|
Point.prototype.toJSON = function toJSON() {
|
|
if (!this.precomputed)
|
|
return [ this.x, this.y ];
|
|
|
|
return [ this.x, this.y, this.precomputed && {
|
|
doubles: this.precomputed.doubles && {
|
|
step: this.precomputed.doubles.step,
|
|
points: this.precomputed.doubles.points.slice(1)
|
|
},
|
|
naf: this.precomputed.naf && {
|
|
wnd: this.precomputed.naf.wnd,
|
|
points: this.precomputed.naf.points.slice(1)
|
|
}
|
|
} ];
|
|
};
|
|
|
|
Point.fromJSON = function fromJSON(curve, obj, red) {
|
|
if (typeof obj === 'string')
|
|
obj = JSON.parse(obj);
|
|
var res = curve.point(obj[0], obj[1], red);
|
|
if (!obj[2])
|
|
return res;
|
|
|
|
function obj2point(obj) {
|
|
return curve.point(obj[0], obj[1], red);
|
|
}
|
|
|
|
var pre = obj[2];
|
|
res.precomputed = {
|
|
beta: null,
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: [ res ].concat(pre.doubles.points.map(obj2point))
|
|
},
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: [ res ].concat(pre.naf.points.map(obj2point))
|
|
}
|
|
};
|
|
return res;
|
|
};
|
|
|
|
Point.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return '<EC Point Infinity>';
|
|
return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +
|
|
' y: ' + this.y.fromRed().toString(16, 2) + '>';
|
|
};
|
|
|
|
Point.prototype.isInfinity = function isInfinity() {
|
|
return this.inf;
|
|
};
|
|
|
|
Point.prototype.add = function add(p) {
|
|
if (this.inf)
|
|
return p;
|
|
|
|
if (p.inf)
|
|
return this;
|
|
|
|
if (this.eq(p))
|
|
return this.dbl();
|
|
|
|
if (this.neg().eq(p))
|
|
return this.curve.point(null, null);
|
|
|
|
if (this.x.cmp(p.x) === 0)
|
|
return this.curve.point(null, null);
|
|
|
|
var c = this.y.redSub(p.y);
|
|
if (c.cmpn(0) !== 0)
|
|
c = c.redMul(this.x.redSub(p.x).redInvm());
|
|
var nx = c.redSqr().redISub(this.x).redISub(p.x);
|
|
var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
|
|
return this.curve.point(nx, ny);
|
|
};
|
|
|
|
Point.prototype.dbl = function dbl() {
|
|
if (this.inf)
|
|
return this;
|
|
|
|
var ys1 = this.y.redAdd(this.y);
|
|
if (ys1.cmpn(0) === 0)
|
|
return this.curve.point(null, null);
|
|
|
|
var a = this.curve.a;
|
|
|
|
var x2 = this.x.redSqr();
|
|
var dyinv = ys1.redInvm();
|
|
var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
|
|
|
|
var nx = c.redSqr().redISub(this.x.redAdd(this.x));
|
|
var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
|
|
return this.curve.point(nx, ny);
|
|
};
|
|
|
|
Point.prototype.getX = function getX() {
|
|
return this.x.fromRed();
|
|
};
|
|
|
|
Point.prototype.getY = function getY() {
|
|
return this.y.fromRed();
|
|
};
|
|
|
|
Point.prototype.mul = function mul(k) {
|
|
k = new BN(k, 16);
|
|
|
|
if (this._hasDoubles(k))
|
|
return this.curve._fixedNafMul(this, k);
|
|
else if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd([ this ], [ k ]);
|
|
else
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
|
|
Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
|
|
var points = [ this, p2 ];
|
|
var coeffs = [ k1, k2 ];
|
|
if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd(points, coeffs);
|
|
else
|
|
return this.curve._wnafMulAdd(1, points, coeffs, 2);
|
|
};
|
|
|
|
Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
|
|
var points = [ this, p2 ];
|
|
var coeffs = [ k1, k2 ];
|
|
if (this.curve.endo)
|
|
return this.curve._endoWnafMulAdd(points, coeffs, true);
|
|
else
|
|
return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
|
|
};
|
|
|
|
Point.prototype.eq = function eq(p) {
|
|
return this === p ||
|
|
this.inf === p.inf &&
|
|
(this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
|
|
};
|
|
|
|
Point.prototype.neg = function neg(_precompute) {
|
|
if (this.inf)
|
|
return this;
|
|
|
|
var res = this.curve.point(this.x, this.y.redNeg());
|
|
if (_precompute && this.precomputed) {
|
|
var pre = this.precomputed;
|
|
var negate = function(p) {
|
|
return p.neg();
|
|
};
|
|
res.precomputed = {
|
|
naf: pre.naf && {
|
|
wnd: pre.naf.wnd,
|
|
points: pre.naf.points.map(negate)
|
|
},
|
|
doubles: pre.doubles && {
|
|
step: pre.doubles.step,
|
|
points: pre.doubles.points.map(negate)
|
|
}
|
|
};
|
|
}
|
|
return res;
|
|
};
|
|
|
|
Point.prototype.toJ = function toJ() {
|
|
if (this.inf)
|
|
return this.curve.jpoint(null, null, null);
|
|
|
|
var res = this.curve.jpoint(this.x, this.y, this.curve.one);
|
|
return res;
|
|
};
|
|
|
|
function JPoint(curve, x, y, z) {
|
|
Base.BasePoint.call(this, curve, 'jacobian');
|
|
if (x === null && y === null && z === null) {
|
|
this.x = this.curve.one;
|
|
this.y = this.curve.one;
|
|
this.z = new BN(0);
|
|
} else {
|
|
this.x = new BN(x, 16);
|
|
this.y = new BN(y, 16);
|
|
this.z = new BN(z, 16);
|
|
}
|
|
if (!this.x.red)
|
|
this.x = this.x.toRed(this.curve.red);
|
|
if (!this.y.red)
|
|
this.y = this.y.toRed(this.curve.red);
|
|
if (!this.z.red)
|
|
this.z = this.z.toRed(this.curve.red);
|
|
|
|
this.zOne = this.z === this.curve.one;
|
|
}
|
|
inherits(JPoint, Base.BasePoint);
|
|
|
|
ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
|
|
return new JPoint(this, x, y, z);
|
|
};
|
|
|
|
JPoint.prototype.toP = function toP() {
|
|
if (this.isInfinity())
|
|
return this.curve.point(null, null);
|
|
|
|
var zinv = this.z.redInvm();
|
|
var zinv2 = zinv.redSqr();
|
|
var ax = this.x.redMul(zinv2);
|
|
var ay = this.y.redMul(zinv2).redMul(zinv);
|
|
|
|
return this.curve.point(ax, ay);
|
|
};
|
|
|
|
JPoint.prototype.neg = function neg() {
|
|
return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
|
|
};
|
|
|
|
JPoint.prototype.add = function add(p) {
|
|
if (this.isInfinity())
|
|
return p;
|
|
|
|
if (p.isInfinity())
|
|
return this;
|
|
|
|
var pz2 = p.z.redSqr();
|
|
var z2 = this.z.redSqr();
|
|
var u1 = this.x.redMul(pz2);
|
|
var u2 = p.x.redMul(z2);
|
|
var s1 = this.y.redMul(pz2.redMul(p.z));
|
|
var s2 = p.y.redMul(z2.redMul(this.z));
|
|
|
|
var h = u1.redSub(u2);
|
|
var r = s1.redSub(s2);
|
|
if (h.cmpn(0) === 0) {
|
|
if (r.cmpn(0) !== 0)
|
|
return this.curve.jpoint(null, null, null);
|
|
else
|
|
return this.dbl();
|
|
}
|
|
|
|
var h2 = h.redSqr();
|
|
var h3 = h2.redMul(h);
|
|
var v = u1.redMul(h2);
|
|
|
|
var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
|
|
var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
|
|
var nz = this.z.redMul(p.z).redMul(h);
|
|
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
|
|
JPoint.prototype.mixedAdd = function mixedAdd(p) {
|
|
if (this.isInfinity())
|
|
return p.toJ();
|
|
|
|
if (p.isInfinity())
|
|
return this;
|
|
|
|
var z2 = this.z.redSqr();
|
|
var u1 = this.x;
|
|
var u2 = p.x.redMul(z2);
|
|
var s1 = this.y;
|
|
var s2 = p.y.redMul(z2).redMul(this.z);
|
|
|
|
var h = u1.redSub(u2);
|
|
var r = s1.redSub(s2);
|
|
if (h.cmpn(0) === 0) {
|
|
if (r.cmpn(0) !== 0)
|
|
return this.curve.jpoint(null, null, null);
|
|
else
|
|
return this.dbl();
|
|
}
|
|
|
|
var h2 = h.redSqr();
|
|
var h3 = h2.redMul(h);
|
|
var v = u1.redMul(h2);
|
|
|
|
var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
|
|
var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
|
|
var nz = this.z.redMul(h);
|
|
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
|
|
JPoint.prototype.dblp = function dblp(pow) {
|
|
if (pow === 0)
|
|
return this;
|
|
if (this.isInfinity())
|
|
return this;
|
|
if (!pow)
|
|
return this.dbl();
|
|
|
|
if (this.curve.zeroA || this.curve.threeA) {
|
|
var r = this;
|
|
for (var i = 0; i < pow; i++)
|
|
r = r.dbl();
|
|
return r;
|
|
}
|
|
|
|
var a = this.curve.a;
|
|
var tinv = this.curve.tinv;
|
|
|
|
var jx = this.x;
|
|
var jy = this.y;
|
|
var jz = this.z;
|
|
var jz4 = jz.redSqr().redSqr();
|
|
|
|
var jyd = jy.redAdd(jy);
|
|
for (var i = 0; i < pow; i++) {
|
|
var jx2 = jx.redSqr();
|
|
var jyd2 = jyd.redSqr();
|
|
var jyd4 = jyd2.redSqr();
|
|
var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
|
|
|
|
var t1 = jx.redMul(jyd2);
|
|
var nx = c.redSqr().redISub(t1.redAdd(t1));
|
|
var t2 = t1.redISub(nx);
|
|
var dny = c.redMul(t2);
|
|
dny = dny.redIAdd(dny).redISub(jyd4);
|
|
var nz = jyd.redMul(jz);
|
|
if (i + 1 < pow)
|
|
jz4 = jz4.redMul(jyd4);
|
|
|
|
jx = nx;
|
|
jz = nz;
|
|
jyd = dny;
|
|
}
|
|
|
|
return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
|
|
};
|
|
|
|
JPoint.prototype.dbl = function dbl() {
|
|
if (this.isInfinity())
|
|
return this;
|
|
|
|
if (this.curve.zeroA)
|
|
return this._zeroDbl();
|
|
else if (this.curve.threeA)
|
|
return this._threeDbl();
|
|
else
|
|
return this._dbl();
|
|
};
|
|
|
|
JPoint.prototype._zeroDbl = function _zeroDbl() {
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.zOne) {
|
|
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
s = s.redIAdd(s);
|
|
var m = xx.redAdd(xx).redIAdd(xx);
|
|
var t = m.redSqr().redISub(s).redISub(s);
|
|
|
|
var yyyy8 = yyyy.redIAdd(yyyy);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
|
|
nx = t;
|
|
ny = m.redMul(s.redISub(t)).redISub(yyyy8);
|
|
nz = this.y.redAdd(this.y);
|
|
} else {
|
|
|
|
var a = this.x.redSqr();
|
|
var b = this.y.redSqr();
|
|
var c = b.redSqr();
|
|
var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
|
|
d = d.redIAdd(d);
|
|
var e = a.redAdd(a).redIAdd(a);
|
|
var f = e.redSqr();
|
|
|
|
var c8 = c.redIAdd(c);
|
|
c8 = c8.redIAdd(c8);
|
|
c8 = c8.redIAdd(c8);
|
|
|
|
nx = f.redISub(d).redISub(d);
|
|
ny = e.redMul(d.redISub(nx)).redISub(c8);
|
|
nz = this.y.redMul(this.z);
|
|
nz = nz.redIAdd(nz);
|
|
}
|
|
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
|
|
JPoint.prototype._threeDbl = function _threeDbl() {
|
|
var nx;
|
|
var ny;
|
|
var nz;
|
|
if (this.zOne) {
|
|
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
s = s.redIAdd(s);
|
|
var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
|
|
var t = m.redSqr().redISub(s).redISub(s);
|
|
nx = t;
|
|
var yyyy8 = yyyy.redIAdd(yyyy);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
yyyy8 = yyyy8.redIAdd(yyyy8);
|
|
ny = m.redMul(s.redISub(t)).redISub(yyyy8);
|
|
nz = this.y.redAdd(this.y);
|
|
} else {
|
|
|
|
var delta = this.z.redSqr();
|
|
var gamma = this.y.redSqr();
|
|
var beta = this.x.redMul(gamma);
|
|
var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
|
|
alpha = alpha.redAdd(alpha).redIAdd(alpha);
|
|
var beta4 = beta.redIAdd(beta);
|
|
beta4 = beta4.redIAdd(beta4);
|
|
var beta8 = beta4.redAdd(beta4);
|
|
nx = alpha.redSqr().redISub(beta8);
|
|
nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
|
|
var ggamma8 = gamma.redSqr();
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ggamma8 = ggamma8.redIAdd(ggamma8);
|
|
ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
|
|
}
|
|
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
|
|
JPoint.prototype._dbl = function _dbl() {
|
|
var a = this.curve.a;
|
|
|
|
var jx = this.x;
|
|
var jy = this.y;
|
|
var jz = this.z;
|
|
var jz4 = jz.redSqr().redSqr();
|
|
|
|
var jx2 = jx.redSqr();
|
|
var jy2 = jy.redSqr();
|
|
|
|
var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
|
|
|
|
var jxd4 = jx.redAdd(jx);
|
|
jxd4 = jxd4.redIAdd(jxd4);
|
|
var t1 = jxd4.redMul(jy2);
|
|
var nx = c.redSqr().redISub(t1.redAdd(t1));
|
|
var t2 = t1.redISub(nx);
|
|
|
|
var jyd8 = jy2.redSqr();
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
jyd8 = jyd8.redIAdd(jyd8);
|
|
var ny = c.redMul(t2).redISub(jyd8);
|
|
var nz = jy.redAdd(jy).redMul(jz);
|
|
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
|
|
JPoint.prototype.trpl = function trpl() {
|
|
if (!this.curve.zeroA)
|
|
return this.dbl().add(this);
|
|
|
|
|
|
var xx = this.x.redSqr();
|
|
var yy = this.y.redSqr();
|
|
var zz = this.z.redSqr();
|
|
var yyyy = yy.redSqr();
|
|
var m = xx.redAdd(xx).redIAdd(xx);
|
|
var mm = m.redSqr();
|
|
var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
|
|
e = e.redIAdd(e);
|
|
e = e.redAdd(e).redIAdd(e);
|
|
e = e.redISub(mm);
|
|
var ee = e.redSqr();
|
|
var t = yyyy.redIAdd(yyyy);
|
|
t = t.redIAdd(t);
|
|
t = t.redIAdd(t);
|
|
t = t.redIAdd(t);
|
|
var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
|
|
var yyu4 = yy.redMul(u);
|
|
yyu4 = yyu4.redIAdd(yyu4);
|
|
yyu4 = yyu4.redIAdd(yyu4);
|
|
var nx = this.x.redMul(ee).redISub(yyu4);
|
|
nx = nx.redIAdd(nx);
|
|
nx = nx.redIAdd(nx);
|
|
var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
|
|
ny = ny.redIAdd(ny);
|
|
ny = ny.redIAdd(ny);
|
|
ny = ny.redIAdd(ny);
|
|
var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
|
|
|
|
return this.curve.jpoint(nx, ny, nz);
|
|
};
|
|
|
|
JPoint.prototype.mul = function mul(k, kbase) {
|
|
k = new BN(k, kbase);
|
|
|
|
return this.curve._wnafMul(this, k);
|
|
};
|
|
|
|
JPoint.prototype.eq = function eq(p) {
|
|
if (p.type === 'affine')
|
|
return this.eq(p.toJ());
|
|
|
|
if (this === p)
|
|
return true;
|
|
|
|
var z2 = this.z.redSqr();
|
|
var pz2 = p.z.redSqr();
|
|
if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
|
|
return false;
|
|
|
|
var z3 = z2.redMul(this.z);
|
|
var pz3 = pz2.redMul(p.z);
|
|
return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
|
|
};
|
|
|
|
JPoint.prototype.eqXToP = function eqXToP(x) {
|
|
var zs = this.z.redSqr();
|
|
var rx = x.toRed(this.curve.red).redMul(zs);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
|
|
var xc = x.clone();
|
|
var t = this.curve.redN.redMul(zs);
|
|
for (;;) {
|
|
xc.iadd(this.curve.n);
|
|
if (xc.cmp(this.curve.p) >= 0)
|
|
return false;
|
|
|
|
rx.redIAdd(t);
|
|
if (this.x.cmp(rx) === 0)
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
JPoint.prototype.inspect = function inspect() {
|
|
if (this.isInfinity())
|
|
return '<EC JPoint Infinity>';
|
|
return '<EC JPoint x: ' + this.x.toString(16, 2) +
|
|
' y: ' + this.y.toString(16, 2) +
|
|
' z: ' + this.z.toString(16, 2) + '>';
|
|
};
|
|
|
|
JPoint.prototype.isInfinity = function isInfinity() {
|
|
return this.z.cmpn(0) === 0;
|
|
};
|
|
|
|
},{"../../elliptic":156,"../curve":159,"bn.js":98,"inherits":190}],162:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var curves = exports;
|
|
|
|
var hash = require('hash.js');
|
|
var elliptic = require('../elliptic');
|
|
|
|
var assert = elliptic.utils.assert;
|
|
|
|
function PresetCurve(options) {
|
|
if (options.type === 'short')
|
|
this.curve = new elliptic.curve.short(options);
|
|
else if (options.type === 'edwards')
|
|
this.curve = new elliptic.curve.edwards(options);
|
|
else
|
|
this.curve = new elliptic.curve.mont(options);
|
|
this.g = this.curve.g;
|
|
this.n = this.curve.n;
|
|
this.hash = options.hash;
|
|
|
|
assert(this.g.validate(), 'Invalid curve');
|
|
assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O');
|
|
}
|
|
curves.PresetCurve = PresetCurve;
|
|
|
|
function defineCurve(name, options) {
|
|
Object.defineProperty(curves, name, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
get: function() {
|
|
var curve = new PresetCurve(options);
|
|
Object.defineProperty(curves, name, {
|
|
configurable: true,
|
|
enumerable: true,
|
|
value: curve
|
|
});
|
|
return curve;
|
|
}
|
|
});
|
|
}
|
|
|
|
defineCurve('p192', {
|
|
type: 'short',
|
|
prime: 'p192',
|
|
p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff',
|
|
a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc',
|
|
b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1',
|
|
n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831',
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
'188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012',
|
|
'07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811'
|
|
]
|
|
});
|
|
|
|
defineCurve('p224', {
|
|
type: 'short',
|
|
prime: 'p224',
|
|
p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001',
|
|
a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe',
|
|
b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4',
|
|
n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d',
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21',
|
|
'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34'
|
|
]
|
|
});
|
|
|
|
defineCurve('p256', {
|
|
type: 'short',
|
|
prime: null,
|
|
p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff',
|
|
a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc',
|
|
b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b',
|
|
n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551',
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
'6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296',
|
|
'4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5'
|
|
]
|
|
});
|
|
|
|
defineCurve('p384', {
|
|
type: 'short',
|
|
prime: null,
|
|
p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'fffffffe ffffffff 00000000 00000000 ffffffff',
|
|
a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'fffffffe ffffffff 00000000 00000000 fffffffc',
|
|
b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' +
|
|
'5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef',
|
|
n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' +
|
|
'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973',
|
|
hash: hash.sha384,
|
|
gRed: false,
|
|
g: [
|
|
'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' +
|
|
'5502f25d bf55296c 3a545e38 72760ab7',
|
|
'3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' +
|
|
'0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'
|
|
]
|
|
});
|
|
|
|
defineCurve('p521', {
|
|
type: 'short',
|
|
prime: null,
|
|
p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'ffffffff ffffffff ffffffff ffffffff ffffffff',
|
|
a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'ffffffff ffffffff ffffffff ffffffff fffffffc',
|
|
b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' +
|
|
'99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' +
|
|
'3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00',
|
|
n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +
|
|
'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' +
|
|
'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409',
|
|
hash: hash.sha512,
|
|
gRed: false,
|
|
g: [
|
|
'000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' +
|
|
'053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' +
|
|
'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66',
|
|
'00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' +
|
|
'579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' +
|
|
'3fad0761 353c7086 a272c240 88be9476 9fd16650'
|
|
]
|
|
});
|
|
|
|
defineCurve('curve25519', {
|
|
type: 'mont',
|
|
prime: 'p25519',
|
|
p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',
|
|
a: '76d06',
|
|
b: '1',
|
|
n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
'9'
|
|
]
|
|
});
|
|
|
|
defineCurve('ed25519', {
|
|
type: 'edwards',
|
|
prime: 'p25519',
|
|
p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',
|
|
a: '-1',
|
|
c: '1',
|
|
d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3',
|
|
n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',
|
|
hash: hash.sha256,
|
|
gRed: false,
|
|
g: [
|
|
'216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a',
|
|
|
|
'6666666666666666666666666666666666666666666666666666666666666658'
|
|
]
|
|
});
|
|
|
|
var pre;
|
|
try {
|
|
pre = require('./precomputed/secp256k1');
|
|
} catch (e) {
|
|
pre = undefined;
|
|
}
|
|
|
|
defineCurve('secp256k1', {
|
|
type: 'short',
|
|
prime: 'k256',
|
|
p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',
|
|
a: '0',
|
|
b: '7',
|
|
n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',
|
|
h: '1',
|
|
hash: hash.sha256,
|
|
|
|
beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',
|
|
lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',
|
|
basis: [
|
|
{
|
|
a: '3086d221a7d46bcde86c90e49284eb15',
|
|
b: '-e4437ed6010e88286f547fa90abfe4c3'
|
|
},
|
|
{
|
|
a: '114ca50f7a8e2f3f657c1108d9d44cfd8',
|
|
b: '3086d221a7d46bcde86c90e49284eb15'
|
|
}
|
|
],
|
|
|
|
gRed: false,
|
|
g: [
|
|
'79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
'483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
|
|
pre
|
|
]
|
|
});
|
|
|
|
},{"../elliptic":156,"./precomputed/secp256k1":169,"hash.js":175}],163:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var BN = require('bn.js');
|
|
var HmacDRBG = require('hmac-drbg');
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var assert = utils.assert;
|
|
|
|
var KeyPair = require('./key');
|
|
var Signature = require('./signature');
|
|
|
|
function EC(options) {
|
|
if (!(this instanceof EC))
|
|
return new EC(options);
|
|
|
|
if (typeof options === 'string') {
|
|
assert(elliptic.curves.hasOwnProperty(options), 'Unknown curve ' + options);
|
|
|
|
options = elliptic.curves[options];
|
|
}
|
|
|
|
if (options instanceof elliptic.curves.PresetCurve)
|
|
options = { curve: options };
|
|
|
|
this.curve = options.curve.curve;
|
|
this.n = this.curve.n;
|
|
this.nh = this.n.ushrn(1);
|
|
this.g = this.curve.g;
|
|
|
|
this.g = options.curve.g;
|
|
this.g.precompute(options.curve.n.bitLength() + 1);
|
|
|
|
this.hash = options.hash || options.curve.hash;
|
|
}
|
|
module.exports = EC;
|
|
|
|
EC.prototype.keyPair = function keyPair(options) {
|
|
return new KeyPair(this, options);
|
|
};
|
|
|
|
EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
|
|
return KeyPair.fromPrivate(this, priv, enc);
|
|
};
|
|
|
|
EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
|
|
return KeyPair.fromPublic(this, pub, enc);
|
|
};
|
|
|
|
EC.prototype.genKeyPair = function genKeyPair(options) {
|
|
if (!options)
|
|
options = {};
|
|
|
|
var drbg = new HmacDRBG({
|
|
hash: this.hash,
|
|
pers: options.pers,
|
|
persEnc: options.persEnc || 'utf8',
|
|
entropy: options.entropy || elliptic.rand(this.hash.hmacStrength),
|
|
entropyEnc: options.entropy && options.entropyEnc || 'utf8',
|
|
nonce: this.n.toArray()
|
|
});
|
|
|
|
var bytes = this.n.byteLength();
|
|
var ns2 = this.n.sub(new BN(2));
|
|
do {
|
|
var priv = new BN(drbg.generate(bytes));
|
|
if (priv.cmp(ns2) > 0)
|
|
continue;
|
|
|
|
priv.iaddn(1);
|
|
return this.keyFromPrivate(priv);
|
|
} while (true);
|
|
};
|
|
|
|
EC.prototype._truncateToN = function truncateToN(msg, truncOnly) {
|
|
var delta = msg.byteLength() * 8 - this.n.bitLength();
|
|
if (delta > 0)
|
|
msg = msg.ushrn(delta);
|
|
if (!truncOnly && msg.cmp(this.n) >= 0)
|
|
return msg.sub(this.n);
|
|
else
|
|
return msg;
|
|
};
|
|
|
|
EC.prototype.sign = function sign(msg, key, enc, options) {
|
|
if (typeof enc === 'object') {
|
|
options = enc;
|
|
enc = null;
|
|
}
|
|
if (!options)
|
|
options = {};
|
|
|
|
key = this.keyFromPrivate(key, enc);
|
|
msg = this._truncateToN(new BN(msg, 16));
|
|
|
|
var bytes = this.n.byteLength();
|
|
var bkey = key.getPrivate().toArray('be', bytes);
|
|
|
|
var nonce = msg.toArray('be', bytes);
|
|
|
|
var drbg = new HmacDRBG({
|
|
hash: this.hash,
|
|
entropy: bkey,
|
|
nonce: nonce,
|
|
pers: options.pers,
|
|
persEnc: options.persEnc || 'utf8'
|
|
});
|
|
|
|
var ns1 = this.n.sub(new BN(1));
|
|
|
|
for (var iter = 0; true; iter++) {
|
|
var k = options.k ?
|
|
options.k(iter) :
|
|
new BN(drbg.generate(this.n.byteLength()));
|
|
k = this._truncateToN(k, true);
|
|
if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
|
|
continue;
|
|
|
|
var kp = this.g.mul(k);
|
|
if (kp.isInfinity())
|
|
continue;
|
|
|
|
var kpX = kp.getX();
|
|
var r = kpX.umod(this.n);
|
|
if (r.cmpn(0) === 0)
|
|
continue;
|
|
|
|
var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
|
|
s = s.umod(this.n);
|
|
if (s.cmpn(0) === 0)
|
|
continue;
|
|
|
|
var recoveryParam = (kp.getY().isOdd() ? 1 : 0) |
|
|
(kpX.cmp(r) !== 0 ? 2 : 0);
|
|
|
|
if (options.canonical && s.cmp(this.nh) > 0) {
|
|
s = this.n.sub(s);
|
|
recoveryParam ^= 1;
|
|
}
|
|
|
|
return new Signature({ r: r, s: s, recoveryParam: recoveryParam });
|
|
}
|
|
};
|
|
|
|
EC.prototype.verify = function verify(msg, signature, key, enc) {
|
|
msg = this._truncateToN(new BN(msg, 16));
|
|
key = this.keyFromPublic(key, enc);
|
|
signature = new Signature(signature, 'hex');
|
|
|
|
var r = signature.r;
|
|
var s = signature.s;
|
|
if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
|
|
return false;
|
|
if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
|
|
return false;
|
|
|
|
var sinv = s.invm(this.n);
|
|
var u1 = sinv.mul(msg).umod(this.n);
|
|
var u2 = sinv.mul(r).umod(this.n);
|
|
|
|
if (!this.curve._maxwellTrick) {
|
|
var p = this.g.mulAdd(u1, key.getPublic(), u2);
|
|
if (p.isInfinity())
|
|
return false;
|
|
|
|
return p.getX().umod(this.n).cmp(r) === 0;
|
|
}
|
|
|
|
|
|
var p = this.g.jmulAdd(u1, key.getPublic(), u2);
|
|
if (p.isInfinity())
|
|
return false;
|
|
|
|
return p.eqXToP(r);
|
|
};
|
|
|
|
EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
|
|
assert((3 & j) === j, 'The recovery param is more than two bits');
|
|
signature = new Signature(signature, enc);
|
|
|
|
var n = this.n;
|
|
var e = new BN(msg);
|
|
var r = signature.r;
|
|
var s = signature.s;
|
|
|
|
var isYOdd = j & 1;
|
|
var isSecondKey = j >> 1;
|
|
if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
|
|
throw new Error('Unable to find sencond key candinate');
|
|
|
|
if (isSecondKey)
|
|
r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
|
|
else
|
|
r = this.curve.pointFromX(r, isYOdd);
|
|
|
|
var rInv = signature.r.invm(n);
|
|
var s1 = n.sub(e).mul(rInv).umod(n);
|
|
var s2 = s.mul(rInv).umod(n);
|
|
|
|
return this.g.mulAdd(s1, r, s2);
|
|
};
|
|
|
|
EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
|
|
signature = new Signature(signature, enc);
|
|
if (signature.recoveryParam !== null)
|
|
return signature.recoveryParam;
|
|
|
|
for (var i = 0; i < 4; i++) {
|
|
var Qprime;
|
|
try {
|
|
Qprime = this.recoverPubKey(e, signature, i);
|
|
} catch (e) {
|
|
continue;
|
|
}
|
|
|
|
if (Qprime.eq(Q))
|
|
return i;
|
|
}
|
|
throw new Error('Unable to find valid recovery factor');
|
|
};
|
|
|
|
},{"../../elliptic":156,"./key":164,"./signature":165,"bn.js":98,"hmac-drbg":187}],164:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var BN = require('bn.js');
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var assert = utils.assert;
|
|
|
|
function KeyPair(ec, options) {
|
|
this.ec = ec;
|
|
this.priv = null;
|
|
this.pub = null;
|
|
|
|
if (options.priv)
|
|
this._importPrivate(options.priv, options.privEnc);
|
|
if (options.pub)
|
|
this._importPublic(options.pub, options.pubEnc);
|
|
}
|
|
module.exports = KeyPair;
|
|
|
|
KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
|
|
if (pub instanceof KeyPair)
|
|
return pub;
|
|
|
|
return new KeyPair(ec, {
|
|
pub: pub,
|
|
pubEnc: enc
|
|
});
|
|
};
|
|
|
|
KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
|
|
if (priv instanceof KeyPair)
|
|
return priv;
|
|
|
|
return new KeyPair(ec, {
|
|
priv: priv,
|
|
privEnc: enc
|
|
});
|
|
};
|
|
|
|
KeyPair.prototype.validate = function validate() {
|
|
var pub = this.getPublic();
|
|
|
|
if (pub.isInfinity())
|
|
return { result: false, reason: 'Invalid public key' };
|
|
if (!pub.validate())
|
|
return { result: false, reason: 'Public key is not a point' };
|
|
if (!pub.mul(this.ec.curve.n).isInfinity())
|
|
return { result: false, reason: 'Public key * N != O' };
|
|
|
|
return { result: true, reason: null };
|
|
};
|
|
|
|
KeyPair.prototype.getPublic = function getPublic(compact, enc) {
|
|
if (typeof compact === 'string') {
|
|
enc = compact;
|
|
compact = null;
|
|
}
|
|
|
|
if (!this.pub)
|
|
this.pub = this.ec.g.mul(this.priv);
|
|
|
|
if (!enc)
|
|
return this.pub;
|
|
|
|
return this.pub.encode(enc, compact);
|
|
};
|
|
|
|
KeyPair.prototype.getPrivate = function getPrivate(enc) {
|
|
if (enc === 'hex')
|
|
return this.priv.toString(16, 2);
|
|
else
|
|
return this.priv;
|
|
};
|
|
|
|
KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
|
|
this.priv = new BN(key, enc || 16);
|
|
|
|
this.priv = this.priv.umod(this.ec.curve.n);
|
|
};
|
|
|
|
KeyPair.prototype._importPublic = function _importPublic(key, enc) {
|
|
if (key.x || key.y) {
|
|
if (this.ec.curve.type === 'mont') {
|
|
assert(key.x, 'Need x coordinate');
|
|
} else if (this.ec.curve.type === 'short' ||
|
|
this.ec.curve.type === 'edwards') {
|
|
assert(key.x && key.y, 'Need both x and y coordinate');
|
|
}
|
|
this.pub = this.ec.curve.point(key.x, key.y);
|
|
return;
|
|
}
|
|
this.pub = this.ec.curve.decodePoint(key, enc);
|
|
};
|
|
|
|
KeyPair.prototype.derive = function derive(pub) {
|
|
return pub.mul(this.priv).getX();
|
|
};
|
|
|
|
KeyPair.prototype.sign = function sign(msg, enc, options) {
|
|
return this.ec.sign(msg, this, enc, options);
|
|
};
|
|
|
|
KeyPair.prototype.verify = function verify(msg, signature) {
|
|
return this.ec.verify(msg, signature, this);
|
|
};
|
|
|
|
KeyPair.prototype.inspect = function inspect() {
|
|
return '<Key priv: ' + (this.priv && this.priv.toString(16, 2)) +
|
|
' pub: ' + (this.pub && this.pub.inspect()) + ' >';
|
|
};
|
|
|
|
},{"../../elliptic":156,"bn.js":98}],165:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var BN = require('bn.js');
|
|
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var assert = utils.assert;
|
|
|
|
function Signature(options, enc) {
|
|
if (options instanceof Signature)
|
|
return options;
|
|
|
|
if (this._importDER(options, enc))
|
|
return;
|
|
|
|
assert(options.r && options.s, 'Signature without r or s');
|
|
this.r = new BN(options.r, 16);
|
|
this.s = new BN(options.s, 16);
|
|
if (options.recoveryParam === undefined)
|
|
this.recoveryParam = null;
|
|
else
|
|
this.recoveryParam = options.recoveryParam;
|
|
}
|
|
module.exports = Signature;
|
|
|
|
function Position() {
|
|
this.place = 0;
|
|
}
|
|
|
|
function getLength(buf, p) {
|
|
var initial = buf[p.place++];
|
|
if (!(initial & 0x80)) {
|
|
return initial;
|
|
}
|
|
var octetLen = initial & 0xf;
|
|
var val = 0;
|
|
for (var i = 0, off = p.place; i < octetLen; i++, off++) {
|
|
val <<= 8;
|
|
val |= buf[off];
|
|
}
|
|
p.place = off;
|
|
return val;
|
|
}
|
|
|
|
function rmPadding(buf) {
|
|
var i = 0;
|
|
var len = buf.length - 1;
|
|
while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) {
|
|
i++;
|
|
}
|
|
if (i === 0) {
|
|
return buf;
|
|
}
|
|
return buf.slice(i);
|
|
}
|
|
|
|
Signature.prototype._importDER = function _importDER(data, enc) {
|
|
data = utils.toArray(data, enc);
|
|
var p = new Position();
|
|
if (data[p.place++] !== 0x30) {
|
|
return false;
|
|
}
|
|
var len = getLength(data, p);
|
|
if ((len + p.place) !== data.length) {
|
|
return false;
|
|
}
|
|
if (data[p.place++] !== 0x02) {
|
|
return false;
|
|
}
|
|
var rlen = getLength(data, p);
|
|
var r = data.slice(p.place, rlen + p.place);
|
|
p.place += rlen;
|
|
if (data[p.place++] !== 0x02) {
|
|
return false;
|
|
}
|
|
var slen = getLength(data, p);
|
|
if (data.length !== slen + p.place) {
|
|
return false;
|
|
}
|
|
var s = data.slice(p.place, slen + p.place);
|
|
if (r[0] === 0 && (r[1] & 0x80)) {
|
|
r = r.slice(1);
|
|
}
|
|
if (s[0] === 0 && (s[1] & 0x80)) {
|
|
s = s.slice(1);
|
|
}
|
|
|
|
this.r = new BN(r);
|
|
this.s = new BN(s);
|
|
this.recoveryParam = null;
|
|
|
|
return true;
|
|
};
|
|
|
|
function constructLength(arr, len) {
|
|
if (len < 0x80) {
|
|
arr.push(len);
|
|
return;
|
|
}
|
|
var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
|
|
arr.push(octets | 0x80);
|
|
while (--octets) {
|
|
arr.push((len >>> (octets << 3)) & 0xff);
|
|
}
|
|
arr.push(len);
|
|
}
|
|
|
|
Signature.prototype.toDER = function toDER(enc) {
|
|
var r = this.r.toArray();
|
|
var s = this.s.toArray();
|
|
|
|
if (r[0] & 0x80)
|
|
r = [ 0 ].concat(r);
|
|
if (s[0] & 0x80)
|
|
s = [ 0 ].concat(s);
|
|
|
|
r = rmPadding(r);
|
|
s = rmPadding(s);
|
|
|
|
while (!s[0] && !(s[1] & 0x80)) {
|
|
s = s.slice(1);
|
|
}
|
|
var arr = [ 0x02 ];
|
|
constructLength(arr, r.length);
|
|
arr = arr.concat(r);
|
|
arr.push(0x02);
|
|
constructLength(arr, s.length);
|
|
var backHalf = arr.concat(s);
|
|
var res = [ 0x30 ];
|
|
constructLength(res, backHalf.length);
|
|
res = res.concat(backHalf);
|
|
return utils.encode(res, enc);
|
|
};
|
|
|
|
},{"../../elliptic":156,"bn.js":98}],166:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var hash = require('hash.js');
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var assert = utils.assert;
|
|
var parseBytes = utils.parseBytes;
|
|
var KeyPair = require('./key');
|
|
var Signature = require('./signature');
|
|
|
|
function EDDSA(curve) {
|
|
assert(curve === 'ed25519', 'only tested with ed25519 so far');
|
|
|
|
if (!(this instanceof EDDSA))
|
|
return new EDDSA(curve);
|
|
|
|
var curve = elliptic.curves[curve].curve;
|
|
this.curve = curve;
|
|
this.g = curve.g;
|
|
this.g.precompute(curve.n.bitLength() + 1);
|
|
|
|
this.pointClass = curve.point().constructor;
|
|
this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
|
|
this.hash = hash.sha512;
|
|
}
|
|
|
|
module.exports = EDDSA;
|
|
|
|
|
|
EDDSA.prototype.sign = function sign(message, secret) {
|
|
message = parseBytes(message);
|
|
var key = this.keyFromSecret(secret);
|
|
var r = this.hashInt(key.messagePrefix(), message);
|
|
var R = this.g.mul(r);
|
|
var Rencoded = this.encodePoint(R);
|
|
var s_ = this.hashInt(Rencoded, key.pubBytes(), message)
|
|
.mul(key.priv());
|
|
var S = r.add(s_).umod(this.curve.n);
|
|
return this.makeSignature({ R: R, S: S, Rencoded: Rencoded });
|
|
};
|
|
|
|
|
|
EDDSA.prototype.verify = function verify(message, sig, pub) {
|
|
message = parseBytes(message);
|
|
sig = this.makeSignature(sig);
|
|
var key = this.keyFromPublic(pub);
|
|
var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
|
|
var SG = this.g.mul(sig.S());
|
|
var RplusAh = sig.R().add(key.pub().mul(h));
|
|
return RplusAh.eq(SG);
|
|
};
|
|
|
|
EDDSA.prototype.hashInt = function hashInt() {
|
|
var hash = this.hash();
|
|
for (var i = 0; i < arguments.length; i++)
|
|
hash.update(arguments[i]);
|
|
return utils.intFromLE(hash.digest()).umod(this.curve.n);
|
|
};
|
|
|
|
EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
|
|
return KeyPair.fromPublic(this, pub);
|
|
};
|
|
|
|
EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
|
|
return KeyPair.fromSecret(this, secret);
|
|
};
|
|
|
|
EDDSA.prototype.makeSignature = function makeSignature(sig) {
|
|
if (sig instanceof Signature)
|
|
return sig;
|
|
return new Signature(this, sig);
|
|
};
|
|
|
|
|
|
EDDSA.prototype.encodePoint = function encodePoint(point) {
|
|
var enc = point.getY().toArray('le', this.encodingLength);
|
|
enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0;
|
|
return enc;
|
|
};
|
|
|
|
EDDSA.prototype.decodePoint = function decodePoint(bytes) {
|
|
bytes = utils.parseBytes(bytes);
|
|
|
|
var lastIx = bytes.length - 1;
|
|
var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80);
|
|
var xIsOdd = (bytes[lastIx] & 0x80) !== 0;
|
|
|
|
var y = utils.intFromLE(normed);
|
|
return this.curve.pointFromY(y, xIsOdd);
|
|
};
|
|
|
|
EDDSA.prototype.encodeInt = function encodeInt(num) {
|
|
return num.toArray('le', this.encodingLength);
|
|
};
|
|
|
|
EDDSA.prototype.decodeInt = function decodeInt(bytes) {
|
|
return utils.intFromLE(bytes);
|
|
};
|
|
|
|
EDDSA.prototype.isPoint = function isPoint(val) {
|
|
return val instanceof this.pointClass;
|
|
};
|
|
|
|
},{"../../elliptic":156,"./key":167,"./signature":168,"hash.js":175}],167:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var assert = utils.assert;
|
|
var parseBytes = utils.parseBytes;
|
|
var cachedProperty = utils.cachedProperty;
|
|
|
|
|
|
function KeyPair(eddsa, params) {
|
|
this.eddsa = eddsa;
|
|
this._secret = parseBytes(params.secret);
|
|
if (eddsa.isPoint(params.pub))
|
|
this._pub = params.pub;
|
|
else
|
|
this._pubBytes = parseBytes(params.pub);
|
|
}
|
|
|
|
KeyPair.fromPublic = function fromPublic(eddsa, pub) {
|
|
if (pub instanceof KeyPair)
|
|
return pub;
|
|
return new KeyPair(eddsa, { pub: pub });
|
|
};
|
|
|
|
KeyPair.fromSecret = function fromSecret(eddsa, secret) {
|
|
if (secret instanceof KeyPair)
|
|
return secret;
|
|
return new KeyPair(eddsa, { secret: secret });
|
|
};
|
|
|
|
KeyPair.prototype.secret = function secret() {
|
|
return this._secret;
|
|
};
|
|
|
|
cachedProperty(KeyPair, 'pubBytes', function pubBytes() {
|
|
return this.eddsa.encodePoint(this.pub());
|
|
});
|
|
|
|
cachedProperty(KeyPair, 'pub', function pub() {
|
|
if (this._pubBytes)
|
|
return this.eddsa.decodePoint(this._pubBytes);
|
|
return this.eddsa.g.mul(this.priv());
|
|
});
|
|
|
|
cachedProperty(KeyPair, 'privBytes', function privBytes() {
|
|
var eddsa = this.eddsa;
|
|
var hash = this.hash();
|
|
var lastIx = eddsa.encodingLength - 1;
|
|
|
|
var a = hash.slice(0, eddsa.encodingLength);
|
|
a[0] &= 248;
|
|
a[lastIx] &= 127;
|
|
a[lastIx] |= 64;
|
|
|
|
return a;
|
|
});
|
|
|
|
cachedProperty(KeyPair, 'priv', function priv() {
|
|
return this.eddsa.decodeInt(this.privBytes());
|
|
});
|
|
|
|
cachedProperty(KeyPair, 'hash', function hash() {
|
|
return this.eddsa.hash().update(this.secret()).digest();
|
|
});
|
|
|
|
cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() {
|
|
return this.hash().slice(this.eddsa.encodingLength);
|
|
});
|
|
|
|
KeyPair.prototype.sign = function sign(message) {
|
|
assert(this._secret, 'KeyPair can only verify');
|
|
return this.eddsa.sign(message, this);
|
|
};
|
|
|
|
KeyPair.prototype.verify = function verify(message, sig) {
|
|
return this.eddsa.verify(message, sig, this);
|
|
};
|
|
|
|
KeyPair.prototype.getSecret = function getSecret(enc) {
|
|
assert(this._secret, 'KeyPair is public only');
|
|
return utils.encode(this.secret(), enc);
|
|
};
|
|
|
|
KeyPair.prototype.getPublic = function getPublic(enc) {
|
|
return utils.encode(this.pubBytes(), enc);
|
|
};
|
|
|
|
module.exports = KeyPair;
|
|
|
|
},{"../../elliptic":156}],168:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var BN = require('bn.js');
|
|
var elliptic = require('../../elliptic');
|
|
var utils = elliptic.utils;
|
|
var assert = utils.assert;
|
|
var cachedProperty = utils.cachedProperty;
|
|
var parseBytes = utils.parseBytes;
|
|
|
|
|
|
function Signature(eddsa, sig) {
|
|
this.eddsa = eddsa;
|
|
|
|
if (typeof sig !== 'object')
|
|
sig = parseBytes(sig);
|
|
|
|
if (Array.isArray(sig)) {
|
|
sig = {
|
|
R: sig.slice(0, eddsa.encodingLength),
|
|
S: sig.slice(eddsa.encodingLength)
|
|
};
|
|
}
|
|
|
|
assert(sig.R && sig.S, 'Signature without R or S');
|
|
|
|
if (eddsa.isPoint(sig.R))
|
|
this._R = sig.R;
|
|
if (sig.S instanceof BN)
|
|
this._S = sig.S;
|
|
|
|
this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
|
|
this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
|
|
}
|
|
|
|
cachedProperty(Signature, 'S', function S() {
|
|
return this.eddsa.decodeInt(this.Sencoded());
|
|
});
|
|
|
|
cachedProperty(Signature, 'R', function R() {
|
|
return this.eddsa.decodePoint(this.Rencoded());
|
|
});
|
|
|
|
cachedProperty(Signature, 'Rencoded', function Rencoded() {
|
|
return this.eddsa.encodePoint(this.R());
|
|
});
|
|
|
|
cachedProperty(Signature, 'Sencoded', function Sencoded() {
|
|
return this.eddsa.encodeInt(this.S());
|
|
});
|
|
|
|
Signature.prototype.toBytes = function toBytes() {
|
|
return this.Rencoded().concat(this.Sencoded());
|
|
};
|
|
|
|
Signature.prototype.toHex = function toHex() {
|
|
return utils.encode(this.toBytes(), 'hex').toUpperCase();
|
|
};
|
|
|
|
module.exports = Signature;
|
|
|
|
},{"../../elliptic":156,"bn.js":98}],169:[function(require,module,exports){
|
|
module.exports = {
|
|
doubles: {
|
|
step: 4,
|
|
points: [
|
|
[
|
|
'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a',
|
|
'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821'
|
|
],
|
|
[
|
|
'8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508',
|
|
'11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf'
|
|
],
|
|
[
|
|
'175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739',
|
|
'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695'
|
|
],
|
|
[
|
|
'363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640',
|
|
'4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9'
|
|
],
|
|
[
|
|
'8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c',
|
|
'4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36'
|
|
],
|
|
[
|
|
'723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda',
|
|
'96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f'
|
|
],
|
|
[
|
|
'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa',
|
|
'5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999'
|
|
],
|
|
[
|
|
'100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0',
|
|
'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09'
|
|
],
|
|
[
|
|
'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d',
|
|
'9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d'
|
|
],
|
|
[
|
|
'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d',
|
|
'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088'
|
|
],
|
|
[
|
|
'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1',
|
|
'9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d'
|
|
],
|
|
[
|
|
'53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0',
|
|
'5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8'
|
|
],
|
|
[
|
|
'8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047',
|
|
'10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a'
|
|
],
|
|
[
|
|
'385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862',
|
|
'283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453'
|
|
],
|
|
[
|
|
'6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7',
|
|
'7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160'
|
|
],
|
|
[
|
|
'3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd',
|
|
'56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0'
|
|
],
|
|
[
|
|
'85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83',
|
|
'7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6'
|
|
],
|
|
[
|
|
'948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a',
|
|
'53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589'
|
|
],
|
|
[
|
|
'6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8',
|
|
'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17'
|
|
],
|
|
[
|
|
'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d',
|
|
'4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda'
|
|
],
|
|
[
|
|
'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725',
|
|
'7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd'
|
|
],
|
|
[
|
|
'213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754',
|
|
'4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2'
|
|
],
|
|
[
|
|
'4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c',
|
|
'17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6'
|
|
],
|
|
[
|
|
'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6',
|
|
'6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f'
|
|
],
|
|
[
|
|
'76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39',
|
|
'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01'
|
|
],
|
|
[
|
|
'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891',
|
|
'893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3'
|
|
],
|
|
[
|
|
'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b',
|
|
'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f'
|
|
],
|
|
[
|
|
'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03',
|
|
'2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7'
|
|
],
|
|
[
|
|
'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d',
|
|
'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78'
|
|
],
|
|
[
|
|
'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070',
|
|
'7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1'
|
|
],
|
|
[
|
|
'90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4',
|
|
'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150'
|
|
],
|
|
[
|
|
'8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da',
|
|
'662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82'
|
|
],
|
|
[
|
|
'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11',
|
|
'1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc'
|
|
],
|
|
[
|
|
'8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e',
|
|
'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b'
|
|
],
|
|
[
|
|
'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41',
|
|
'2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51'
|
|
],
|
|
[
|
|
'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef',
|
|
'67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45'
|
|
],
|
|
[
|
|
'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8',
|
|
'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120'
|
|
],
|
|
[
|
|
'324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d',
|
|
'648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84'
|
|
],
|
|
[
|
|
'4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96',
|
|
'35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d'
|
|
],
|
|
[
|
|
'9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd',
|
|
'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d'
|
|
],
|
|
[
|
|
'6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5',
|
|
'9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8'
|
|
],
|
|
[
|
|
'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266',
|
|
'40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8'
|
|
],
|
|
[
|
|
'7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71',
|
|
'34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac'
|
|
],
|
|
[
|
|
'928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac',
|
|
'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f'
|
|
],
|
|
[
|
|
'85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751',
|
|
'1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962'
|
|
],
|
|
[
|
|
'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e',
|
|
'493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907'
|
|
],
|
|
[
|
|
'827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241',
|
|
'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec'
|
|
],
|
|
[
|
|
'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3',
|
|
'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d'
|
|
],
|
|
[
|
|
'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f',
|
|
'4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414'
|
|
],
|
|
[
|
|
'1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19',
|
|
'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd'
|
|
],
|
|
[
|
|
'146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be',
|
|
'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0'
|
|
],
|
|
[
|
|
'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9',
|
|
'6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811'
|
|
],
|
|
[
|
|
'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2',
|
|
'8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1'
|
|
],
|
|
[
|
|
'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13',
|
|
'7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c'
|
|
],
|
|
[
|
|
'174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c',
|
|
'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73'
|
|
],
|
|
[
|
|
'959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba',
|
|
'2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd'
|
|
],
|
|
[
|
|
'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151',
|
|
'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405'
|
|
],
|
|
[
|
|
'64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073',
|
|
'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589'
|
|
],
|
|
[
|
|
'8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458',
|
|
'38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e'
|
|
],
|
|
[
|
|
'13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b',
|
|
'69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27'
|
|
],
|
|
[
|
|
'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366',
|
|
'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1'
|
|
],
|
|
[
|
|
'8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa',
|
|
'40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482'
|
|
],
|
|
[
|
|
'8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0',
|
|
'620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945'
|
|
],
|
|
[
|
|
'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787',
|
|
'7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573'
|
|
],
|
|
[
|
|
'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e',
|
|
'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82'
|
|
]
|
|
]
|
|
},
|
|
naf: {
|
|
wnd: 7,
|
|
points: [
|
|
[
|
|
'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',
|
|
'388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672'
|
|
],
|
|
[
|
|
'2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4',
|
|
'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6'
|
|
],
|
|
[
|
|
'5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc',
|
|
'6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da'
|
|
],
|
|
[
|
|
'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe',
|
|
'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37'
|
|
],
|
|
[
|
|
'774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb',
|
|
'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b'
|
|
],
|
|
[
|
|
'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8',
|
|
'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81'
|
|
],
|
|
[
|
|
'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e',
|
|
'581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58'
|
|
],
|
|
[
|
|
'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34',
|
|
'4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77'
|
|
],
|
|
[
|
|
'2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c',
|
|
'85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a'
|
|
],
|
|
[
|
|
'352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5',
|
|
'321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c'
|
|
],
|
|
[
|
|
'2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f',
|
|
'2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67'
|
|
],
|
|
[
|
|
'9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714',
|
|
'73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402'
|
|
],
|
|
[
|
|
'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729',
|
|
'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55'
|
|
],
|
|
[
|
|
'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db',
|
|
'2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482'
|
|
],
|
|
[
|
|
'6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4',
|
|
'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82'
|
|
],
|
|
[
|
|
'1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5',
|
|
'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396'
|
|
],
|
|
[
|
|
'605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479',
|
|
'2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49'
|
|
],
|
|
[
|
|
'62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d',
|
|
'80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf'
|
|
],
|
|
[
|
|
'80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f',
|
|
'1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a'
|
|
],
|
|
[
|
|
'7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb',
|
|
'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7'
|
|
],
|
|
[
|
|
'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9',
|
|
'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933'
|
|
],
|
|
[
|
|
'49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963',
|
|
'758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a'
|
|
],
|
|
[
|
|
'77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74',
|
|
'958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6'
|
|
],
|
|
[
|
|
'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530',
|
|
'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37'
|
|
],
|
|
[
|
|
'463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b',
|
|
'5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e'
|
|
],
|
|
[
|
|
'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247',
|
|
'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6'
|
|
],
|
|
[
|
|
'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1',
|
|
'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476'
|
|
],
|
|
[
|
|
'2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120',
|
|
'4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40'
|
|
],
|
|
[
|
|
'7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435',
|
|
'91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61'
|
|
],
|
|
[
|
|
'754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18',
|
|
'673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683'
|
|
],
|
|
[
|
|
'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8',
|
|
'59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5'
|
|
],
|
|
[
|
|
'186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb',
|
|
'3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b'
|
|
],
|
|
[
|
|
'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f',
|
|
'55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417'
|
|
],
|
|
[
|
|
'5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143',
|
|
'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868'
|
|
],
|
|
[
|
|
'290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba',
|
|
'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a'
|
|
],
|
|
[
|
|
'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45',
|
|
'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6'
|
|
],
|
|
[
|
|
'766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a',
|
|
'744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996'
|
|
],
|
|
[
|
|
'59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e',
|
|
'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e'
|
|
],
|
|
[
|
|
'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8',
|
|
'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d'
|
|
],
|
|
[
|
|
'7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c',
|
|
'30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2'
|
|
],
|
|
[
|
|
'948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519',
|
|
'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e'
|
|
],
|
|
[
|
|
'7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab',
|
|
'100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437'
|
|
],
|
|
[
|
|
'3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca',
|
|
'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311'
|
|
],
|
|
[
|
|
'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf',
|
|
'8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4'
|
|
],
|
|
[
|
|
'1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610',
|
|
'68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575'
|
|
],
|
|
[
|
|
'733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4',
|
|
'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d'
|
|
],
|
|
[
|
|
'15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c',
|
|
'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d'
|
|
],
|
|
[
|
|
'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940',
|
|
'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629'
|
|
],
|
|
[
|
|
'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980',
|
|
'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06'
|
|
],
|
|
[
|
|
'311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3',
|
|
'66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374'
|
|
],
|
|
[
|
|
'34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf',
|
|
'9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee'
|
|
],
|
|
[
|
|
'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63',
|
|
'4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1'
|
|
],
|
|
[
|
|
'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448',
|
|
'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b'
|
|
],
|
|
[
|
|
'32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf',
|
|
'5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661'
|
|
],
|
|
[
|
|
'7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5',
|
|
'8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6'
|
|
],
|
|
[
|
|
'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6',
|
|
'8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e'
|
|
],
|
|
[
|
|
'16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5',
|
|
'5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d'
|
|
],
|
|
[
|
|
'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99',
|
|
'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc'
|
|
],
|
|
[
|
|
'78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51',
|
|
'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4'
|
|
],
|
|
[
|
|
'494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5',
|
|
'42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c'
|
|
],
|
|
[
|
|
'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5',
|
|
'204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b'
|
|
],
|
|
[
|
|
'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997',
|
|
'4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913'
|
|
],
|
|
[
|
|
'841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881',
|
|
'73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154'
|
|
],
|
|
[
|
|
'5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5',
|
|
'39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865'
|
|
],
|
|
[
|
|
'36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66',
|
|
'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc'
|
|
],
|
|
[
|
|
'336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726',
|
|
'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224'
|
|
],
|
|
[
|
|
'8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede',
|
|
'6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e'
|
|
],
|
|
[
|
|
'1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94',
|
|
'60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6'
|
|
],
|
|
[
|
|
'85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31',
|
|
'3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511'
|
|
],
|
|
[
|
|
'29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51',
|
|
'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b'
|
|
],
|
|
[
|
|
'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252',
|
|
'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2'
|
|
],
|
|
[
|
|
'4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5',
|
|
'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c'
|
|
],
|
|
[
|
|
'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b',
|
|
'6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3'
|
|
],
|
|
[
|
|
'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4',
|
|
'322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d'
|
|
],
|
|
[
|
|
'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f',
|
|
'6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700'
|
|
],
|
|
[
|
|
'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889',
|
|
'2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4'
|
|
],
|
|
[
|
|
'591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246',
|
|
'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196'
|
|
],
|
|
[
|
|
'11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984',
|
|
'998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4'
|
|
],
|
|
[
|
|
'3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a',
|
|
'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257'
|
|
],
|
|
[
|
|
'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030',
|
|
'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13'
|
|
],
|
|
[
|
|
'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197',
|
|
'6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096'
|
|
],
|
|
[
|
|
'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593',
|
|
'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38'
|
|
],
|
|
[
|
|
'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef',
|
|
'21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f'
|
|
],
|
|
[
|
|
'347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38',
|
|
'60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448'
|
|
],
|
|
[
|
|
'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a',
|
|
'49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a'
|
|
],
|
|
[
|
|
'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111',
|
|
'5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4'
|
|
],
|
|
[
|
|
'4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502',
|
|
'7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437'
|
|
],
|
|
[
|
|
'3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea',
|
|
'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7'
|
|
],
|
|
[
|
|
'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26',
|
|
'8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d'
|
|
],
|
|
[
|
|
'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986',
|
|
'39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a'
|
|
],
|
|
[
|
|
'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e',
|
|
'62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54'
|
|
],
|
|
[
|
|
'48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4',
|
|
'25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77'
|
|
],
|
|
[
|
|
'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda',
|
|
'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517'
|
|
],
|
|
[
|
|
'6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859',
|
|
'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10'
|
|
],
|
|
[
|
|
'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f',
|
|
'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125'
|
|
],
|
|
[
|
|
'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c',
|
|
'6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e'
|
|
],
|
|
[
|
|
'13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942',
|
|
'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1'
|
|
],
|
|
[
|
|
'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a',
|
|
'1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2'
|
|
],
|
|
[
|
|
'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80',
|
|
'5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423'
|
|
],
|
|
[
|
|
'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d',
|
|
'438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8'
|
|
],
|
|
[
|
|
'8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1',
|
|
'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758'
|
|
],
|
|
[
|
|
'52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63',
|
|
'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375'
|
|
],
|
|
[
|
|
'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352',
|
|
'6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d'
|
|
],
|
|
[
|
|
'7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193',
|
|
'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec'
|
|
],
|
|
[
|
|
'5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00',
|
|
'9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0'
|
|
],
|
|
[
|
|
'32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58',
|
|
'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c'
|
|
],
|
|
[
|
|
'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7',
|
|
'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4'
|
|
],
|
|
[
|
|
'8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8',
|
|
'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f'
|
|
],
|
|
[
|
|
'4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e',
|
|
'67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649'
|
|
],
|
|
[
|
|
'3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d',
|
|
'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826'
|
|
],
|
|
[
|
|
'674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b',
|
|
'299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5'
|
|
],
|
|
[
|
|
'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f',
|
|
'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87'
|
|
],
|
|
[
|
|
'30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6',
|
|
'462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b'
|
|
],
|
|
[
|
|
'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297',
|
|
'62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc'
|
|
],
|
|
[
|
|
'93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a',
|
|
'7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c'
|
|
],
|
|
[
|
|
'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c',
|
|
'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f'
|
|
],
|
|
[
|
|
'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52',
|
|
'4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a'
|
|
],
|
|
[
|
|
'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb',
|
|
'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46'
|
|
],
|
|
[
|
|
'463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065',
|
|
'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f'
|
|
],
|
|
[
|
|
'7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917',
|
|
'603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03'
|
|
],
|
|
[
|
|
'74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9',
|
|
'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08'
|
|
],
|
|
[
|
|
'30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3',
|
|
'553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8'
|
|
],
|
|
[
|
|
'9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57',
|
|
'712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373'
|
|
],
|
|
[
|
|
'176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66',
|
|
'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3'
|
|
],
|
|
[
|
|
'75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8',
|
|
'9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8'
|
|
],
|
|
[
|
|
'809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721',
|
|
'9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1'
|
|
],
|
|
[
|
|
'1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180',
|
|
'4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9'
|
|
]
|
|
]
|
|
}
|
|
};
|
|
|
|
},{}],170:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = exports;
|
|
var BN = require('bn.js');
|
|
var minAssert = require('minimalistic-assert');
|
|
var minUtils = require('minimalistic-crypto-utils');
|
|
|
|
utils.assert = minAssert;
|
|
utils.toArray = minUtils.toArray;
|
|
utils.zero2 = minUtils.zero2;
|
|
utils.toHex = minUtils.toHex;
|
|
utils.encode = minUtils.encode;
|
|
|
|
function getNAF(num, w) {
|
|
var naf = [];
|
|
var ws = 1 << (w + 1);
|
|
var k = num.clone();
|
|
while (k.cmpn(1) >= 0) {
|
|
var z;
|
|
if (k.isOdd()) {
|
|
var mod = k.andln(ws - 1);
|
|
if (mod > (ws >> 1) - 1)
|
|
z = (ws >> 1) - mod;
|
|
else
|
|
z = mod;
|
|
k.isubn(z);
|
|
} else {
|
|
z = 0;
|
|
}
|
|
naf.push(z);
|
|
|
|
var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1;
|
|
for (var i = 1; i < shift; i++)
|
|
naf.push(0);
|
|
k.iushrn(shift);
|
|
}
|
|
|
|
return naf;
|
|
}
|
|
utils.getNAF = getNAF;
|
|
|
|
function getJSF(k1, k2) {
|
|
var jsf = [
|
|
[],
|
|
[]
|
|
];
|
|
|
|
k1 = k1.clone();
|
|
k2 = k2.clone();
|
|
var d1 = 0;
|
|
var d2 = 0;
|
|
while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
|
|
|
|
var m14 = (k1.andln(3) + d1) & 3;
|
|
var m24 = (k2.andln(3) + d2) & 3;
|
|
if (m14 === 3)
|
|
m14 = -1;
|
|
if (m24 === 3)
|
|
m24 = -1;
|
|
var u1;
|
|
if ((m14 & 1) === 0) {
|
|
u1 = 0;
|
|
} else {
|
|
var m8 = (k1.andln(7) + d1) & 7;
|
|
if ((m8 === 3 || m8 === 5) && m24 === 2)
|
|
u1 = -m14;
|
|
else
|
|
u1 = m14;
|
|
}
|
|
jsf[0].push(u1);
|
|
|
|
var u2;
|
|
if ((m24 & 1) === 0) {
|
|
u2 = 0;
|
|
} else {
|
|
var m8 = (k2.andln(7) + d2) & 7;
|
|
if ((m8 === 3 || m8 === 5) && m14 === 2)
|
|
u2 = -m24;
|
|
else
|
|
u2 = m24;
|
|
}
|
|
jsf[1].push(u2);
|
|
|
|
if (2 * d1 === u1 + 1)
|
|
d1 = 1 - d1;
|
|
if (2 * d2 === u2 + 1)
|
|
d2 = 1 - d2;
|
|
k1.iushrn(1);
|
|
k2.iushrn(1);
|
|
}
|
|
|
|
return jsf;
|
|
}
|
|
utils.getJSF = getJSF;
|
|
|
|
function cachedProperty(obj, name, computer) {
|
|
var key = '_' + name;
|
|
obj.prototype[name] = function cachedProperty() {
|
|
return this[key] !== undefined ? this[key] :
|
|
this[key] = computer.call(this);
|
|
};
|
|
}
|
|
utils.cachedProperty = cachedProperty;
|
|
|
|
function parseBytes(bytes) {
|
|
return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') :
|
|
bytes;
|
|
}
|
|
utils.parseBytes = parseBytes;
|
|
|
|
function intFromLE(bytes) {
|
|
return new BN(bytes, 'hex', 'le');
|
|
}
|
|
utils.intFromLE = intFromLE;
|
|
|
|
|
|
},{"bn.js":98,"minimalistic-assert":245,"minimalistic-crypto-utils":246}],171:[function(require,module,exports){
|
|
module.exports={
|
|
"_args": [
|
|
[
|
|
{
|
|
"raw": "elliptic@^6.0.0",
|
|
"scope": null,
|
|
"escapedName": "elliptic",
|
|
"name": "elliptic",
|
|
"rawSpec": "^6.0.0",
|
|
"spec": ">=6.0.0 <7.0.0",
|
|
"type": "range"
|
|
},
|
|
"/var/lib/jenkins/jobs/jibo-server-client/workspace/node_modules/browserify-sign"
|
|
]
|
|
],
|
|
"_from": "elliptic@>=6.0.0 <7.0.0",
|
|
"_id": "elliptic@6.4.0",
|
|
"_inCache": true,
|
|
"_installable": true,
|
|
"_location": "/elliptic",
|
|
"_nodeVersion": "7.0.0",
|
|
"_npmOperationalInternal": {
|
|
"host": "packages-18-east.internal.npmjs.com",
|
|
"tmp": "tmp/elliptic-6.4.0.tgz_1487798866428_0.30510620190761983"
|
|
},
|
|
"_npmUser": {
|
|
"name": "indutny",
|
|
"email": "fedor@indutny.com"
|
|
},
|
|
"_npmVersion": "3.10.8",
|
|
"_phantomChildren": {},
|
|
"_requested": {
|
|
"raw": "elliptic@^6.0.0",
|
|
"scope": null,
|
|
"escapedName": "elliptic",
|
|
"name": "elliptic",
|
|
"rawSpec": "^6.0.0",
|
|
"spec": ">=6.0.0 <7.0.0",
|
|
"type": "range"
|
|
},
|
|
"_requiredBy": [
|
|
"/browserify-sign",
|
|
"/create-ecdh"
|
|
],
|
|
"_resolved": "http://10.0.0.106:8080/e/elliptic/_attachments/elliptic-6.4.0.tgz",
|
|
"_shasum": "cac9af8762c85836187003c8dfe193e5e2eae5df",
|
|
"_shrinkwrap": null,
|
|
"_spec": "elliptic@^6.0.0",
|
|
"_where": "/var/lib/jenkins/jobs/jibo-server-client/workspace/node_modules/browserify-sign",
|
|
"author": {
|
|
"name": "Fedor Indutny",
|
|
"email": "fedor@indutny.com"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/indutny/elliptic/issues"
|
|
},
|
|
"dependencies": {
|
|
"bn.js": "^4.4.0",
|
|
"brorand": "^1.0.1",
|
|
"hash.js": "^1.0.0",
|
|
"hmac-drbg": "^1.0.0",
|
|
"inherits": "^2.0.1",
|
|
"minimalistic-assert": "^1.0.0",
|
|
"minimalistic-crypto-utils": "^1.0.0"
|
|
},
|
|
"description": "EC cryptography",
|
|
"devDependencies": {
|
|
"brfs": "^1.4.3",
|
|
"coveralls": "^2.11.3",
|
|
"grunt": "^0.4.5",
|
|
"grunt-browserify": "^5.0.0",
|
|
"grunt-cli": "^1.2.0",
|
|
"grunt-contrib-connect": "^1.0.0",
|
|
"grunt-contrib-copy": "^1.0.0",
|
|
"grunt-contrib-uglify": "^1.0.1",
|
|
"grunt-mocha-istanbul": "^3.0.1",
|
|
"grunt-saucelabs": "^8.6.2",
|
|
"istanbul": "^0.4.2",
|
|
"jscs": "^2.9.0",
|
|
"jshint": "^2.6.0",
|
|
"mocha": "^2.1.0"
|
|
},
|
|
"directories": {},
|
|
"dist": {
|
|
"shasum": "cac9af8762c85836187003c8dfe193e5e2eae5df",
|
|
"tarball": "http://10.0.0.106:8080/e/elliptic/_attachments/elliptic-6.4.0.tgz"
|
|
},
|
|
"files": [
|
|
"lib"
|
|
],
|
|
"gitHead": "6b0d2b76caae91471649c8e21f0b1d3ba0f96090",
|
|
"homepage": "https://github.com/indutny/elliptic",
|
|
"keywords": [
|
|
"EC",
|
|
"Elliptic",
|
|
"curve",
|
|
"Cryptography"
|
|
],
|
|
"license": "MIT",
|
|
"main": "lib/elliptic.js",
|
|
"maintainers": [
|
|
{
|
|
"name": "indutny",
|
|
"email": "fedor@indutny.com"
|
|
}
|
|
],
|
|
"name": "elliptic",
|
|
"optionalDependencies": {},
|
|
"readme": "ERROR: No README data found!",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+ssh://git@github.com/indutny/elliptic.git"
|
|
},
|
|
"scripts": {
|
|
"jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",
|
|
"jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",
|
|
"lint": "npm run jscs && npm run jshint",
|
|
"test": "npm run lint && npm run unit",
|
|
"unit": "istanbul test _mocha --reporter=spec test/index.js",
|
|
"version": "grunt dist && git add dist/"
|
|
},
|
|
"version": "6.4.0"
|
|
}
|
|
|
|
},{}],172:[function(require,module,exports){
|
|
|
|
function EventEmitter() {
|
|
this._events = this._events || {};
|
|
this._maxListeners = this._maxListeners || undefined;
|
|
}
|
|
module.exports = EventEmitter;
|
|
|
|
EventEmitter.EventEmitter = EventEmitter;
|
|
|
|
EventEmitter.prototype._events = undefined;
|
|
EventEmitter.prototype._maxListeners = undefined;
|
|
|
|
EventEmitter.defaultMaxListeners = 10;
|
|
|
|
EventEmitter.prototype.setMaxListeners = function(n) {
|
|
if (!isNumber(n) || n < 0 || isNaN(n))
|
|
throw TypeError('n must be a positive number');
|
|
this._maxListeners = n;
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.emit = function(type) {
|
|
var er, handler, len, args, i, listeners;
|
|
|
|
if (!this._events)
|
|
this._events = {};
|
|
|
|
if (type === 'error') {
|
|
if (!this._events.error ||
|
|
(isObject(this._events.error) && !this._events.error.length)) {
|
|
er = arguments[1];
|
|
if (er instanceof Error) {
|
|
throw er; // Unhandled 'error' event
|
|
} else {
|
|
var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
|
|
err.context = er;
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
handler = this._events[type];
|
|
|
|
if (isUndefined(handler))
|
|
return false;
|
|
|
|
if (isFunction(handler)) {
|
|
switch (arguments.length) {
|
|
case 1:
|
|
handler.call(this);
|
|
break;
|
|
case 2:
|
|
handler.call(this, arguments[1]);
|
|
break;
|
|
case 3:
|
|
handler.call(this, arguments[1], arguments[2]);
|
|
break;
|
|
default:
|
|
args = Array.prototype.slice.call(arguments, 1);
|
|
handler.apply(this, args);
|
|
}
|
|
} else if (isObject(handler)) {
|
|
args = Array.prototype.slice.call(arguments, 1);
|
|
listeners = handler.slice();
|
|
len = listeners.length;
|
|
for (i = 0; i < len; i++)
|
|
listeners[i].apply(this, args);
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
EventEmitter.prototype.addListener = function(type, listener) {
|
|
var m;
|
|
|
|
if (!isFunction(listener))
|
|
throw TypeError('listener must be a function');
|
|
|
|
if (!this._events)
|
|
this._events = {};
|
|
|
|
if (this._events.newListener)
|
|
this.emit('newListener', type,
|
|
isFunction(listener.listener) ?
|
|
listener.listener : listener);
|
|
|
|
if (!this._events[type])
|
|
this._events[type] = listener;
|
|
else if (isObject(this._events[type]))
|
|
this._events[type].push(listener);
|
|
else
|
|
this._events[type] = [this._events[type], listener];
|
|
|
|
if (isObject(this._events[type]) && !this._events[type].warned) {
|
|
if (!isUndefined(this._maxListeners)) {
|
|
m = this._maxListeners;
|
|
} else {
|
|
m = EventEmitter.defaultMaxListeners;
|
|
}
|
|
|
|
if (m && m > 0 && this._events[type].length > m) {
|
|
this._events[type].warned = true;
|
|
console.error('(node) warning: possible EventEmitter memory ' +
|
|
'leak detected. %d listeners added. ' +
|
|
'Use emitter.setMaxListeners() to increase limit.',
|
|
this._events[type].length);
|
|
if (typeof console.trace === 'function') {
|
|
console.trace();
|
|
}
|
|
}
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|
|
|
EventEmitter.prototype.once = function(type, listener) {
|
|
if (!isFunction(listener))
|
|
throw TypeError('listener must be a function');
|
|
|
|
var fired = false;
|
|
|
|
function g() {
|
|
this.removeListener(type, g);
|
|
|
|
if (!fired) {
|
|
fired = true;
|
|
listener.apply(this, arguments);
|
|
}
|
|
}
|
|
|
|
g.listener = listener;
|
|
this.on(type, g);
|
|
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.removeListener = function(type, listener) {
|
|
var list, position, length, i;
|
|
|
|
if (!isFunction(listener))
|
|
throw TypeError('listener must be a function');
|
|
|
|
if (!this._events || !this._events[type])
|
|
return this;
|
|
|
|
list = this._events[type];
|
|
length = list.length;
|
|
position = -1;
|
|
|
|
if (list === listener ||
|
|
(isFunction(list.listener) && list.listener === listener)) {
|
|
delete this._events[type];
|
|
if (this._events.removeListener)
|
|
this.emit('removeListener', type, listener);
|
|
|
|
} else if (isObject(list)) {
|
|
for (i = length; i-- > 0;) {
|
|
if (list[i] === listener ||
|
|
(list[i].listener && list[i].listener === listener)) {
|
|
position = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (position < 0)
|
|
return this;
|
|
|
|
if (list.length === 1) {
|
|
list.length = 0;
|
|
delete this._events[type];
|
|
} else {
|
|
list.splice(position, 1);
|
|
}
|
|
|
|
if (this._events.removeListener)
|
|
this.emit('removeListener', type, listener);
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.removeAllListeners = function(type) {
|
|
var key, listeners;
|
|
|
|
if (!this._events)
|
|
return this;
|
|
|
|
if (!this._events.removeListener) {
|
|
if (arguments.length === 0)
|
|
this._events = {};
|
|
else if (this._events[type])
|
|
delete this._events[type];
|
|
return this;
|
|
}
|
|
|
|
if (arguments.length === 0) {
|
|
for (key in this._events) {
|
|
if (key === 'removeListener') continue;
|
|
this.removeAllListeners(key);
|
|
}
|
|
this.removeAllListeners('removeListener');
|
|
this._events = {};
|
|
return this;
|
|
}
|
|
|
|
listeners = this._events[type];
|
|
|
|
if (isFunction(listeners)) {
|
|
this.removeListener(type, listeners);
|
|
} else if (listeners) {
|
|
while (listeners.length)
|
|
this.removeListener(type, listeners[listeners.length - 1]);
|
|
}
|
|
delete this._events[type];
|
|
|
|
return this;
|
|
};
|
|
|
|
EventEmitter.prototype.listeners = function(type) {
|
|
var ret;
|
|
if (!this._events || !this._events[type])
|
|
ret = [];
|
|
else if (isFunction(this._events[type]))
|
|
ret = [this._events[type]];
|
|
else
|
|
ret = this._events[type].slice();
|
|
return ret;
|
|
};
|
|
|
|
EventEmitter.prototype.listenerCount = function(type) {
|
|
if (this._events) {
|
|
var evlistener = this._events[type];
|
|
|
|
if (isFunction(evlistener))
|
|
return 1;
|
|
else if (evlistener)
|
|
return evlistener.length;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
EventEmitter.listenerCount = function(emitter, type) {
|
|
return emitter.listenerCount(type);
|
|
};
|
|
|
|
function isFunction(arg) {
|
|
return typeof arg === 'function';
|
|
}
|
|
|
|
function isNumber(arg) {
|
|
return typeof arg === 'number';
|
|
}
|
|
|
|
function isObject(arg) {
|
|
return typeof arg === 'object' && arg !== null;
|
|
}
|
|
|
|
function isUndefined(arg) {
|
|
return arg === void 0;
|
|
}
|
|
|
|
},{}],173:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var MD5 = require('md5.js')
|
|
|
|
|
|
function EVP_BytesToKey (password, salt, keyBits, ivLen) {
|
|
if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary')
|
|
if (salt) {
|
|
if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary')
|
|
if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length')
|
|
}
|
|
|
|
var keyLen = keyBits / 8
|
|
var key = Buffer.alloc(keyLen)
|
|
var iv = Buffer.alloc(ivLen || 0)
|
|
var tmp = Buffer.alloc(0)
|
|
|
|
while (keyLen > 0 || ivLen > 0) {
|
|
var hash = new MD5()
|
|
hash.update(tmp)
|
|
hash.update(password)
|
|
if (salt) hash.update(salt)
|
|
tmp = hash.digest()
|
|
|
|
var used = 0
|
|
|
|
if (keyLen > 0) {
|
|
var keyStart = key.length - keyLen
|
|
used = Math.min(keyLen, tmp.length)
|
|
tmp.copy(key, keyStart, 0, used)
|
|
keyLen -= used
|
|
}
|
|
|
|
if (used < tmp.length && ivLen > 0) {
|
|
var ivStart = iv.length - ivLen
|
|
var length = Math.min(ivLen, tmp.length - used)
|
|
tmp.copy(iv, ivStart, used, used + length)
|
|
ivLen -= length
|
|
}
|
|
}
|
|
|
|
tmp.fill(0)
|
|
return { key: key, iv: iv }
|
|
}
|
|
|
|
module.exports = EVP_BytesToKey
|
|
|
|
},{"md5.js":242,"safe-buffer":305}],174:[function(require,module,exports){
|
|
(function (Buffer){
|
|
'use strict'
|
|
var Transform = require('stream').Transform
|
|
var inherits = require('inherits')
|
|
|
|
function HashBase (blockSize) {
|
|
Transform.call(this)
|
|
|
|
this._block = new Buffer(blockSize)
|
|
this._blockSize = blockSize
|
|
this._blockOffset = 0
|
|
this._length = [0, 0, 0, 0]
|
|
|
|
this._finalized = false
|
|
}
|
|
|
|
inherits(HashBase, Transform)
|
|
|
|
HashBase.prototype._transform = function (chunk, encoding, callback) {
|
|
var error = null
|
|
try {
|
|
if (encoding !== 'buffer') chunk = new Buffer(chunk, encoding)
|
|
this.update(chunk)
|
|
} catch (err) {
|
|
error = err
|
|
}
|
|
|
|
callback(error)
|
|
}
|
|
|
|
HashBase.prototype._flush = function (callback) {
|
|
var error = null
|
|
try {
|
|
this.push(this._digest())
|
|
} catch (err) {
|
|
error = err
|
|
}
|
|
|
|
callback(error)
|
|
}
|
|
|
|
HashBase.prototype.update = function (data, encoding) {
|
|
if (!Buffer.isBuffer(data) && typeof data !== 'string') throw new TypeError('Data must be a string or a buffer')
|
|
if (this._finalized) throw new Error('Digest already called')
|
|
if (!Buffer.isBuffer(data)) data = new Buffer(data, encoding || 'binary')
|
|
|
|
var block = this._block
|
|
var offset = 0
|
|
while (this._blockOffset + data.length - offset >= this._blockSize) {
|
|
for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++]
|
|
this._update()
|
|
this._blockOffset = 0
|
|
}
|
|
while (offset < data.length) block[this._blockOffset++] = data[offset++]
|
|
|
|
for (var j = 0, carry = data.length * 8; carry > 0; ++j) {
|
|
this._length[j] += carry
|
|
carry = (this._length[j] / 0x0100000000) | 0
|
|
if (carry > 0) this._length[j] -= 0x0100000000 * carry
|
|
}
|
|
|
|
return this
|
|
}
|
|
|
|
HashBase.prototype._update = function (data) {
|
|
throw new Error('_update is not implemented')
|
|
}
|
|
|
|
HashBase.prototype.digest = function (encoding) {
|
|
if (this._finalized) throw new Error('Digest already called')
|
|
this._finalized = true
|
|
|
|
var digest = this._digest()
|
|
if (encoding !== undefined) digest = digest.toString(encoding)
|
|
return digest
|
|
}
|
|
|
|
HashBase.prototype._digest = function () {
|
|
throw new Error('_digest is not implemented')
|
|
}
|
|
|
|
module.exports = HashBase
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130,"inherits":190,"stream":314}],175:[function(require,module,exports){
|
|
var hash = exports;
|
|
|
|
hash.utils = require('./hash/utils');
|
|
hash.common = require('./hash/common');
|
|
hash.sha = require('./hash/sha');
|
|
hash.ripemd = require('./hash/ripemd');
|
|
hash.hmac = require('./hash/hmac');
|
|
|
|
hash.sha1 = hash.sha.sha1;
|
|
hash.sha256 = hash.sha.sha256;
|
|
hash.sha224 = hash.sha.sha224;
|
|
hash.sha384 = hash.sha.sha384;
|
|
hash.sha512 = hash.sha.sha512;
|
|
hash.ripemd160 = hash.ripemd.ripemd160;
|
|
|
|
},{"./hash/common":176,"./hash/hmac":177,"./hash/ripemd":178,"./hash/sha":179,"./hash/utils":186}],176:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('./utils');
|
|
var assert = require('minimalistic-assert');
|
|
|
|
function BlockHash() {
|
|
this.pending = null;
|
|
this.pendingTotal = 0;
|
|
this.blockSize = this.constructor.blockSize;
|
|
this.outSize = this.constructor.outSize;
|
|
this.hmacStrength = this.constructor.hmacStrength;
|
|
this.padLength = this.constructor.padLength / 8;
|
|
this.endian = 'big';
|
|
|
|
this._delta8 = this.blockSize / 8;
|
|
this._delta32 = this.blockSize / 32;
|
|
}
|
|
exports.BlockHash = BlockHash;
|
|
|
|
BlockHash.prototype.update = function update(msg, enc) {
|
|
msg = utils.toArray(msg, enc);
|
|
if (!this.pending)
|
|
this.pending = msg;
|
|
else
|
|
this.pending = this.pending.concat(msg);
|
|
this.pendingTotal += msg.length;
|
|
|
|
if (this.pending.length >= this._delta8) {
|
|
msg = this.pending;
|
|
|
|
var r = msg.length % this._delta8;
|
|
this.pending = msg.slice(msg.length - r, msg.length);
|
|
if (this.pending.length === 0)
|
|
this.pending = null;
|
|
|
|
msg = utils.join32(msg, 0, msg.length - r, this.endian);
|
|
for (var i = 0; i < msg.length; i += this._delta32)
|
|
this._update(msg, i, i + this._delta32);
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
BlockHash.prototype.digest = function digest(enc) {
|
|
this.update(this._pad());
|
|
assert(this.pending === null);
|
|
|
|
return this._digest(enc);
|
|
};
|
|
|
|
BlockHash.prototype._pad = function pad() {
|
|
var len = this.pendingTotal;
|
|
var bytes = this._delta8;
|
|
var k = bytes - ((len + this.padLength) % bytes);
|
|
var res = new Array(k + this.padLength);
|
|
res[0] = 0x80;
|
|
for (var i = 1; i < k; i++)
|
|
res[i] = 0;
|
|
|
|
len <<= 3;
|
|
if (this.endian === 'big') {
|
|
for (var t = 8; t < this.padLength; t++)
|
|
res[i++] = 0;
|
|
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = (len >>> 24) & 0xff;
|
|
res[i++] = (len >>> 16) & 0xff;
|
|
res[i++] = (len >>> 8) & 0xff;
|
|
res[i++] = len & 0xff;
|
|
} else {
|
|
res[i++] = len & 0xff;
|
|
res[i++] = (len >>> 8) & 0xff;
|
|
res[i++] = (len >>> 16) & 0xff;
|
|
res[i++] = (len >>> 24) & 0xff;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
res[i++] = 0;
|
|
|
|
for (t = 8; t < this.padLength; t++)
|
|
res[i++] = 0;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
},{"./utils":186,"minimalistic-assert":245}],177:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('./utils');
|
|
var assert = require('minimalistic-assert');
|
|
|
|
function Hmac(hash, key, enc) {
|
|
if (!(this instanceof Hmac))
|
|
return new Hmac(hash, key, enc);
|
|
this.Hash = hash;
|
|
this.blockSize = hash.blockSize / 8;
|
|
this.outSize = hash.outSize / 8;
|
|
this.inner = null;
|
|
this.outer = null;
|
|
|
|
this._init(utils.toArray(key, enc));
|
|
}
|
|
module.exports = Hmac;
|
|
|
|
Hmac.prototype._init = function init(key) {
|
|
if (key.length > this.blockSize)
|
|
key = new this.Hash().update(key).digest();
|
|
assert(key.length <= this.blockSize);
|
|
|
|
for (var i = key.length; i < this.blockSize; i++)
|
|
key.push(0);
|
|
|
|
for (i = 0; i < key.length; i++)
|
|
key[i] ^= 0x36;
|
|
this.inner = new this.Hash().update(key);
|
|
|
|
for (i = 0; i < key.length; i++)
|
|
key[i] ^= 0x6a;
|
|
this.outer = new this.Hash().update(key);
|
|
};
|
|
|
|
Hmac.prototype.update = function update(msg, enc) {
|
|
this.inner.update(msg, enc);
|
|
return this;
|
|
};
|
|
|
|
Hmac.prototype.digest = function digest(enc) {
|
|
this.outer.update(this.inner.digest());
|
|
return this.outer.digest(enc);
|
|
};
|
|
|
|
},{"./utils":186,"minimalistic-assert":245}],178:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('./utils');
|
|
var common = require('./common');
|
|
|
|
var rotl32 = utils.rotl32;
|
|
var sum32 = utils.sum32;
|
|
var sum32_3 = utils.sum32_3;
|
|
var sum32_4 = utils.sum32_4;
|
|
var BlockHash = common.BlockHash;
|
|
|
|
function RIPEMD160() {
|
|
if (!(this instanceof RIPEMD160))
|
|
return new RIPEMD160();
|
|
|
|
BlockHash.call(this);
|
|
|
|
this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];
|
|
this.endian = 'little';
|
|
}
|
|
utils.inherits(RIPEMD160, BlockHash);
|
|
exports.ripemd160 = RIPEMD160;
|
|
|
|
RIPEMD160.blockSize = 512;
|
|
RIPEMD160.outSize = 160;
|
|
RIPEMD160.hmacStrength = 192;
|
|
RIPEMD160.padLength = 64;
|
|
|
|
RIPEMD160.prototype._update = function update(msg, start) {
|
|
var A = this.h[0];
|
|
var B = this.h[1];
|
|
var C = this.h[2];
|
|
var D = this.h[3];
|
|
var E = this.h[4];
|
|
var Ah = A;
|
|
var Bh = B;
|
|
var Ch = C;
|
|
var Dh = D;
|
|
var Eh = E;
|
|
for (var j = 0; j < 80; j++) {
|
|
var T = sum32(
|
|
rotl32(
|
|
sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),
|
|
s[j]),
|
|
E);
|
|
A = E;
|
|
E = D;
|
|
D = rotl32(C, 10);
|
|
C = B;
|
|
B = T;
|
|
T = sum32(
|
|
rotl32(
|
|
sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),
|
|
sh[j]),
|
|
Eh);
|
|
Ah = Eh;
|
|
Eh = Dh;
|
|
Dh = rotl32(Ch, 10);
|
|
Ch = Bh;
|
|
Bh = T;
|
|
}
|
|
T = sum32_3(this.h[1], C, Dh);
|
|
this.h[1] = sum32_3(this.h[2], D, Eh);
|
|
this.h[2] = sum32_3(this.h[3], E, Ah);
|
|
this.h[3] = sum32_3(this.h[4], A, Bh);
|
|
this.h[4] = sum32_3(this.h[0], B, Ch);
|
|
this.h[0] = T;
|
|
};
|
|
|
|
RIPEMD160.prototype._digest = function digest(enc) {
|
|
if (enc === 'hex')
|
|
return utils.toHex32(this.h, 'little');
|
|
else
|
|
return utils.split32(this.h, 'little');
|
|
};
|
|
|
|
function f(j, x, y, z) {
|
|
if (j <= 15)
|
|
return x ^ y ^ z;
|
|
else if (j <= 31)
|
|
return (x & y) | ((~x) & z);
|
|
else if (j <= 47)
|
|
return (x | (~y)) ^ z;
|
|
else if (j <= 63)
|
|
return (x & z) | (y & (~z));
|
|
else
|
|
return x ^ (y | (~z));
|
|
}
|
|
|
|
function K(j) {
|
|
if (j <= 15)
|
|
return 0x00000000;
|
|
else if (j <= 31)
|
|
return 0x5a827999;
|
|
else if (j <= 47)
|
|
return 0x6ed9eba1;
|
|
else if (j <= 63)
|
|
return 0x8f1bbcdc;
|
|
else
|
|
return 0xa953fd4e;
|
|
}
|
|
|
|
function Kh(j) {
|
|
if (j <= 15)
|
|
return 0x50a28be6;
|
|
else if (j <= 31)
|
|
return 0x5c4dd124;
|
|
else if (j <= 47)
|
|
return 0x6d703ef3;
|
|
else if (j <= 63)
|
|
return 0x7a6d76e9;
|
|
else
|
|
return 0x00000000;
|
|
}
|
|
|
|
var r = [
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
|
|
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
|
|
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
|
|
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
|
|
];
|
|
|
|
var rh = [
|
|
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
|
|
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
|
|
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
|
|
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
|
|
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
|
|
];
|
|
|
|
var s = [
|
|
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
|
|
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
|
|
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
|
|
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
|
|
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
|
|
];
|
|
|
|
var sh = [
|
|
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
|
|
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
|
|
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
|
|
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
|
|
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
|
|
];
|
|
|
|
},{"./common":176,"./utils":186}],179:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
exports.sha1 = require('./sha/1');
|
|
exports.sha224 = require('./sha/224');
|
|
exports.sha256 = require('./sha/256');
|
|
exports.sha384 = require('./sha/384');
|
|
exports.sha512 = require('./sha/512');
|
|
|
|
},{"./sha/1":180,"./sha/224":181,"./sha/256":182,"./sha/384":183,"./sha/512":184}],180:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('../utils');
|
|
var common = require('../common');
|
|
var shaCommon = require('./common');
|
|
|
|
var rotl32 = utils.rotl32;
|
|
var sum32 = utils.sum32;
|
|
var sum32_5 = utils.sum32_5;
|
|
var ft_1 = shaCommon.ft_1;
|
|
var BlockHash = common.BlockHash;
|
|
|
|
var sha1_K = [
|
|
0x5A827999, 0x6ED9EBA1,
|
|
0x8F1BBCDC, 0xCA62C1D6
|
|
];
|
|
|
|
function SHA1() {
|
|
if (!(this instanceof SHA1))
|
|
return new SHA1();
|
|
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
0x67452301, 0xefcdab89, 0x98badcfe,
|
|
0x10325476, 0xc3d2e1f0 ];
|
|
this.W = new Array(80);
|
|
}
|
|
|
|
utils.inherits(SHA1, BlockHash);
|
|
module.exports = SHA1;
|
|
|
|
SHA1.blockSize = 512;
|
|
SHA1.outSize = 160;
|
|
SHA1.hmacStrength = 80;
|
|
SHA1.padLength = 64;
|
|
|
|
SHA1.prototype._update = function _update(msg, start) {
|
|
var W = this.W;
|
|
|
|
for (var i = 0; i < 16; i++)
|
|
W[i] = msg[start + i];
|
|
|
|
for(; i < W.length; i++)
|
|
W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
|
|
|
|
var a = this.h[0];
|
|
var b = this.h[1];
|
|
var c = this.h[2];
|
|
var d = this.h[3];
|
|
var e = this.h[4];
|
|
|
|
for (i = 0; i < W.length; i++) {
|
|
var s = ~~(i / 20);
|
|
var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
|
|
e = d;
|
|
d = c;
|
|
c = rotl32(b, 30);
|
|
b = a;
|
|
a = t;
|
|
}
|
|
|
|
this.h[0] = sum32(this.h[0], a);
|
|
this.h[1] = sum32(this.h[1], b);
|
|
this.h[2] = sum32(this.h[2], c);
|
|
this.h[3] = sum32(this.h[3], d);
|
|
this.h[4] = sum32(this.h[4], e);
|
|
};
|
|
|
|
SHA1.prototype._digest = function digest(enc) {
|
|
if (enc === 'hex')
|
|
return utils.toHex32(this.h, 'big');
|
|
else
|
|
return utils.split32(this.h, 'big');
|
|
};
|
|
|
|
},{"../common":176,"../utils":186,"./common":185}],181:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('../utils');
|
|
var SHA256 = require('./256');
|
|
|
|
function SHA224() {
|
|
if (!(this instanceof SHA224))
|
|
return new SHA224();
|
|
|
|
SHA256.call(this);
|
|
this.h = [
|
|
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
|
|
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ];
|
|
}
|
|
utils.inherits(SHA224, SHA256);
|
|
module.exports = SHA224;
|
|
|
|
SHA224.blockSize = 512;
|
|
SHA224.outSize = 224;
|
|
SHA224.hmacStrength = 192;
|
|
SHA224.padLength = 64;
|
|
|
|
SHA224.prototype._digest = function digest(enc) {
|
|
if (enc === 'hex')
|
|
return utils.toHex32(this.h.slice(0, 7), 'big');
|
|
else
|
|
return utils.split32(this.h.slice(0, 7), 'big');
|
|
};
|
|
|
|
|
|
},{"../utils":186,"./256":182}],182:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('../utils');
|
|
var common = require('../common');
|
|
var shaCommon = require('./common');
|
|
var assert = require('minimalistic-assert');
|
|
|
|
var sum32 = utils.sum32;
|
|
var sum32_4 = utils.sum32_4;
|
|
var sum32_5 = utils.sum32_5;
|
|
var ch32 = shaCommon.ch32;
|
|
var maj32 = shaCommon.maj32;
|
|
var s0_256 = shaCommon.s0_256;
|
|
var s1_256 = shaCommon.s1_256;
|
|
var g0_256 = shaCommon.g0_256;
|
|
var g1_256 = shaCommon.g1_256;
|
|
|
|
var BlockHash = common.BlockHash;
|
|
|
|
var sha256_K = [
|
|
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
|
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
|
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
|
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
|
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
|
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
|
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
|
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
|
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
];
|
|
|
|
function SHA256() {
|
|
if (!(this instanceof SHA256))
|
|
return new SHA256();
|
|
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
|
|
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
|
];
|
|
this.k = sha256_K;
|
|
this.W = new Array(64);
|
|
}
|
|
utils.inherits(SHA256, BlockHash);
|
|
module.exports = SHA256;
|
|
|
|
SHA256.blockSize = 512;
|
|
SHA256.outSize = 256;
|
|
SHA256.hmacStrength = 192;
|
|
SHA256.padLength = 64;
|
|
|
|
SHA256.prototype._update = function _update(msg, start) {
|
|
var W = this.W;
|
|
|
|
for (var i = 0; i < 16; i++)
|
|
W[i] = msg[start + i];
|
|
for (; i < W.length; i++)
|
|
W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
|
|
|
|
var a = this.h[0];
|
|
var b = this.h[1];
|
|
var c = this.h[2];
|
|
var d = this.h[3];
|
|
var e = this.h[4];
|
|
var f = this.h[5];
|
|
var g = this.h[6];
|
|
var h = this.h[7];
|
|
|
|
assert(this.k.length === W.length);
|
|
for (i = 0; i < W.length; i++) {
|
|
var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
|
|
var T2 = sum32(s0_256(a), maj32(a, b, c));
|
|
h = g;
|
|
g = f;
|
|
f = e;
|
|
e = sum32(d, T1);
|
|
d = c;
|
|
c = b;
|
|
b = a;
|
|
a = sum32(T1, T2);
|
|
}
|
|
|
|
this.h[0] = sum32(this.h[0], a);
|
|
this.h[1] = sum32(this.h[1], b);
|
|
this.h[2] = sum32(this.h[2], c);
|
|
this.h[3] = sum32(this.h[3], d);
|
|
this.h[4] = sum32(this.h[4], e);
|
|
this.h[5] = sum32(this.h[5], f);
|
|
this.h[6] = sum32(this.h[6], g);
|
|
this.h[7] = sum32(this.h[7], h);
|
|
};
|
|
|
|
SHA256.prototype._digest = function digest(enc) {
|
|
if (enc === 'hex')
|
|
return utils.toHex32(this.h, 'big');
|
|
else
|
|
return utils.split32(this.h, 'big');
|
|
};
|
|
|
|
},{"../common":176,"../utils":186,"./common":185,"minimalistic-assert":245}],183:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('../utils');
|
|
|
|
var SHA512 = require('./512');
|
|
|
|
function SHA384() {
|
|
if (!(this instanceof SHA384))
|
|
return new SHA384();
|
|
|
|
SHA512.call(this);
|
|
this.h = [
|
|
0xcbbb9d5d, 0xc1059ed8,
|
|
0x629a292a, 0x367cd507,
|
|
0x9159015a, 0x3070dd17,
|
|
0x152fecd8, 0xf70e5939,
|
|
0x67332667, 0xffc00b31,
|
|
0x8eb44a87, 0x68581511,
|
|
0xdb0c2e0d, 0x64f98fa7,
|
|
0x47b5481d, 0xbefa4fa4 ];
|
|
}
|
|
utils.inherits(SHA384, SHA512);
|
|
module.exports = SHA384;
|
|
|
|
SHA384.blockSize = 1024;
|
|
SHA384.outSize = 384;
|
|
SHA384.hmacStrength = 192;
|
|
SHA384.padLength = 128;
|
|
|
|
SHA384.prototype._digest = function digest(enc) {
|
|
if (enc === 'hex')
|
|
return utils.toHex32(this.h.slice(0, 12), 'big');
|
|
else
|
|
return utils.split32(this.h.slice(0, 12), 'big');
|
|
};
|
|
|
|
},{"../utils":186,"./512":184}],184:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('../utils');
|
|
var common = require('../common');
|
|
var assert = require('minimalistic-assert');
|
|
|
|
var rotr64_hi = utils.rotr64_hi;
|
|
var rotr64_lo = utils.rotr64_lo;
|
|
var shr64_hi = utils.shr64_hi;
|
|
var shr64_lo = utils.shr64_lo;
|
|
var sum64 = utils.sum64;
|
|
var sum64_hi = utils.sum64_hi;
|
|
var sum64_lo = utils.sum64_lo;
|
|
var sum64_4_hi = utils.sum64_4_hi;
|
|
var sum64_4_lo = utils.sum64_4_lo;
|
|
var sum64_5_hi = utils.sum64_5_hi;
|
|
var sum64_5_lo = utils.sum64_5_lo;
|
|
|
|
var BlockHash = common.BlockHash;
|
|
|
|
var sha512_K = [
|
|
0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
|
|
0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
|
|
0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
|
|
0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
|
|
0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
|
|
0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
|
|
0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
|
|
0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
|
|
0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
|
|
0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
|
|
0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
|
|
0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
|
|
0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
|
|
0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
|
|
0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
|
|
0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
|
|
0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
|
|
0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
|
|
0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
|
|
0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
|
|
0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
|
|
0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
|
|
0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
|
|
0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
|
|
0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
|
|
0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
|
|
0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
|
|
0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
|
|
0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
|
|
0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
|
|
0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
|
|
0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
|
|
0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
|
|
0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
|
|
0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
|
|
0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
|
|
0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
|
|
0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
|
|
0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
|
|
0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
|
|
];
|
|
|
|
function SHA512() {
|
|
if (!(this instanceof SHA512))
|
|
return new SHA512();
|
|
|
|
BlockHash.call(this);
|
|
this.h = [
|
|
0x6a09e667, 0xf3bcc908,
|
|
0xbb67ae85, 0x84caa73b,
|
|
0x3c6ef372, 0xfe94f82b,
|
|
0xa54ff53a, 0x5f1d36f1,
|
|
0x510e527f, 0xade682d1,
|
|
0x9b05688c, 0x2b3e6c1f,
|
|
0x1f83d9ab, 0xfb41bd6b,
|
|
0x5be0cd19, 0x137e2179 ];
|
|
this.k = sha512_K;
|
|
this.W = new Array(160);
|
|
}
|
|
utils.inherits(SHA512, BlockHash);
|
|
module.exports = SHA512;
|
|
|
|
SHA512.blockSize = 1024;
|
|
SHA512.outSize = 512;
|
|
SHA512.hmacStrength = 192;
|
|
SHA512.padLength = 128;
|
|
|
|
SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
|
|
var W = this.W;
|
|
|
|
for (var i = 0; i < 32; i++)
|
|
W[i] = msg[start + i];
|
|
for (; i < W.length; i += 2) {
|
|
var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2
|
|
var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
|
|
var c1_hi = W[i - 14]; // i - 7
|
|
var c1_lo = W[i - 13];
|
|
var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15
|
|
var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
|
|
var c3_hi = W[i - 32]; // i - 16
|
|
var c3_lo = W[i - 31];
|
|
|
|
W[i] = sum64_4_hi(
|
|
c0_hi, c0_lo,
|
|
c1_hi, c1_lo,
|
|
c2_hi, c2_lo,
|
|
c3_hi, c3_lo);
|
|
W[i + 1] = sum64_4_lo(
|
|
c0_hi, c0_lo,
|
|
c1_hi, c1_lo,
|
|
c2_hi, c2_lo,
|
|
c3_hi, c3_lo);
|
|
}
|
|
};
|
|
|
|
SHA512.prototype._update = function _update(msg, start) {
|
|
this._prepareBlock(msg, start);
|
|
|
|
var W = this.W;
|
|
|
|
var ah = this.h[0];
|
|
var al = this.h[1];
|
|
var bh = this.h[2];
|
|
var bl = this.h[3];
|
|
var ch = this.h[4];
|
|
var cl = this.h[5];
|
|
var dh = this.h[6];
|
|
var dl = this.h[7];
|
|
var eh = this.h[8];
|
|
var el = this.h[9];
|
|
var fh = this.h[10];
|
|
var fl = this.h[11];
|
|
var gh = this.h[12];
|
|
var gl = this.h[13];
|
|
var hh = this.h[14];
|
|
var hl = this.h[15];
|
|
|
|
assert(this.k.length === W.length);
|
|
for (var i = 0; i < W.length; i += 2) {
|
|
var c0_hi = hh;
|
|
var c0_lo = hl;
|
|
var c1_hi = s1_512_hi(eh, el);
|
|
var c1_lo = s1_512_lo(eh, el);
|
|
var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
|
|
var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
|
|
var c3_hi = this.k[i];
|
|
var c3_lo = this.k[i + 1];
|
|
var c4_hi = W[i];
|
|
var c4_lo = W[i + 1];
|
|
|
|
var T1_hi = sum64_5_hi(
|
|
c0_hi, c0_lo,
|
|
c1_hi, c1_lo,
|
|
c2_hi, c2_lo,
|
|
c3_hi, c3_lo,
|
|
c4_hi, c4_lo);
|
|
var T1_lo = sum64_5_lo(
|
|
c0_hi, c0_lo,
|
|
c1_hi, c1_lo,
|
|
c2_hi, c2_lo,
|
|
c3_hi, c3_lo,
|
|
c4_hi, c4_lo);
|
|
|
|
c0_hi = s0_512_hi(ah, al);
|
|
c0_lo = s0_512_lo(ah, al);
|
|
c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
|
|
c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
|
|
|
|
var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
|
|
var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
|
|
|
|
hh = gh;
|
|
hl = gl;
|
|
|
|
gh = fh;
|
|
gl = fl;
|
|
|
|
fh = eh;
|
|
fl = el;
|
|
|
|
eh = sum64_hi(dh, dl, T1_hi, T1_lo);
|
|
el = sum64_lo(dl, dl, T1_hi, T1_lo);
|
|
|
|
dh = ch;
|
|
dl = cl;
|
|
|
|
ch = bh;
|
|
cl = bl;
|
|
|
|
bh = ah;
|
|
bl = al;
|
|
|
|
ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
|
|
al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
|
|
}
|
|
|
|
sum64(this.h, 0, ah, al);
|
|
sum64(this.h, 2, bh, bl);
|
|
sum64(this.h, 4, ch, cl);
|
|
sum64(this.h, 6, dh, dl);
|
|
sum64(this.h, 8, eh, el);
|
|
sum64(this.h, 10, fh, fl);
|
|
sum64(this.h, 12, gh, gl);
|
|
sum64(this.h, 14, hh, hl);
|
|
};
|
|
|
|
SHA512.prototype._digest = function digest(enc) {
|
|
if (enc === 'hex')
|
|
return utils.toHex32(this.h, 'big');
|
|
else
|
|
return utils.split32(this.h, 'big');
|
|
};
|
|
|
|
function ch64_hi(xh, xl, yh, yl, zh) {
|
|
var r = (xh & yh) ^ ((~xh) & zh);
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function ch64_lo(xh, xl, yh, yl, zh, zl) {
|
|
var r = (xl & yl) ^ ((~xl) & zl);
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function maj64_hi(xh, xl, yh, yl, zh) {
|
|
var r = (xh & yh) ^ (xh & zh) ^ (yh & zh);
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function maj64_lo(xh, xl, yh, yl, zh, zl) {
|
|
var r = (xl & yl) ^ (xl & zl) ^ (yl & zl);
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function s0_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 28);
|
|
var c1_hi = rotr64_hi(xl, xh, 2); // 34
|
|
var c2_hi = rotr64_hi(xl, xh, 7); // 39
|
|
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function s0_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 28);
|
|
var c1_lo = rotr64_lo(xl, xh, 2); // 34
|
|
var c2_lo = rotr64_lo(xl, xh, 7); // 39
|
|
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function s1_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 14);
|
|
var c1_hi = rotr64_hi(xh, xl, 18);
|
|
var c2_hi = rotr64_hi(xl, xh, 9); // 41
|
|
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function s1_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 14);
|
|
var c1_lo = rotr64_lo(xh, xl, 18);
|
|
var c2_lo = rotr64_lo(xl, xh, 9); // 41
|
|
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function g0_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 1);
|
|
var c1_hi = rotr64_hi(xh, xl, 8);
|
|
var c2_hi = shr64_hi(xh, xl, 7);
|
|
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function g0_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 1);
|
|
var c1_lo = rotr64_lo(xh, xl, 8);
|
|
var c2_lo = shr64_lo(xh, xl, 7);
|
|
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function g1_512_hi(xh, xl) {
|
|
var c0_hi = rotr64_hi(xh, xl, 19);
|
|
var c1_hi = rotr64_hi(xl, xh, 29); // 61
|
|
var c2_hi = shr64_hi(xh, xl, 6);
|
|
|
|
var r = c0_hi ^ c1_hi ^ c2_hi;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
function g1_512_lo(xh, xl) {
|
|
var c0_lo = rotr64_lo(xh, xl, 19);
|
|
var c1_lo = rotr64_lo(xl, xh, 29); // 61
|
|
var c2_lo = shr64_lo(xh, xl, 6);
|
|
|
|
var r = c0_lo ^ c1_lo ^ c2_lo;
|
|
if (r < 0)
|
|
r += 0x100000000;
|
|
return r;
|
|
}
|
|
|
|
},{"../common":176,"../utils":186,"minimalistic-assert":245}],185:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('../utils');
|
|
var rotr32 = utils.rotr32;
|
|
|
|
function ft_1(s, x, y, z) {
|
|
if (s === 0)
|
|
return ch32(x, y, z);
|
|
if (s === 1 || s === 3)
|
|
return p32(x, y, z);
|
|
if (s === 2)
|
|
return maj32(x, y, z);
|
|
}
|
|
exports.ft_1 = ft_1;
|
|
|
|
function ch32(x, y, z) {
|
|
return (x & y) ^ ((~x) & z);
|
|
}
|
|
exports.ch32 = ch32;
|
|
|
|
function maj32(x, y, z) {
|
|
return (x & y) ^ (x & z) ^ (y & z);
|
|
}
|
|
exports.maj32 = maj32;
|
|
|
|
function p32(x, y, z) {
|
|
return x ^ y ^ z;
|
|
}
|
|
exports.p32 = p32;
|
|
|
|
function s0_256(x) {
|
|
return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
|
|
}
|
|
exports.s0_256 = s0_256;
|
|
|
|
function s1_256(x) {
|
|
return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
|
|
}
|
|
exports.s1_256 = s1_256;
|
|
|
|
function g0_256(x) {
|
|
return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3);
|
|
}
|
|
exports.g0_256 = g0_256;
|
|
|
|
function g1_256(x) {
|
|
return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10);
|
|
}
|
|
exports.g1_256 = g1_256;
|
|
|
|
},{"../utils":186}],186:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var assert = require('minimalistic-assert');
|
|
var inherits = require('inherits');
|
|
|
|
exports.inherits = inherits;
|
|
|
|
function toArray(msg, enc) {
|
|
if (Array.isArray(msg))
|
|
return msg.slice();
|
|
if (!msg)
|
|
return [];
|
|
var res = [];
|
|
if (typeof msg === 'string') {
|
|
if (!enc) {
|
|
for (var i = 0; i < msg.length; i++) {
|
|
var c = msg.charCodeAt(i);
|
|
var hi = c >> 8;
|
|
var lo = c & 0xff;
|
|
if (hi)
|
|
res.push(hi, lo);
|
|
else
|
|
res.push(lo);
|
|
}
|
|
} else if (enc === 'hex') {
|
|
msg = msg.replace(/[^a-z0-9]+/ig, '');
|
|
if (msg.length % 2 !== 0)
|
|
msg = '0' + msg;
|
|
for (i = 0; i < msg.length; i += 2)
|
|
res.push(parseInt(msg[i] + msg[i + 1], 16));
|
|
}
|
|
} else {
|
|
for (i = 0; i < msg.length; i++)
|
|
res[i] = msg[i] | 0;
|
|
}
|
|
return res;
|
|
}
|
|
exports.toArray = toArray;
|
|
|
|
function toHex(msg) {
|
|
var res = '';
|
|
for (var i = 0; i < msg.length; i++)
|
|
res += zero2(msg[i].toString(16));
|
|
return res;
|
|
}
|
|
exports.toHex = toHex;
|
|
|
|
function htonl(w) {
|
|
var res = (w >>> 24) |
|
|
((w >>> 8) & 0xff00) |
|
|
((w << 8) & 0xff0000) |
|
|
((w & 0xff) << 24);
|
|
return res >>> 0;
|
|
}
|
|
exports.htonl = htonl;
|
|
|
|
function toHex32(msg, endian) {
|
|
var res = '';
|
|
for (var i = 0; i < msg.length; i++) {
|
|
var w = msg[i];
|
|
if (endian === 'little')
|
|
w = htonl(w);
|
|
res += zero8(w.toString(16));
|
|
}
|
|
return res;
|
|
}
|
|
exports.toHex32 = toHex32;
|
|
|
|
function zero2(word) {
|
|
if (word.length === 1)
|
|
return '0' + word;
|
|
else
|
|
return word;
|
|
}
|
|
exports.zero2 = zero2;
|
|
|
|
function zero8(word) {
|
|
if (word.length === 7)
|
|
return '0' + word;
|
|
else if (word.length === 6)
|
|
return '00' + word;
|
|
else if (word.length === 5)
|
|
return '000' + word;
|
|
else if (word.length === 4)
|
|
return '0000' + word;
|
|
else if (word.length === 3)
|
|
return '00000' + word;
|
|
else if (word.length === 2)
|
|
return '000000' + word;
|
|
else if (word.length === 1)
|
|
return '0000000' + word;
|
|
else
|
|
return word;
|
|
}
|
|
exports.zero8 = zero8;
|
|
|
|
function join32(msg, start, end, endian) {
|
|
var len = end - start;
|
|
assert(len % 4 === 0);
|
|
var res = new Array(len / 4);
|
|
for (var i = 0, k = start; i < res.length; i++, k += 4) {
|
|
var w;
|
|
if (endian === 'big')
|
|
w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];
|
|
else
|
|
w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];
|
|
res[i] = w >>> 0;
|
|
}
|
|
return res;
|
|
}
|
|
exports.join32 = join32;
|
|
|
|
function split32(msg, endian) {
|
|
var res = new Array(msg.length * 4);
|
|
for (var i = 0, k = 0; i < msg.length; i++, k += 4) {
|
|
var m = msg[i];
|
|
if (endian === 'big') {
|
|
res[k] = m >>> 24;
|
|
res[k + 1] = (m >>> 16) & 0xff;
|
|
res[k + 2] = (m >>> 8) & 0xff;
|
|
res[k + 3] = m & 0xff;
|
|
} else {
|
|
res[k + 3] = m >>> 24;
|
|
res[k + 2] = (m >>> 16) & 0xff;
|
|
res[k + 1] = (m >>> 8) & 0xff;
|
|
res[k] = m & 0xff;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
exports.split32 = split32;
|
|
|
|
function rotr32(w, b) {
|
|
return (w >>> b) | (w << (32 - b));
|
|
}
|
|
exports.rotr32 = rotr32;
|
|
|
|
function rotl32(w, b) {
|
|
return (w << b) | (w >>> (32 - b));
|
|
}
|
|
exports.rotl32 = rotl32;
|
|
|
|
function sum32(a, b) {
|
|
return (a + b) >>> 0;
|
|
}
|
|
exports.sum32 = sum32;
|
|
|
|
function sum32_3(a, b, c) {
|
|
return (a + b + c) >>> 0;
|
|
}
|
|
exports.sum32_3 = sum32_3;
|
|
|
|
function sum32_4(a, b, c, d) {
|
|
return (a + b + c + d) >>> 0;
|
|
}
|
|
exports.sum32_4 = sum32_4;
|
|
|
|
function sum32_5(a, b, c, d, e) {
|
|
return (a + b + c + d + e) >>> 0;
|
|
}
|
|
exports.sum32_5 = sum32_5;
|
|
|
|
function sum64(buf, pos, ah, al) {
|
|
var bh = buf[pos];
|
|
var bl = buf[pos + 1];
|
|
|
|
var lo = (al + bl) >>> 0;
|
|
var hi = (lo < al ? 1 : 0) + ah + bh;
|
|
buf[pos] = hi >>> 0;
|
|
buf[pos + 1] = lo;
|
|
}
|
|
exports.sum64 = sum64;
|
|
|
|
function sum64_hi(ah, al, bh, bl) {
|
|
var lo = (al + bl) >>> 0;
|
|
var hi = (lo < al ? 1 : 0) + ah + bh;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_hi = sum64_hi;
|
|
|
|
function sum64_lo(ah, al, bh, bl) {
|
|
var lo = al + bl;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_lo = sum64_lo;
|
|
|
|
function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
|
|
var carry = 0;
|
|
var lo = al;
|
|
lo = (lo + bl) >>> 0;
|
|
carry += lo < al ? 1 : 0;
|
|
lo = (lo + cl) >>> 0;
|
|
carry += lo < cl ? 1 : 0;
|
|
lo = (lo + dl) >>> 0;
|
|
carry += lo < dl ? 1 : 0;
|
|
|
|
var hi = ah + bh + ch + dh + carry;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_4_hi = sum64_4_hi;
|
|
|
|
function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
|
|
var lo = al + bl + cl + dl;
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_4_lo = sum64_4_lo;
|
|
|
|
function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
|
|
var carry = 0;
|
|
var lo = al;
|
|
lo = (lo + bl) >>> 0;
|
|
carry += lo < al ? 1 : 0;
|
|
lo = (lo + cl) >>> 0;
|
|
carry += lo < cl ? 1 : 0;
|
|
lo = (lo + dl) >>> 0;
|
|
carry += lo < dl ? 1 : 0;
|
|
lo = (lo + el) >>> 0;
|
|
carry += lo < el ? 1 : 0;
|
|
|
|
var hi = ah + bh + ch + dh + eh + carry;
|
|
return hi >>> 0;
|
|
}
|
|
exports.sum64_5_hi = sum64_5_hi;
|
|
|
|
function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
|
|
var lo = al + bl + cl + dl + el;
|
|
|
|
return lo >>> 0;
|
|
}
|
|
exports.sum64_5_lo = sum64_5_lo;
|
|
|
|
function rotr64_hi(ah, al, num) {
|
|
var r = (al << (32 - num)) | (ah >>> num);
|
|
return r >>> 0;
|
|
}
|
|
exports.rotr64_hi = rotr64_hi;
|
|
|
|
function rotr64_lo(ah, al, num) {
|
|
var r = (ah << (32 - num)) | (al >>> num);
|
|
return r >>> 0;
|
|
}
|
|
exports.rotr64_lo = rotr64_lo;
|
|
|
|
function shr64_hi(ah, al, num) {
|
|
return ah >>> num;
|
|
}
|
|
exports.shr64_hi = shr64_hi;
|
|
|
|
function shr64_lo(ah, al, num) {
|
|
var r = (ah << (32 - num)) | (al >>> num);
|
|
return r >>> 0;
|
|
}
|
|
exports.shr64_lo = shr64_lo;
|
|
|
|
},{"inherits":190,"minimalistic-assert":245}],187:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var hash = require('hash.js');
|
|
var utils = require('minimalistic-crypto-utils');
|
|
var assert = require('minimalistic-assert');
|
|
|
|
function HmacDRBG(options) {
|
|
if (!(this instanceof HmacDRBG))
|
|
return new HmacDRBG(options);
|
|
this.hash = options.hash;
|
|
this.predResist = !!options.predResist;
|
|
|
|
this.outLen = this.hash.outSize;
|
|
this.minEntropy = options.minEntropy || this.hash.hmacStrength;
|
|
|
|
this._reseed = null;
|
|
this.reseedInterval = null;
|
|
this.K = null;
|
|
this.V = null;
|
|
|
|
var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex');
|
|
var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex');
|
|
var pers = utils.toArray(options.pers, options.persEnc || 'hex');
|
|
assert(entropy.length >= (this.minEntropy / 8),
|
|
'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');
|
|
this._init(entropy, nonce, pers);
|
|
}
|
|
module.exports = HmacDRBG;
|
|
|
|
HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
|
|
var seed = entropy.concat(nonce).concat(pers);
|
|
|
|
this.K = new Array(this.outLen / 8);
|
|
this.V = new Array(this.outLen / 8);
|
|
for (var i = 0; i < this.V.length; i++) {
|
|
this.K[i] = 0x00;
|
|
this.V[i] = 0x01;
|
|
}
|
|
|
|
this._update(seed);
|
|
this._reseed = 1;
|
|
this.reseedInterval = 0x1000000000000; // 2^48
|
|
};
|
|
|
|
HmacDRBG.prototype._hmac = function hmac() {
|
|
return new hash.hmac(this.hash, this.K);
|
|
};
|
|
|
|
HmacDRBG.prototype._update = function update(seed) {
|
|
var kmac = this._hmac()
|
|
.update(this.V)
|
|
.update([ 0x00 ]);
|
|
if (seed)
|
|
kmac = kmac.update(seed);
|
|
this.K = kmac.digest();
|
|
this.V = this._hmac().update(this.V).digest();
|
|
if (!seed)
|
|
return;
|
|
|
|
this.K = this._hmac()
|
|
.update(this.V)
|
|
.update([ 0x01 ])
|
|
.update(seed)
|
|
.digest();
|
|
this.V = this._hmac().update(this.V).digest();
|
|
};
|
|
|
|
HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
|
|
if (typeof entropyEnc !== 'string') {
|
|
addEnc = add;
|
|
add = entropyEnc;
|
|
entropyEnc = null;
|
|
}
|
|
|
|
entropy = utils.toArray(entropy, entropyEnc);
|
|
add = utils.toArray(add, addEnc);
|
|
|
|
assert(entropy.length >= (this.minEntropy / 8),
|
|
'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');
|
|
|
|
this._update(entropy.concat(add || []));
|
|
this._reseed = 1;
|
|
};
|
|
|
|
HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
|
|
if (this._reseed > this.reseedInterval)
|
|
throw new Error('Reseed is required');
|
|
|
|
if (typeof enc !== 'string') {
|
|
addEnc = add;
|
|
add = enc;
|
|
enc = null;
|
|
}
|
|
|
|
if (add) {
|
|
add = utils.toArray(add, addEnc || 'hex');
|
|
this._update(add);
|
|
}
|
|
|
|
var temp = [];
|
|
while (temp.length < len) {
|
|
this.V = this._hmac().update(this.V).digest();
|
|
temp = temp.concat(this.V);
|
|
}
|
|
|
|
var res = temp.slice(0, len);
|
|
this._update(add);
|
|
this._reseed++;
|
|
return utils.encode(res, enc);
|
|
};
|
|
|
|
},{"hash.js":175,"minimalistic-assert":245,"minimalistic-crypto-utils":246}],188:[function(require,module,exports){
|
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
|
var e, m
|
|
var eLen = nBytes * 8 - mLen - 1
|
|
var eMax = (1 << eLen) - 1
|
|
var eBias = eMax >> 1
|
|
var nBits = -7
|
|
var i = isLE ? (nBytes - 1) : 0
|
|
var d = isLE ? -1 : 1
|
|
var s = buffer[offset + i]
|
|
|
|
i += d
|
|
|
|
e = s & ((1 << (-nBits)) - 1)
|
|
s >>= (-nBits)
|
|
nBits += eLen
|
|
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
|
|
|
|
m = e & ((1 << (-nBits)) - 1)
|
|
e >>= (-nBits)
|
|
nBits += mLen
|
|
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
|
|
|
|
if (e === 0) {
|
|
e = 1 - eBias
|
|
} else if (e === eMax) {
|
|
return m ? NaN : ((s ? -1 : 1) * Infinity)
|
|
} else {
|
|
m = m + Math.pow(2, mLen)
|
|
e = e - eBias
|
|
}
|
|
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
|
}
|
|
|
|
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
|
var e, m, c
|
|
var eLen = nBytes * 8 - mLen - 1
|
|
var eMax = (1 << eLen) - 1
|
|
var eBias = eMax >> 1
|
|
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
|
|
var i = isLE ? 0 : (nBytes - 1)
|
|
var d = isLE ? 1 : -1
|
|
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
|
|
|
|
value = Math.abs(value)
|
|
|
|
if (isNaN(value) || value === Infinity) {
|
|
m = isNaN(value) ? 1 : 0
|
|
e = eMax
|
|
} else {
|
|
e = Math.floor(Math.log(value) / Math.LN2)
|
|
if (value * (c = Math.pow(2, -e)) < 1) {
|
|
e--
|
|
c *= 2
|
|
}
|
|
if (e + eBias >= 1) {
|
|
value += rt / c
|
|
} else {
|
|
value += rt * Math.pow(2, 1 - eBias)
|
|
}
|
|
if (value * c >= 2) {
|
|
e++
|
|
c /= 2
|
|
}
|
|
|
|
if (e + eBias >= eMax) {
|
|
m = 0
|
|
e = eMax
|
|
} else if (e + eBias >= 1) {
|
|
m = (value * c - 1) * Math.pow(2, mLen)
|
|
e = e + eBias
|
|
} else {
|
|
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
|
|
e = 0
|
|
}
|
|
}
|
|
|
|
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
|
|
|
e = (e << mLen) | m
|
|
eLen += mLen
|
|
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
|
|
|
buffer[offset + i - d] |= s * 128
|
|
}
|
|
|
|
},{}],189:[function(require,module,exports){
|
|
|
|
var indexOf = [].indexOf;
|
|
|
|
module.exports = function(arr, obj){
|
|
if (indexOf) return arr.indexOf(obj);
|
|
for (var i = 0; i < arr.length; ++i) {
|
|
if (arr[i] === obj) return i;
|
|
}
|
|
return -1;
|
|
};
|
|
},{}],190:[function(require,module,exports){
|
|
if (typeof Object.create === 'function') {
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
ctor.super_ = superCtor
|
|
ctor.prototype = Object.create(superCtor.prototype, {
|
|
constructor: {
|
|
value: ctor,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
});
|
|
};
|
|
} else {
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
ctor.super_ = superCtor
|
|
var TempCtor = function () {}
|
|
TempCtor.prototype = superCtor.prototype
|
|
ctor.prototype = new TempCtor()
|
|
ctor.prototype.constructor = ctor
|
|
}
|
|
}
|
|
|
|
},{}],191:[function(require,module,exports){
|
|
|
|
|
|
module.exports = function (obj) {
|
|
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
|
|
}
|
|
|
|
function isBuffer (obj) {
|
|
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
|
|
}
|
|
|
|
function isSlowBuffer (obj) {
|
|
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
|
|
}
|
|
|
|
},{}],192:[function(require,module,exports){
|
|
var toString = {}.toString;
|
|
|
|
module.exports = Array.isArray || function (arr) {
|
|
return toString.call(arr) == '[object Array]';
|
|
};
|
|
|
|
},{}],193:[function(require,module,exports){
|
|
(function(exports) {
|
|
"use strict";
|
|
|
|
function isArray(obj) {
|
|
if (obj !== null) {
|
|
return Object.prototype.toString.call(obj) === "[object Array]";
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function isObject(obj) {
|
|
if (obj !== null) {
|
|
return Object.prototype.toString.call(obj) === "[object Object]";
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function strictDeepEqual(first, second) {
|
|
if (first === second) {
|
|
return true;
|
|
}
|
|
|
|
var firstType = Object.prototype.toString.call(first);
|
|
if (firstType !== Object.prototype.toString.call(second)) {
|
|
return false;
|
|
}
|
|
if (isArray(first) === true) {
|
|
if (first.length !== second.length) {
|
|
return false;
|
|
}
|
|
for (var i = 0; i < first.length; i++) {
|
|
if (strictDeepEqual(first[i], second[i]) === false) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
if (isObject(first) === true) {
|
|
var keysSeen = {};
|
|
for (var key in first) {
|
|
if (hasOwnProperty.call(first, key)) {
|
|
if (strictDeepEqual(first[key], second[key]) === false) {
|
|
return false;
|
|
}
|
|
keysSeen[key] = true;
|
|
}
|
|
}
|
|
for (var key2 in second) {
|
|
if (hasOwnProperty.call(second, key2)) {
|
|
if (keysSeen[key2] !== true) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function isFalse(obj) {
|
|
|
|
if (obj === "" || obj === false || obj === null) {
|
|
return true;
|
|
} else if (isArray(obj) && obj.length === 0) {
|
|
return true;
|
|
} else if (isObject(obj)) {
|
|
for (var key in obj) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function objValues(obj) {
|
|
var keys = Object.keys(obj);
|
|
var values = [];
|
|
for (var i = 0; i < keys.length; i++) {
|
|
values.push(obj[keys[i]]);
|
|
}
|
|
return values;
|
|
}
|
|
|
|
function merge(a, b) {
|
|
var merged = {};
|
|
for (var key in a) {
|
|
merged[key] = a[key];
|
|
}
|
|
for (var key2 in b) {
|
|
merged[key2] = b[key2];
|
|
}
|
|
return merged;
|
|
}
|
|
|
|
var trimLeft;
|
|
if (typeof String.prototype.trimLeft === "function") {
|
|
trimLeft = function(str) {
|
|
return str.trimLeft();
|
|
};
|
|
} else {
|
|
trimLeft = function(str) {
|
|
return str.match(/^\s*(.*)/)[1];
|
|
};
|
|
}
|
|
|
|
var TYPE_NUMBER = 0;
|
|
var TYPE_ANY = 1;
|
|
var TYPE_STRING = 2;
|
|
var TYPE_ARRAY = 3;
|
|
var TYPE_OBJECT = 4;
|
|
var TYPE_BOOLEAN = 5;
|
|
var TYPE_EXPREF = 6;
|
|
var TYPE_NULL = 7;
|
|
var TYPE_ARRAY_NUMBER = 8;
|
|
var TYPE_ARRAY_STRING = 9;
|
|
|
|
var TOK_EOF = "EOF";
|
|
var TOK_UNQUOTEDIDENTIFIER = "UnquotedIdentifier";
|
|
var TOK_QUOTEDIDENTIFIER = "QuotedIdentifier";
|
|
var TOK_RBRACKET = "Rbracket";
|
|
var TOK_RPAREN = "Rparen";
|
|
var TOK_COMMA = "Comma";
|
|
var TOK_COLON = "Colon";
|
|
var TOK_RBRACE = "Rbrace";
|
|
var TOK_NUMBER = "Number";
|
|
var TOK_CURRENT = "Current";
|
|
var TOK_EXPREF = "Expref";
|
|
var TOK_PIPE = "Pipe";
|
|
var TOK_OR = "Or";
|
|
var TOK_AND = "And";
|
|
var TOK_EQ = "EQ";
|
|
var TOK_GT = "GT";
|
|
var TOK_LT = "LT";
|
|
var TOK_GTE = "GTE";
|
|
var TOK_LTE = "LTE";
|
|
var TOK_NE = "NE";
|
|
var TOK_FLATTEN = "Flatten";
|
|
var TOK_STAR = "Star";
|
|
var TOK_FILTER = "Filter";
|
|
var TOK_DOT = "Dot";
|
|
var TOK_NOT = "Not";
|
|
var TOK_LBRACE = "Lbrace";
|
|
var TOK_LBRACKET = "Lbracket";
|
|
var TOK_LPAREN= "Lparen";
|
|
var TOK_LITERAL= "Literal";
|
|
|
|
|
|
var basicTokens = {
|
|
".": TOK_DOT,
|
|
"*": TOK_STAR,
|
|
",": TOK_COMMA,
|
|
":": TOK_COLON,
|
|
"{": TOK_LBRACE,
|
|
"}": TOK_RBRACE,
|
|
"]": TOK_RBRACKET,
|
|
"(": TOK_LPAREN,
|
|
")": TOK_RPAREN,
|
|
"@": TOK_CURRENT
|
|
};
|
|
|
|
var operatorStartToken = {
|
|
"<": true,
|
|
">": true,
|
|
"=": true,
|
|
"!": true
|
|
};
|
|
|
|
var skipChars = {
|
|
" ": true,
|
|
"\t": true,
|
|
"\n": true
|
|
};
|
|
|
|
|
|
function isAlpha(ch) {
|
|
return (ch >= "a" && ch <= "z") ||
|
|
(ch >= "A" && ch <= "Z") ||
|
|
ch === "_";
|
|
}
|
|
|
|
function isNum(ch) {
|
|
return (ch >= "0" && ch <= "9") ||
|
|
ch === "-";
|
|
}
|
|
function isAlphaNum(ch) {
|
|
return (ch >= "a" && ch <= "z") ||
|
|
(ch >= "A" && ch <= "Z") ||
|
|
(ch >= "0" && ch <= "9") ||
|
|
ch === "_";
|
|
}
|
|
|
|
function Lexer() {
|
|
}
|
|
Lexer.prototype = {
|
|
tokenize: function(stream) {
|
|
var tokens = [];
|
|
this._current = 0;
|
|
var start;
|
|
var identifier;
|
|
var token;
|
|
while (this._current < stream.length) {
|
|
if (isAlpha(stream[this._current])) {
|
|
start = this._current;
|
|
identifier = this._consumeUnquotedIdentifier(stream);
|
|
tokens.push({type: TOK_UNQUOTEDIDENTIFIER,
|
|
value: identifier,
|
|
start: start});
|
|
} else if (basicTokens[stream[this._current]] !== undefined) {
|
|
tokens.push({type: basicTokens[stream[this._current]],
|
|
value: stream[this._current],
|
|
start: this._current});
|
|
this._current++;
|
|
} else if (isNum(stream[this._current])) {
|
|
token = this._consumeNumber(stream);
|
|
tokens.push(token);
|
|
} else if (stream[this._current] === "[") {
|
|
token = this._consumeLBracket(stream);
|
|
tokens.push(token);
|
|
} else if (stream[this._current] === "\"") {
|
|
start = this._current;
|
|
identifier = this._consumeQuotedIdentifier(stream);
|
|
tokens.push({type: TOK_QUOTEDIDENTIFIER,
|
|
value: identifier,
|
|
start: start});
|
|
} else if (stream[this._current] === "'") {
|
|
start = this._current;
|
|
identifier = this._consumeRawStringLiteral(stream);
|
|
tokens.push({type: TOK_LITERAL,
|
|
value: identifier,
|
|
start: start});
|
|
} else if (stream[this._current] === "`") {
|
|
start = this._current;
|
|
var literal = this._consumeLiteral(stream);
|
|
tokens.push({type: TOK_LITERAL,
|
|
value: literal,
|
|
start: start});
|
|
} else if (operatorStartToken[stream[this._current]] !== undefined) {
|
|
tokens.push(this._consumeOperator(stream));
|
|
} else if (skipChars[stream[this._current]] !== undefined) {
|
|
this._current++;
|
|
} else if (stream[this._current] === "&") {
|
|
start = this._current;
|
|
this._current++;
|
|
if (stream[this._current] === "&") {
|
|
this._current++;
|
|
tokens.push({type: TOK_AND, value: "&&", start: start});
|
|
} else {
|
|
tokens.push({type: TOK_EXPREF, value: "&", start: start});
|
|
}
|
|
} else if (stream[this._current] === "|") {
|
|
start = this._current;
|
|
this._current++;
|
|
if (stream[this._current] === "|") {
|
|
this._current++;
|
|
tokens.push({type: TOK_OR, value: "||", start: start});
|
|
} else {
|
|
tokens.push({type: TOK_PIPE, value: "|", start: start});
|
|
}
|
|
} else {
|
|
var error = new Error("Unknown character:" + stream[this._current]);
|
|
error.name = "LexerError";
|
|
throw error;
|
|
}
|
|
}
|
|
return tokens;
|
|
},
|
|
|
|
_consumeUnquotedIdentifier: function(stream) {
|
|
var start = this._current;
|
|
this._current++;
|
|
while (this._current < stream.length && isAlphaNum(stream[this._current])) {
|
|
this._current++;
|
|
}
|
|
return stream.slice(start, this._current);
|
|
},
|
|
|
|
_consumeQuotedIdentifier: function(stream) {
|
|
var start = this._current;
|
|
this._current++;
|
|
var maxLength = stream.length;
|
|
while (stream[this._current] !== "\"" && this._current < maxLength) {
|
|
var current = this._current;
|
|
if (stream[current] === "\\" && (stream[current + 1] === "\\" ||
|
|
stream[current + 1] === "\"")) {
|
|
current += 2;
|
|
} else {
|
|
current++;
|
|
}
|
|
this._current = current;
|
|
}
|
|
this._current++;
|
|
return JSON.parse(stream.slice(start, this._current));
|
|
},
|
|
|
|
_consumeRawStringLiteral: function(stream) {
|
|
var start = this._current;
|
|
this._current++;
|
|
var maxLength = stream.length;
|
|
while (stream[this._current] !== "'" && this._current < maxLength) {
|
|
var current = this._current;
|
|
if (stream[current] === "\\" && (stream[current + 1] === "\\" ||
|
|
stream[current + 1] === "'")) {
|
|
current += 2;
|
|
} else {
|
|
current++;
|
|
}
|
|
this._current = current;
|
|
}
|
|
this._current++;
|
|
var literal = stream.slice(start + 1, this._current - 1);
|
|
return literal.replace("\\'", "'");
|
|
},
|
|
|
|
_consumeNumber: function(stream) {
|
|
var start = this._current;
|
|
this._current++;
|
|
var maxLength = stream.length;
|
|
while (isNum(stream[this._current]) && this._current < maxLength) {
|
|
this._current++;
|
|
}
|
|
var value = parseInt(stream.slice(start, this._current));
|
|
return {type: TOK_NUMBER, value: value, start: start};
|
|
},
|
|
|
|
_consumeLBracket: function(stream) {
|
|
var start = this._current;
|
|
this._current++;
|
|
if (stream[this._current] === "?") {
|
|
this._current++;
|
|
return {type: TOK_FILTER, value: "[?", start: start};
|
|
} else if (stream[this._current] === "]") {
|
|
this._current++;
|
|
return {type: TOK_FLATTEN, value: "[]", start: start};
|
|
} else {
|
|
return {type: TOK_LBRACKET, value: "[", start: start};
|
|
}
|
|
},
|
|
|
|
_consumeOperator: function(stream) {
|
|
var start = this._current;
|
|
var startingChar = stream[start];
|
|
this._current++;
|
|
if (startingChar === "!") {
|
|
if (stream[this._current] === "=") {
|
|
this._current++;
|
|
return {type: TOK_NE, value: "!=", start: start};
|
|
} else {
|
|
return {type: TOK_NOT, value: "!", start: start};
|
|
}
|
|
} else if (startingChar === "<") {
|
|
if (stream[this._current] === "=") {
|
|
this._current++;
|
|
return {type: TOK_LTE, value: "<=", start: start};
|
|
} else {
|
|
return {type: TOK_LT, value: "<", start: start};
|
|
}
|
|
} else if (startingChar === ">") {
|
|
if (stream[this._current] === "=") {
|
|
this._current++;
|
|
return {type: TOK_GTE, value: ">=", start: start};
|
|
} else {
|
|
return {type: TOK_GT, value: ">", start: start};
|
|
}
|
|
} else if (startingChar === "=") {
|
|
if (stream[this._current] === "=") {
|
|
this._current++;
|
|
return {type: TOK_EQ, value: "==", start: start};
|
|
}
|
|
}
|
|
},
|
|
|
|
_consumeLiteral: function(stream) {
|
|
this._current++;
|
|
var start = this._current;
|
|
var maxLength = stream.length;
|
|
var literal;
|
|
while(stream[this._current] !== "`" && this._current < maxLength) {
|
|
var current = this._current;
|
|
if (stream[current] === "\\" && (stream[current + 1] === "\\" ||
|
|
stream[current + 1] === "`")) {
|
|
current += 2;
|
|
} else {
|
|
current++;
|
|
}
|
|
this._current = current;
|
|
}
|
|
var literalString = trimLeft(stream.slice(start, this._current));
|
|
literalString = literalString.replace("\\`", "`");
|
|
if (this._looksLikeJSON(literalString)) {
|
|
literal = JSON.parse(literalString);
|
|
} else {
|
|
literal = JSON.parse("\"" + literalString + "\"");
|
|
}
|
|
this._current++;
|
|
return literal;
|
|
},
|
|
|
|
_looksLikeJSON: function(literalString) {
|
|
var startingChars = "[{\"";
|
|
var jsonLiterals = ["true", "false", "null"];
|
|
var numberLooking = "-0123456789";
|
|
|
|
if (literalString === "") {
|
|
return false;
|
|
} else if (startingChars.indexOf(literalString[0]) >= 0) {
|
|
return true;
|
|
} else if (jsonLiterals.indexOf(literalString) >= 0) {
|
|
return true;
|
|
} else if (numberLooking.indexOf(literalString[0]) >= 0) {
|
|
try {
|
|
JSON.parse(literalString);
|
|
return true;
|
|
} catch (ex) {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
};
|
|
|
|
var bindingPower = {};
|
|
bindingPower[TOK_EOF] = 0;
|
|
bindingPower[TOK_UNQUOTEDIDENTIFIER] = 0;
|
|
bindingPower[TOK_QUOTEDIDENTIFIER] = 0;
|
|
bindingPower[TOK_RBRACKET] = 0;
|
|
bindingPower[TOK_RPAREN] = 0;
|
|
bindingPower[TOK_COMMA] = 0;
|
|
bindingPower[TOK_RBRACE] = 0;
|
|
bindingPower[TOK_NUMBER] = 0;
|
|
bindingPower[TOK_CURRENT] = 0;
|
|
bindingPower[TOK_EXPREF] = 0;
|
|
bindingPower[TOK_PIPE] = 1;
|
|
bindingPower[TOK_OR] = 2;
|
|
bindingPower[TOK_AND] = 3;
|
|
bindingPower[TOK_EQ] = 5;
|
|
bindingPower[TOK_GT] = 5;
|
|
bindingPower[TOK_LT] = 5;
|
|
bindingPower[TOK_GTE] = 5;
|
|
bindingPower[TOK_LTE] = 5;
|
|
bindingPower[TOK_NE] = 5;
|
|
bindingPower[TOK_FLATTEN] = 9;
|
|
bindingPower[TOK_STAR] = 20;
|
|
bindingPower[TOK_FILTER] = 21;
|
|
bindingPower[TOK_DOT] = 40;
|
|
bindingPower[TOK_NOT] = 45;
|
|
bindingPower[TOK_LBRACE] = 50;
|
|
bindingPower[TOK_LBRACKET] = 55;
|
|
bindingPower[TOK_LPAREN] = 60;
|
|
|
|
function Parser() {
|
|
}
|
|
|
|
Parser.prototype = {
|
|
parse: function(expression) {
|
|
this._loadTokens(expression);
|
|
this.index = 0;
|
|
var ast = this.expression(0);
|
|
if (this._lookahead(0) !== TOK_EOF) {
|
|
var t = this._lookaheadToken(0);
|
|
var error = new Error(
|
|
"Unexpected token type: " + t.type + ", value: " + t.value);
|
|
error.name = "ParserError";
|
|
throw error;
|
|
}
|
|
return ast;
|
|
},
|
|
|
|
_loadTokens: function(expression) {
|
|
var lexer = new Lexer();
|
|
var tokens = lexer.tokenize(expression);
|
|
tokens.push({type: TOK_EOF, value: "", start: expression.length});
|
|
this.tokens = tokens;
|
|
},
|
|
|
|
expression: function(rbp) {
|
|
var leftToken = this._lookaheadToken(0);
|
|
this._advance();
|
|
var left = this.nud(leftToken);
|
|
var currentToken = this._lookahead(0);
|
|
while (rbp < bindingPower[currentToken]) {
|
|
this._advance();
|
|
left = this.led(currentToken, left);
|
|
currentToken = this._lookahead(0);
|
|
}
|
|
return left;
|
|
},
|
|
|
|
_lookahead: function(number) {
|
|
return this.tokens[this.index + number].type;
|
|
},
|
|
|
|
_lookaheadToken: function(number) {
|
|
return this.tokens[this.index + number];
|
|
},
|
|
|
|
_advance: function() {
|
|
this.index++;
|
|
},
|
|
|
|
nud: function(token) {
|
|
var left;
|
|
var right;
|
|
var expression;
|
|
switch (token.type) {
|
|
case TOK_LITERAL:
|
|
return {type: "Literal", value: token.value};
|
|
case TOK_UNQUOTEDIDENTIFIER:
|
|
return {type: "Field", name: token.value};
|
|
case TOK_QUOTEDIDENTIFIER:
|
|
var node = {type: "Field", name: token.value};
|
|
if (this._lookahead(0) === TOK_LPAREN) {
|
|
throw new Error("Quoted identifier not allowed for function names.");
|
|
} else {
|
|
return node;
|
|
}
|
|
break;
|
|
case TOK_NOT:
|
|
right = this.expression(bindingPower.Not);
|
|
return {type: "NotExpression", children: [right]};
|
|
case TOK_STAR:
|
|
left = {type: "Identity"};
|
|
right = null;
|
|
if (this._lookahead(0) === TOK_RBRACKET) {
|
|
right = {type: "Identity"};
|
|
} else {
|
|
right = this._parseProjectionRHS(bindingPower.Star);
|
|
}
|
|
return {type: "ValueProjection", children: [left, right]};
|
|
case TOK_FILTER:
|
|
return this.led(token.type, {type: "Identity"});
|
|
case TOK_LBRACE:
|
|
return this._parseMultiselectHash();
|
|
case TOK_FLATTEN:
|
|
left = {type: TOK_FLATTEN, children: [{type: "Identity"}]};
|
|
right = this._parseProjectionRHS(bindingPower.Flatten);
|
|
return {type: "Projection", children: [left, right]};
|
|
case TOK_LBRACKET:
|
|
if (this._lookahead(0) === TOK_NUMBER || this._lookahead(0) === TOK_COLON) {
|
|
right = this._parseIndexExpression();
|
|
return this._projectIfSlice({type: "Identity"}, right);
|
|
} else if (this._lookahead(0) === TOK_STAR &&
|
|
this._lookahead(1) === TOK_RBRACKET) {
|
|
this._advance();
|
|
this._advance();
|
|
right = this._parseProjectionRHS(bindingPower.Star);
|
|
return {type: "Projection",
|
|
children: [{type: "Identity"}, right]};
|
|
} else {
|
|
return this._parseMultiselectList();
|
|
}
|
|
break;
|
|
case TOK_CURRENT:
|
|
return {type: TOK_CURRENT};
|
|
case TOK_EXPREF:
|
|
expression = this.expression(bindingPower.Expref);
|
|
return {type: "ExpressionReference", children: [expression]};
|
|
case TOK_LPAREN:
|
|
var args = [];
|
|
while (this._lookahead(0) !== TOK_RPAREN) {
|
|
if (this._lookahead(0) === TOK_CURRENT) {
|
|
expression = {type: TOK_CURRENT};
|
|
this._advance();
|
|
} else {
|
|
expression = this.expression(0);
|
|
}
|
|
args.push(expression);
|
|
}
|
|
this._match(TOK_RPAREN);
|
|
return args[0];
|
|
default:
|
|
this._errorToken(token);
|
|
}
|
|
},
|
|
|
|
led: function(tokenName, left) {
|
|
var right;
|
|
switch(tokenName) {
|
|
case TOK_DOT:
|
|
var rbp = bindingPower.Dot;
|
|
if (this._lookahead(0) !== TOK_STAR) {
|
|
right = this._parseDotRHS(rbp);
|
|
return {type: "Subexpression", children: [left, right]};
|
|
} else {
|
|
this._advance();
|
|
right = this._parseProjectionRHS(rbp);
|
|
return {type: "ValueProjection", children: [left, right]};
|
|
}
|
|
break;
|
|
case TOK_PIPE:
|
|
right = this.expression(bindingPower.Pipe);
|
|
return {type: TOK_PIPE, children: [left, right]};
|
|
case TOK_OR:
|
|
right = this.expression(bindingPower.Or);
|
|
return {type: "OrExpression", children: [left, right]};
|
|
case TOK_AND:
|
|
right = this.expression(bindingPower.And);
|
|
return {type: "AndExpression", children: [left, right]};
|
|
case TOK_LPAREN:
|
|
var name = left.name;
|
|
var args = [];
|
|
var expression, node;
|
|
while (this._lookahead(0) !== TOK_RPAREN) {
|
|
if (this._lookahead(0) === TOK_CURRENT) {
|
|
expression = {type: TOK_CURRENT};
|
|
this._advance();
|
|
} else {
|
|
expression = this.expression(0);
|
|
}
|
|
if (this._lookahead(0) === TOK_COMMA) {
|
|
this._match(TOK_COMMA);
|
|
}
|
|
args.push(expression);
|
|
}
|
|
this._match(TOK_RPAREN);
|
|
node = {type: "Function", name: name, children: args};
|
|
return node;
|
|
case TOK_FILTER:
|
|
var condition = this.expression(0);
|
|
this._match(TOK_RBRACKET);
|
|
if (this._lookahead(0) === TOK_FLATTEN) {
|
|
right = {type: "Identity"};
|
|
} else {
|
|
right = this._parseProjectionRHS(bindingPower.Filter);
|
|
}
|
|
return {type: "FilterProjection", children: [left, right, condition]};
|
|
case TOK_FLATTEN:
|
|
var leftNode = {type: TOK_FLATTEN, children: [left]};
|
|
var rightNode = this._parseProjectionRHS(bindingPower.Flatten);
|
|
return {type: "Projection", children: [leftNode, rightNode]};
|
|
case TOK_EQ:
|
|
case TOK_NE:
|
|
case TOK_GT:
|
|
case TOK_GTE:
|
|
case TOK_LT:
|
|
case TOK_LTE:
|
|
return this._parseComparator(left, tokenName);
|
|
case TOK_LBRACKET:
|
|
var token = this._lookaheadToken(0);
|
|
if (token.type === TOK_NUMBER || token.type === TOK_COLON) {
|
|
right = this._parseIndexExpression();
|
|
return this._projectIfSlice(left, right);
|
|
} else {
|
|
this._match(TOK_STAR);
|
|
this._match(TOK_RBRACKET);
|
|
right = this._parseProjectionRHS(bindingPower.Star);
|
|
return {type: "Projection", children: [left, right]};
|
|
}
|
|
break;
|
|
default:
|
|
this._errorToken(this._lookaheadToken(0));
|
|
}
|
|
},
|
|
|
|
_match: function(tokenType) {
|
|
if (this._lookahead(0) === tokenType) {
|
|
this._advance();
|
|
} else {
|
|
var t = this._lookaheadToken(0);
|
|
var error = new Error("Expected " + tokenType + ", got: " + t.type);
|
|
error.name = "ParserError";
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
_errorToken: function(token) {
|
|
var error = new Error("Invalid token (" +
|
|
token.type + "): \"" +
|
|
token.value + "\"");
|
|
error.name = "ParserError";
|
|
throw error;
|
|
},
|
|
|
|
|
|
_parseIndexExpression: function() {
|
|
if (this._lookahead(0) === TOK_COLON || this._lookahead(1) === TOK_COLON) {
|
|
return this._parseSliceExpression();
|
|
} else {
|
|
var node = {
|
|
type: "Index",
|
|
value: this._lookaheadToken(0).value};
|
|
this._advance();
|
|
this._match(TOK_RBRACKET);
|
|
return node;
|
|
}
|
|
},
|
|
|
|
_projectIfSlice: function(left, right) {
|
|
var indexExpr = {type: "IndexExpression", children: [left, right]};
|
|
if (right.type === "Slice") {
|
|
return {
|
|
type: "Projection",
|
|
children: [indexExpr, this._parseProjectionRHS(bindingPower.Star)]
|
|
};
|
|
} else {
|
|
return indexExpr;
|
|
}
|
|
},
|
|
|
|
_parseSliceExpression: function() {
|
|
var parts = [null, null, null];
|
|
var index = 0;
|
|
var currentToken = this._lookahead(0);
|
|
while (currentToken !== TOK_RBRACKET && index < 3) {
|
|
if (currentToken === TOK_COLON) {
|
|
index++;
|
|
this._advance();
|
|
} else if (currentToken === TOK_NUMBER) {
|
|
parts[index] = this._lookaheadToken(0).value;
|
|
this._advance();
|
|
} else {
|
|
var t = this._lookahead(0);
|
|
var error = new Error("Syntax error, unexpected token: " +
|
|
t.value + "(" + t.type + ")");
|
|
error.name = "Parsererror";
|
|
throw error;
|
|
}
|
|
currentToken = this._lookahead(0);
|
|
}
|
|
this._match(TOK_RBRACKET);
|
|
return {
|
|
type: "Slice",
|
|
children: parts
|
|
};
|
|
},
|
|
|
|
_parseComparator: function(left, comparator) {
|
|
var right = this.expression(bindingPower[comparator]);
|
|
return {type: "Comparator", name: comparator, children: [left, right]};
|
|
},
|
|
|
|
_parseDotRHS: function(rbp) {
|
|
var lookahead = this._lookahead(0);
|
|
var exprTokens = [TOK_UNQUOTEDIDENTIFIER, TOK_QUOTEDIDENTIFIER, TOK_STAR];
|
|
if (exprTokens.indexOf(lookahead) >= 0) {
|
|
return this.expression(rbp);
|
|
} else if (lookahead === TOK_LBRACKET) {
|
|
this._match(TOK_LBRACKET);
|
|
return this._parseMultiselectList();
|
|
} else if (lookahead === TOK_LBRACE) {
|
|
this._match(TOK_LBRACE);
|
|
return this._parseMultiselectHash();
|
|
}
|
|
},
|
|
|
|
_parseProjectionRHS: function(rbp) {
|
|
var right;
|
|
if (bindingPower[this._lookahead(0)] < 10) {
|
|
right = {type: "Identity"};
|
|
} else if (this._lookahead(0) === TOK_LBRACKET) {
|
|
right = this.expression(rbp);
|
|
} else if (this._lookahead(0) === TOK_FILTER) {
|
|
right = this.expression(rbp);
|
|
} else if (this._lookahead(0) === TOK_DOT) {
|
|
this._match(TOK_DOT);
|
|
right = this._parseDotRHS(rbp);
|
|
} else {
|
|
var t = this._lookaheadToken(0);
|
|
var error = new Error("Sytanx error, unexpected token: " +
|
|
t.value + "(" + t.type + ")");
|
|
error.name = "ParserError";
|
|
throw error;
|
|
}
|
|
return right;
|
|
},
|
|
|
|
_parseMultiselectList: function() {
|
|
var expressions = [];
|
|
while (this._lookahead(0) !== TOK_RBRACKET) {
|
|
var expression = this.expression(0);
|
|
expressions.push(expression);
|
|
if (this._lookahead(0) === TOK_COMMA) {
|
|
this._match(TOK_COMMA);
|
|
if (this._lookahead(0) === TOK_RBRACKET) {
|
|
throw new Error("Unexpected token Rbracket");
|
|
}
|
|
}
|
|
}
|
|
this._match(TOK_RBRACKET);
|
|
return {type: "MultiSelectList", children: expressions};
|
|
},
|
|
|
|
_parseMultiselectHash: function() {
|
|
var pairs = [];
|
|
var identifierTypes = [TOK_UNQUOTEDIDENTIFIER, TOK_QUOTEDIDENTIFIER];
|
|
var keyToken, keyName, value, node;
|
|
for (;;) {
|
|
keyToken = this._lookaheadToken(0);
|
|
if (identifierTypes.indexOf(keyToken.type) < 0) {
|
|
throw new Error("Expecting an identifier token, got: " +
|
|
keyToken.type);
|
|
}
|
|
keyName = keyToken.value;
|
|
this._advance();
|
|
this._match(TOK_COLON);
|
|
value = this.expression(0);
|
|
node = {type: "KeyValuePair", name: keyName, value: value};
|
|
pairs.push(node);
|
|
if (this._lookahead(0) === TOK_COMMA) {
|
|
this._match(TOK_COMMA);
|
|
} else if (this._lookahead(0) === TOK_RBRACE) {
|
|
this._match(TOK_RBRACE);
|
|
break;
|
|
}
|
|
}
|
|
return {type: "MultiSelectHash", children: pairs};
|
|
}
|
|
};
|
|
|
|
|
|
function TreeInterpreter(runtime) {
|
|
this.runtime = runtime;
|
|
}
|
|
|
|
TreeInterpreter.prototype = {
|
|
search: function(node, value) {
|
|
return this.visit(node, value);
|
|
},
|
|
|
|
visit: function(node, value) {
|
|
var matched, current, result, first, second, field, left, right, collected, i;
|
|
switch (node.type) {
|
|
case "Field":
|
|
if (value === null ) {
|
|
return null;
|
|
} else if (isObject(value)) {
|
|
field = value[node.name];
|
|
if (field === undefined) {
|
|
return null;
|
|
} else {
|
|
return field;
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
break;
|
|
case "Subexpression":
|
|
result = this.visit(node.children[0], value);
|
|
for (i = 1; i < node.children.length; i++) {
|
|
result = this.visit(node.children[1], result);
|
|
if (result === null) {
|
|
return null;
|
|
}
|
|
}
|
|
return result;
|
|
case "IndexExpression":
|
|
left = this.visit(node.children[0], value);
|
|
right = this.visit(node.children[1], left);
|
|
return right;
|
|
case "Index":
|
|
if (!isArray(value)) {
|
|
return null;
|
|
}
|
|
var index = node.value;
|
|
if (index < 0) {
|
|
index = value.length + index;
|
|
}
|
|
result = value[index];
|
|
if (result === undefined) {
|
|
result = null;
|
|
}
|
|
return result;
|
|
case "Slice":
|
|
if (!isArray(value)) {
|
|
return null;
|
|
}
|
|
var sliceParams = node.children.slice(0);
|
|
var computed = this.computeSliceParams(value.length, sliceParams);
|
|
var start = computed[0];
|
|
var stop = computed[1];
|
|
var step = computed[2];
|
|
result = [];
|
|
if (step > 0) {
|
|
for (i = start; i < stop; i += step) {
|
|
result.push(value[i]);
|
|
}
|
|
} else {
|
|
for (i = start; i > stop; i += step) {
|
|
result.push(value[i]);
|
|
}
|
|
}
|
|
return result;
|
|
case "Projection":
|
|
var base = this.visit(node.children[0], value);
|
|
if (!isArray(base)) {
|
|
return null;
|
|
}
|
|
collected = [];
|
|
for (i = 0; i < base.length; i++) {
|
|
current = this.visit(node.children[1], base[i]);
|
|
if (current !== null) {
|
|
collected.push(current);
|
|
}
|
|
}
|
|
return collected;
|
|
case "ValueProjection":
|
|
base = this.visit(node.children[0], value);
|
|
if (!isObject(base)) {
|
|
return null;
|
|
}
|
|
collected = [];
|
|
var values = objValues(base);
|
|
for (i = 0; i < values.length; i++) {
|
|
current = this.visit(node.children[1], values[i]);
|
|
if (current !== null) {
|
|
collected.push(current);
|
|
}
|
|
}
|
|
return collected;
|
|
case "FilterProjection":
|
|
base = this.visit(node.children[0], value);
|
|
if (!isArray(base)) {
|
|
return null;
|
|
}
|
|
var filtered = [];
|
|
var finalResults = [];
|
|
for (i = 0; i < base.length; i++) {
|
|
matched = this.visit(node.children[2], base[i]);
|
|
if (!isFalse(matched)) {
|
|
filtered.push(base[i]);
|
|
}
|
|
}
|
|
for (var j = 0; j < filtered.length; j++) {
|
|
current = this.visit(node.children[1], filtered[j]);
|
|
if (current !== null) {
|
|
finalResults.push(current);
|
|
}
|
|
}
|
|
return finalResults;
|
|
case "Comparator":
|
|
first = this.visit(node.children[0], value);
|
|
second = this.visit(node.children[1], value);
|
|
switch(node.name) {
|
|
case TOK_EQ:
|
|
result = strictDeepEqual(first, second);
|
|
break;
|
|
case TOK_NE:
|
|
result = !strictDeepEqual(first, second);
|
|
break;
|
|
case TOK_GT:
|
|
result = first > second;
|
|
break;
|
|
case TOK_GTE:
|
|
result = first >= second;
|
|
break;
|
|
case TOK_LT:
|
|
result = first < second;
|
|
break;
|
|
case TOK_LTE:
|
|
result = first <= second;
|
|
break;
|
|
default:
|
|
throw new Error("Unknown comparator: " + node.name);
|
|
}
|
|
return result;
|
|
case TOK_FLATTEN:
|
|
var original = this.visit(node.children[0], value);
|
|
if (!isArray(original)) {
|
|
return null;
|
|
}
|
|
var merged = [];
|
|
for (i = 0; i < original.length; i++) {
|
|
current = original[i];
|
|
if (isArray(current)) {
|
|
merged.push.apply(merged, current);
|
|
} else {
|
|
merged.push(current);
|
|
}
|
|
}
|
|
return merged;
|
|
case "Identity":
|
|
return value;
|
|
case "MultiSelectList":
|
|
if (value === null) {
|
|
return null;
|
|
}
|
|
collected = [];
|
|
for (i = 0; i < node.children.length; i++) {
|
|
collected.push(this.visit(node.children[i], value));
|
|
}
|
|
return collected;
|
|
case "MultiSelectHash":
|
|
if (value === null) {
|
|
return null;
|
|
}
|
|
collected = {};
|
|
var child;
|
|
for (i = 0; i < node.children.length; i++) {
|
|
child = node.children[i];
|
|
collected[child.name] = this.visit(child.value, value);
|
|
}
|
|
return collected;
|
|
case "OrExpression":
|
|
matched = this.visit(node.children[0], value);
|
|
if (isFalse(matched)) {
|
|
matched = this.visit(node.children[1], value);
|
|
}
|
|
return matched;
|
|
case "AndExpression":
|
|
first = this.visit(node.children[0], value);
|
|
|
|
if (isFalse(first) === true) {
|
|
return first;
|
|
}
|
|
return this.visit(node.children[1], value);
|
|
case "NotExpression":
|
|
first = this.visit(node.children[0], value);
|
|
return isFalse(first);
|
|
case "Literal":
|
|
return node.value;
|
|
case TOK_PIPE:
|
|
left = this.visit(node.children[0], value);
|
|
return this.visit(node.children[1], left);
|
|
case TOK_CURRENT:
|
|
return value;
|
|
case "Function":
|
|
var resolvedArgs = [];
|
|
for (i = 0; i < node.children.length; i++) {
|
|
resolvedArgs.push(this.visit(node.children[i], value));
|
|
}
|
|
return this.runtime.callFunction(node.name, resolvedArgs);
|
|
case "ExpressionReference":
|
|
var refNode = node.children[0];
|
|
refNode.jmespathType = TOK_EXPREF;
|
|
return refNode;
|
|
default:
|
|
throw new Error("Unknown node type: " + node.type);
|
|
}
|
|
},
|
|
|
|
computeSliceParams: function(arrayLength, sliceParams) {
|
|
var start = sliceParams[0];
|
|
var stop = sliceParams[1];
|
|
var step = sliceParams[2];
|
|
var computed = [null, null, null];
|
|
if (step === null) {
|
|
step = 1;
|
|
} else if (step === 0) {
|
|
var error = new Error("Invalid slice, step cannot be 0");
|
|
error.name = "RuntimeError";
|
|
throw error;
|
|
}
|
|
var stepValueNegative = step < 0 ? true : false;
|
|
|
|
if (start === null) {
|
|
start = stepValueNegative ? arrayLength - 1 : 0;
|
|
} else {
|
|
start = this.capSliceRange(arrayLength, start, step);
|
|
}
|
|
|
|
if (stop === null) {
|
|
stop = stepValueNegative ? -1 : arrayLength;
|
|
} else {
|
|
stop = this.capSliceRange(arrayLength, stop, step);
|
|
}
|
|
computed[0] = start;
|
|
computed[1] = stop;
|
|
computed[2] = step;
|
|
return computed;
|
|
},
|
|
|
|
capSliceRange: function(arrayLength, actualValue, step) {
|
|
if (actualValue < 0) {
|
|
actualValue += arrayLength;
|
|
if (actualValue < 0) {
|
|
actualValue = step < 0 ? -1 : 0;
|
|
}
|
|
} else if (actualValue >= arrayLength) {
|
|
actualValue = step < 0 ? arrayLength - 1 : arrayLength;
|
|
}
|
|
return actualValue;
|
|
}
|
|
|
|
};
|
|
|
|
function Runtime(interpreter) {
|
|
this._interpreter = interpreter;
|
|
this.functionTable = {
|
|
abs: {_func: this._functionAbs, _signature: [{types: [TYPE_NUMBER]}]},
|
|
avg: {_func: this._functionAvg, _signature: [{types: [TYPE_ARRAY_NUMBER]}]},
|
|
ceil: {_func: this._functionCeil, _signature: [{types: [TYPE_NUMBER]}]},
|
|
contains: {
|
|
_func: this._functionContains,
|
|
_signature: [{types: [TYPE_STRING, TYPE_ARRAY]},
|
|
{types: [TYPE_ANY]}]},
|
|
"ends_with": {
|
|
_func: this._functionEndsWith,
|
|
_signature: [{types: [TYPE_STRING]}, {types: [TYPE_STRING]}]},
|
|
floor: {_func: this._functionFloor, _signature: [{types: [TYPE_NUMBER]}]},
|
|
length: {
|
|
_func: this._functionLength,
|
|
_signature: [{types: [TYPE_STRING, TYPE_ARRAY, TYPE_OBJECT]}]},
|
|
map: {
|
|
_func: this._functionMap,
|
|
_signature: [{types: [TYPE_EXPREF]}, {types: [TYPE_ARRAY]}]},
|
|
max: {
|
|
_func: this._functionMax,
|
|
_signature: [{types: [TYPE_ARRAY_NUMBER, TYPE_ARRAY_STRING]}]},
|
|
"merge": {
|
|
_func: this._functionMerge,
|
|
_signature: [{types: [TYPE_OBJECT], variadic: true}]
|
|
},
|
|
"max_by": {
|
|
_func: this._functionMaxBy,
|
|
_signature: [{types: [TYPE_ARRAY]}, {types: [TYPE_EXPREF]}]
|
|
},
|
|
sum: {_func: this._functionSum, _signature: [{types: [TYPE_ARRAY_NUMBER]}]},
|
|
"starts_with": {
|
|
_func: this._functionStartsWith,
|
|
_signature: [{types: [TYPE_STRING]}, {types: [TYPE_STRING]}]},
|
|
min: {
|
|
_func: this._functionMin,
|
|
_signature: [{types: [TYPE_ARRAY_NUMBER, TYPE_ARRAY_STRING]}]},
|
|
"min_by": {
|
|
_func: this._functionMinBy,
|
|
_signature: [{types: [TYPE_ARRAY]}, {types: [TYPE_EXPREF]}]
|
|
},
|
|
type: {_func: this._functionType, _signature: [{types: [TYPE_ANY]}]},
|
|
keys: {_func: this._functionKeys, _signature: [{types: [TYPE_OBJECT]}]},
|
|
values: {_func: this._functionValues, _signature: [{types: [TYPE_OBJECT]}]},
|
|
sort: {_func: this._functionSort, _signature: [{types: [TYPE_ARRAY_STRING, TYPE_ARRAY_NUMBER]}]},
|
|
"sort_by": {
|
|
_func: this._functionSortBy,
|
|
_signature: [{types: [TYPE_ARRAY]}, {types: [TYPE_EXPREF]}]
|
|
},
|
|
join: {
|
|
_func: this._functionJoin,
|
|
_signature: [
|
|
{types: [TYPE_STRING]},
|
|
{types: [TYPE_ARRAY_STRING]}
|
|
]
|
|
},
|
|
reverse: {
|
|
_func: this._functionReverse,
|
|
_signature: [{types: [TYPE_STRING, TYPE_ARRAY]}]},
|
|
"to_array": {_func: this._functionToArray, _signature: [{types: [TYPE_ANY]}]},
|
|
"to_string": {_func: this._functionToString, _signature: [{types: [TYPE_ANY]}]},
|
|
"to_number": {_func: this._functionToNumber, _signature: [{types: [TYPE_ANY]}]},
|
|
"not_null": {
|
|
_func: this._functionNotNull,
|
|
_signature: [{types: [TYPE_ANY], variadic: true}]
|
|
}
|
|
};
|
|
}
|
|
|
|
Runtime.prototype = {
|
|
callFunction: function(name, resolvedArgs) {
|
|
var functionEntry = this.functionTable[name];
|
|
if (functionEntry === undefined) {
|
|
throw new Error("Unknown function: " + name + "()");
|
|
}
|
|
this._validateArgs(name, resolvedArgs, functionEntry._signature);
|
|
return functionEntry._func.call(this, resolvedArgs);
|
|
},
|
|
|
|
_validateArgs: function(name, args, signature) {
|
|
var pluralized;
|
|
if (signature[signature.length - 1].variadic) {
|
|
if (args.length < signature.length) {
|
|
pluralized = signature.length === 1 ? " argument" : " arguments";
|
|
throw new Error("ArgumentError: " + name + "() " +
|
|
"takes at least" + signature.length + pluralized +
|
|
" but received " + args.length);
|
|
}
|
|
} else if (args.length !== signature.length) {
|
|
pluralized = signature.length === 1 ? " argument" : " arguments";
|
|
throw new Error("ArgumentError: " + name + "() " +
|
|
"takes " + signature.length + pluralized +
|
|
" but received " + args.length);
|
|
}
|
|
var currentSpec;
|
|
var actualType;
|
|
var typeMatched;
|
|
for (var i = 0; i < signature.length; i++) {
|
|
typeMatched = false;
|
|
currentSpec = signature[i].types;
|
|
actualType = this._getTypeName(args[i]);
|
|
for (var j = 0; j < currentSpec.length; j++) {
|
|
if (this._typeMatches(actualType, currentSpec[j], args[i])) {
|
|
typeMatched = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!typeMatched) {
|
|
throw new Error("TypeError: " + name + "() " +
|
|
"expected argument " + (i + 1) +
|
|
" to be type " + currentSpec +
|
|
" but received type " + actualType +
|
|
" instead.");
|
|
}
|
|
}
|
|
},
|
|
|
|
_typeMatches: function(actual, expected, argValue) {
|
|
if (expected === TYPE_ANY) {
|
|
return true;
|
|
}
|
|
if (expected === TYPE_ARRAY_STRING ||
|
|
expected === TYPE_ARRAY_NUMBER ||
|
|
expected === TYPE_ARRAY) {
|
|
if (expected === TYPE_ARRAY) {
|
|
return actual === TYPE_ARRAY;
|
|
} else if (actual === TYPE_ARRAY) {
|
|
var subtype;
|
|
if (expected === TYPE_ARRAY_NUMBER) {
|
|
subtype = TYPE_NUMBER;
|
|
} else if (expected === TYPE_ARRAY_STRING) {
|
|
subtype = TYPE_STRING;
|
|
}
|
|
for (var i = 0; i < argValue.length; i++) {
|
|
if (!this._typeMatches(
|
|
this._getTypeName(argValue[i]), subtype,
|
|
argValue[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
} else {
|
|
return actual === expected;
|
|
}
|
|
},
|
|
_getTypeName: function(obj) {
|
|
switch (Object.prototype.toString.call(obj)) {
|
|
case "[object String]":
|
|
return TYPE_STRING;
|
|
case "[object Number]":
|
|
return TYPE_NUMBER;
|
|
case "[object Array]":
|
|
return TYPE_ARRAY;
|
|
case "[object Boolean]":
|
|
return TYPE_BOOLEAN;
|
|
case "[object Null]":
|
|
return TYPE_NULL;
|
|
case "[object Object]":
|
|
if (obj.jmespathType === TOK_EXPREF) {
|
|
return TYPE_EXPREF;
|
|
} else {
|
|
return TYPE_OBJECT;
|
|
}
|
|
}
|
|
},
|
|
|
|
_functionStartsWith: function(resolvedArgs) {
|
|
return resolvedArgs[0].lastIndexOf(resolvedArgs[1]) === 0;
|
|
},
|
|
|
|
_functionEndsWith: function(resolvedArgs) {
|
|
var searchStr = resolvedArgs[0];
|
|
var suffix = resolvedArgs[1];
|
|
return searchStr.indexOf(suffix, searchStr.length - suffix.length) !== -1;
|
|
},
|
|
|
|
_functionReverse: function(resolvedArgs) {
|
|
var typeName = this._getTypeName(resolvedArgs[0]);
|
|
if (typeName === TYPE_STRING) {
|
|
var originalStr = resolvedArgs[0];
|
|
var reversedStr = "";
|
|
for (var i = originalStr.length - 1; i >= 0; i--) {
|
|
reversedStr += originalStr[i];
|
|
}
|
|
return reversedStr;
|
|
} else {
|
|
var reversedArray = resolvedArgs[0].slice(0);
|
|
reversedArray.reverse();
|
|
return reversedArray;
|
|
}
|
|
},
|
|
|
|
_functionAbs: function(resolvedArgs) {
|
|
return Math.abs(resolvedArgs[0]);
|
|
},
|
|
|
|
_functionCeil: function(resolvedArgs) {
|
|
return Math.ceil(resolvedArgs[0]);
|
|
},
|
|
|
|
_functionAvg: function(resolvedArgs) {
|
|
var sum = 0;
|
|
var inputArray = resolvedArgs[0];
|
|
for (var i = 0; i < inputArray.length; i++) {
|
|
sum += inputArray[i];
|
|
}
|
|
return sum / inputArray.length;
|
|
},
|
|
|
|
_functionContains: function(resolvedArgs) {
|
|
return resolvedArgs[0].indexOf(resolvedArgs[1]) >= 0;
|
|
},
|
|
|
|
_functionFloor: function(resolvedArgs) {
|
|
return Math.floor(resolvedArgs[0]);
|
|
},
|
|
|
|
_functionLength: function(resolvedArgs) {
|
|
if (!isObject(resolvedArgs[0])) {
|
|
return resolvedArgs[0].length;
|
|
} else {
|
|
return Object.keys(resolvedArgs[0]).length;
|
|
}
|
|
},
|
|
|
|
_functionMap: function(resolvedArgs) {
|
|
var mapped = [];
|
|
var interpreter = this._interpreter;
|
|
var exprefNode = resolvedArgs[0];
|
|
var elements = resolvedArgs[1];
|
|
for (var i = 0; i < elements.length; i++) {
|
|
mapped.push(interpreter.visit(exprefNode, elements[i]));
|
|
}
|
|
return mapped;
|
|
},
|
|
|
|
_functionMerge: function(resolvedArgs) {
|
|
var merged = {};
|
|
for (var i = 0; i < resolvedArgs.length; i++) {
|
|
var current = resolvedArgs[i];
|
|
for (var key in current) {
|
|
merged[key] = current[key];
|
|
}
|
|
}
|
|
return merged;
|
|
},
|
|
|
|
_functionMax: function(resolvedArgs) {
|
|
if (resolvedArgs[0].length > 0) {
|
|
var typeName = this._getTypeName(resolvedArgs[0][0]);
|
|
if (typeName === TYPE_NUMBER) {
|
|
return Math.max.apply(Math, resolvedArgs[0]);
|
|
} else {
|
|
var elements = resolvedArgs[0];
|
|
var maxElement = elements[0];
|
|
for (var i = 1; i < elements.length; i++) {
|
|
if (maxElement.localeCompare(elements[i]) < 0) {
|
|
maxElement = elements[i];
|
|
}
|
|
}
|
|
return maxElement;
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
},
|
|
|
|
_functionMin: function(resolvedArgs) {
|
|
if (resolvedArgs[0].length > 0) {
|
|
var typeName = this._getTypeName(resolvedArgs[0][0]);
|
|
if (typeName === TYPE_NUMBER) {
|
|
return Math.min.apply(Math, resolvedArgs[0]);
|
|
} else {
|
|
var elements = resolvedArgs[0];
|
|
var minElement = elements[0];
|
|
for (var i = 1; i < elements.length; i++) {
|
|
if (elements[i].localeCompare(minElement) < 0) {
|
|
minElement = elements[i];
|
|
}
|
|
}
|
|
return minElement;
|
|
}
|
|
} else {
|
|
return null;
|
|
}
|
|
},
|
|
|
|
_functionSum: function(resolvedArgs) {
|
|
var sum = 0;
|
|
var listToSum = resolvedArgs[0];
|
|
for (var i = 0; i < listToSum.length; i++) {
|
|
sum += listToSum[i];
|
|
}
|
|
return sum;
|
|
},
|
|
|
|
_functionType: function(resolvedArgs) {
|
|
switch (this._getTypeName(resolvedArgs[0])) {
|
|
case TYPE_NUMBER:
|
|
return "number";
|
|
case TYPE_STRING:
|
|
return "string";
|
|
case TYPE_ARRAY:
|
|
return "array";
|
|
case TYPE_OBJECT:
|
|
return "object";
|
|
case TYPE_BOOLEAN:
|
|
return "boolean";
|
|
case TYPE_EXPREF:
|
|
return "expref";
|
|
case TYPE_NULL:
|
|
return "null";
|
|
}
|
|
},
|
|
|
|
_functionKeys: function(resolvedArgs) {
|
|
return Object.keys(resolvedArgs[0]);
|
|
},
|
|
|
|
_functionValues: function(resolvedArgs) {
|
|
var obj = resolvedArgs[0];
|
|
var keys = Object.keys(obj);
|
|
var values = [];
|
|
for (var i = 0; i < keys.length; i++) {
|
|
values.push(obj[keys[i]]);
|
|
}
|
|
return values;
|
|
},
|
|
|
|
_functionJoin: function(resolvedArgs) {
|
|
var joinChar = resolvedArgs[0];
|
|
var listJoin = resolvedArgs[1];
|
|
return listJoin.join(joinChar);
|
|
},
|
|
|
|
_functionToArray: function(resolvedArgs) {
|
|
if (this._getTypeName(resolvedArgs[0]) === TYPE_ARRAY) {
|
|
return resolvedArgs[0];
|
|
} else {
|
|
return [resolvedArgs[0]];
|
|
}
|
|
},
|
|
|
|
_functionToString: function(resolvedArgs) {
|
|
if (this._getTypeName(resolvedArgs[0]) === TYPE_STRING) {
|
|
return resolvedArgs[0];
|
|
} else {
|
|
return JSON.stringify(resolvedArgs[0]);
|
|
}
|
|
},
|
|
|
|
_functionToNumber: function(resolvedArgs) {
|
|
var typeName = this._getTypeName(resolvedArgs[0]);
|
|
var convertedValue;
|
|
if (typeName === TYPE_NUMBER) {
|
|
return resolvedArgs[0];
|
|
} else if (typeName === TYPE_STRING) {
|
|
convertedValue = +resolvedArgs[0];
|
|
if (!isNaN(convertedValue)) {
|
|
return convertedValue;
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
_functionNotNull: function(resolvedArgs) {
|
|
for (var i = 0; i < resolvedArgs.length; i++) {
|
|
if (this._getTypeName(resolvedArgs[i]) !== TYPE_NULL) {
|
|
return resolvedArgs[i];
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
_functionSort: function(resolvedArgs) {
|
|
var sortedArray = resolvedArgs[0].slice(0);
|
|
sortedArray.sort();
|
|
return sortedArray;
|
|
},
|
|
|
|
_functionSortBy: function(resolvedArgs) {
|
|
var sortedArray = resolvedArgs[0].slice(0);
|
|
if (sortedArray.length === 0) {
|
|
return sortedArray;
|
|
}
|
|
var interpreter = this._interpreter;
|
|
var exprefNode = resolvedArgs[1];
|
|
var requiredType = this._getTypeName(
|
|
interpreter.visit(exprefNode, sortedArray[0]));
|
|
if ([TYPE_NUMBER, TYPE_STRING].indexOf(requiredType) < 0) {
|
|
throw new Error("TypeError");
|
|
}
|
|
var that = this;
|
|
var decorated = [];
|
|
for (var i = 0; i < sortedArray.length; i++) {
|
|
decorated.push([i, sortedArray[i]]);
|
|
}
|
|
decorated.sort(function(a, b) {
|
|
var exprA = interpreter.visit(exprefNode, a[1]);
|
|
var exprB = interpreter.visit(exprefNode, b[1]);
|
|
if (that._getTypeName(exprA) !== requiredType) {
|
|
throw new Error(
|
|
"TypeError: expected " + requiredType + ", received " +
|
|
that._getTypeName(exprA));
|
|
} else if (that._getTypeName(exprB) !== requiredType) {
|
|
throw new Error(
|
|
"TypeError: expected " + requiredType + ", received " +
|
|
that._getTypeName(exprB));
|
|
}
|
|
if (exprA > exprB) {
|
|
return 1;
|
|
} else if (exprA < exprB) {
|
|
return -1;
|
|
} else {
|
|
return a[0] - b[0];
|
|
}
|
|
});
|
|
for (var j = 0; j < decorated.length; j++) {
|
|
sortedArray[j] = decorated[j][1];
|
|
}
|
|
return sortedArray;
|
|
},
|
|
|
|
_functionMaxBy: function(resolvedArgs) {
|
|
var exprefNode = resolvedArgs[1];
|
|
var resolvedArray = resolvedArgs[0];
|
|
var keyFunction = this.createKeyFunction(exprefNode, [TYPE_NUMBER, TYPE_STRING]);
|
|
var maxNumber = -Infinity;
|
|
var maxRecord;
|
|
var current;
|
|
for (var i = 0; i < resolvedArray.length; i++) {
|
|
current = keyFunction(resolvedArray[i]);
|
|
if (current > maxNumber) {
|
|
maxNumber = current;
|
|
maxRecord = resolvedArray[i];
|
|
}
|
|
}
|
|
return maxRecord;
|
|
},
|
|
|
|
_functionMinBy: function(resolvedArgs) {
|
|
var exprefNode = resolvedArgs[1];
|
|
var resolvedArray = resolvedArgs[0];
|
|
var keyFunction = this.createKeyFunction(exprefNode, [TYPE_NUMBER, TYPE_STRING]);
|
|
var minNumber = Infinity;
|
|
var minRecord;
|
|
var current;
|
|
for (var i = 0; i < resolvedArray.length; i++) {
|
|
current = keyFunction(resolvedArray[i]);
|
|
if (current < minNumber) {
|
|
minNumber = current;
|
|
minRecord = resolvedArray[i];
|
|
}
|
|
}
|
|
return minRecord;
|
|
},
|
|
|
|
createKeyFunction: function(exprefNode, allowedTypes) {
|
|
var that = this;
|
|
var interpreter = this._interpreter;
|
|
var keyFunc = function(x) {
|
|
var current = interpreter.visit(exprefNode, x);
|
|
if (allowedTypes.indexOf(that._getTypeName(current)) < 0) {
|
|
var msg = "TypeError: expected one of " + allowedTypes +
|
|
", received " + that._getTypeName(current);
|
|
throw new Error(msg);
|
|
}
|
|
return current;
|
|
};
|
|
return keyFunc;
|
|
}
|
|
|
|
};
|
|
|
|
function compile(stream) {
|
|
var parser = new Parser();
|
|
var ast = parser.parse(stream);
|
|
return ast;
|
|
}
|
|
|
|
function tokenize(stream) {
|
|
var lexer = new Lexer();
|
|
return lexer.tokenize(stream);
|
|
}
|
|
|
|
function search(data, expression) {
|
|
var parser = new Parser();
|
|
var runtime = new Runtime();
|
|
var interpreter = new TreeInterpreter(runtime);
|
|
runtime._interpreter = interpreter;
|
|
var node = parser.parse(expression);
|
|
return interpreter.search(node, data);
|
|
}
|
|
|
|
exports.tokenize = tokenize;
|
|
exports.compile = compile;
|
|
exports.search = search;
|
|
exports.strictDeepEqual = strictDeepEqual;
|
|
})(typeof exports === "undefined" ? this.jmespath = {} : exports);
|
|
|
|
},{}],194:[function(require,module,exports){
|
|
var arrayEvery = require('../internal/arrayEvery'),
|
|
baseCallback = require('../internal/baseCallback'),
|
|
baseEvery = require('../internal/baseEvery'),
|
|
isArray = require('../lang/isArray');
|
|
|
|
|
|
function every(collection, predicate, thisArg) {
|
|
var func = isArray(collection) ? arrayEvery : baseEvery;
|
|
if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
|
|
predicate = baseCallback(predicate, thisArg, 3);
|
|
}
|
|
return func(collection, predicate);
|
|
}
|
|
|
|
module.exports = every;
|
|
|
|
},{"../internal/arrayEvery":195,"../internal/baseCallback":197,"../internal/baseEvery":201,"../lang/isArray":228}],195:[function(require,module,exports){
|
|
|
|
function arrayEvery(array, predicate) {
|
|
var index = -1,
|
|
length = array.length;
|
|
|
|
while (++index < length) {
|
|
if (!predicate(array[index], index, array)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
module.exports = arrayEvery;
|
|
|
|
},{}],196:[function(require,module,exports){
|
|
var baseCopy = require('./baseCopy'),
|
|
keys = require('../object/keys');
|
|
|
|
|
|
function baseAssign(object, source, customizer) {
|
|
var props = keys(source);
|
|
if (!customizer) {
|
|
return baseCopy(source, object, props);
|
|
}
|
|
var index = -1,
|
|
length = props.length;
|
|
|
|
while (++index < length) {
|
|
var key = props[index],
|
|
value = object[key],
|
|
result = customizer(value, source[key], key, object, source);
|
|
|
|
if ((result === result ? (result !== value) : (value === value)) ||
|
|
(typeof value == 'undefined' && !(key in object))) {
|
|
object[key] = result;
|
|
}
|
|
}
|
|
return object;
|
|
}
|
|
|
|
module.exports = baseAssign;
|
|
|
|
},{"../object/keys":237,"./baseCopy":198}],197:[function(require,module,exports){
|
|
var baseMatches = require('./baseMatches'),
|
|
baseMatchesProperty = require('./baseMatchesProperty'),
|
|
baseProperty = require('./baseProperty'),
|
|
bindCallback = require('./bindCallback'),
|
|
identity = require('../utility/identity'),
|
|
isBindable = require('./isBindable');
|
|
|
|
|
|
function baseCallback(func, thisArg, argCount) {
|
|
var type = typeof func;
|
|
if (type == 'function') {
|
|
return (typeof thisArg != 'undefined' && isBindable(func))
|
|
? bindCallback(func, thisArg, argCount)
|
|
: func;
|
|
}
|
|
if (func == null) {
|
|
return identity;
|
|
}
|
|
if (type == 'object') {
|
|
return baseMatches(func);
|
|
}
|
|
return typeof thisArg == 'undefined'
|
|
? baseProperty(func + '')
|
|
: baseMatchesProperty(func + '', thisArg);
|
|
}
|
|
|
|
module.exports = baseCallback;
|
|
|
|
},{"../utility/identity":241,"./baseMatches":208,"./baseMatchesProperty":209,"./baseProperty":210,"./bindCallback":213,"./isBindable":218}],198:[function(require,module,exports){
|
|
|
|
function baseCopy(source, object, props) {
|
|
if (!props) {
|
|
props = object;
|
|
object = {};
|
|
}
|
|
var index = -1,
|
|
length = props.length;
|
|
|
|
while (++index < length) {
|
|
var key = props[index];
|
|
object[key] = source[key];
|
|
}
|
|
return object;
|
|
}
|
|
|
|
module.exports = baseCopy;
|
|
|
|
},{}],199:[function(require,module,exports){
|
|
(function (global){
|
|
var isObject = require('../lang/isObject');
|
|
|
|
|
|
var baseCreate = (function() {
|
|
function Object() {}
|
|
return function(prototype) {
|
|
if (isObject(prototype)) {
|
|
Object.prototype = prototype;
|
|
var result = new Object;
|
|
Object.prototype = null;
|
|
}
|
|
return result || global.Object();
|
|
};
|
|
}());
|
|
|
|
module.exports = baseCreate;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"../lang/isObject":232}],200:[function(require,module,exports){
|
|
var baseForOwn = require('./baseForOwn'),
|
|
isLength = require('./isLength'),
|
|
toObject = require('./toObject');
|
|
|
|
|
|
function baseEach(collection, iteratee) {
|
|
var length = collection ? collection.length : 0;
|
|
if (!isLength(length)) {
|
|
return baseForOwn(collection, iteratee);
|
|
}
|
|
var index = -1,
|
|
iterable = toObject(collection);
|
|
|
|
while (++index < length) {
|
|
if (iteratee(iterable[index], index, iterable) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return collection;
|
|
}
|
|
|
|
module.exports = baseEach;
|
|
|
|
},{"./baseForOwn":203,"./isLength":221,"./toObject":226}],201:[function(require,module,exports){
|
|
var baseEach = require('./baseEach');
|
|
|
|
|
|
function baseEvery(collection, predicate) {
|
|
var result = true;
|
|
baseEach(collection, function(value, index, collection) {
|
|
result = !!predicate(value, index, collection);
|
|
return result;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
module.exports = baseEvery;
|
|
|
|
},{"./baseEach":200}],202:[function(require,module,exports){
|
|
var toObject = require('./toObject');
|
|
|
|
|
|
function baseFor(object, iteratee, keysFunc) {
|
|
var index = -1,
|
|
iterable = toObject(object),
|
|
props = keysFunc(object),
|
|
length = props.length;
|
|
|
|
while (++index < length) {
|
|
var key = props[index];
|
|
if (iteratee(iterable[key], key, iterable) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return object;
|
|
}
|
|
|
|
module.exports = baseFor;
|
|
|
|
},{"./toObject":226}],203:[function(require,module,exports){
|
|
var baseFor = require('./baseFor'),
|
|
keys = require('../object/keys');
|
|
|
|
|
|
function baseForOwn(object, iteratee) {
|
|
return baseFor(object, iteratee, keys);
|
|
}
|
|
|
|
module.exports = baseForOwn;
|
|
|
|
},{"../object/keys":237,"./baseFor":202}],204:[function(require,module,exports){
|
|
var baseIsEqualDeep = require('./baseIsEqualDeep');
|
|
|
|
|
|
function baseIsEqual(value, other, customizer, isWhere, stackA, stackB) {
|
|
if (value === other) {
|
|
return value !== 0 || (1 / value == 1 / other);
|
|
}
|
|
var valType = typeof value,
|
|
othType = typeof other;
|
|
|
|
if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') ||
|
|
value == null || other == null) {
|
|
return value !== value && other !== other;
|
|
}
|
|
return baseIsEqualDeep(value, other, baseIsEqual, customizer, isWhere, stackA, stackB);
|
|
}
|
|
|
|
module.exports = baseIsEqual;
|
|
|
|
},{"./baseIsEqualDeep":205}],205:[function(require,module,exports){
|
|
var equalArrays = require('./equalArrays'),
|
|
equalByTag = require('./equalByTag'),
|
|
equalObjects = require('./equalObjects'),
|
|
isArray = require('../lang/isArray'),
|
|
isTypedArray = require('../lang/isTypedArray');
|
|
|
|
|
|
var argsTag = '[object Arguments]',
|
|
arrayTag = '[object Array]',
|
|
objectTag = '[object Object]';
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
function baseIsEqualDeep(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
|
|
var objIsArr = isArray(object),
|
|
othIsArr = isArray(other),
|
|
objTag = arrayTag,
|
|
othTag = arrayTag;
|
|
|
|
if (!objIsArr) {
|
|
objTag = objToString.call(object);
|
|
if (objTag == argsTag) {
|
|
objTag = objectTag;
|
|
} else if (objTag != objectTag) {
|
|
objIsArr = isTypedArray(object);
|
|
}
|
|
}
|
|
if (!othIsArr) {
|
|
othTag = objToString.call(other);
|
|
if (othTag == argsTag) {
|
|
othTag = objectTag;
|
|
} else if (othTag != objectTag) {
|
|
othIsArr = isTypedArray(other);
|
|
}
|
|
}
|
|
var objIsObj = objTag == objectTag,
|
|
othIsObj = othTag == objectTag,
|
|
isSameTag = objTag == othTag;
|
|
|
|
if (isSameTag && !(objIsArr || objIsObj)) {
|
|
return equalByTag(object, other, objTag);
|
|
}
|
|
var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
|
othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
|
|
|
if (valWrapped || othWrapped) {
|
|
return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isWhere, stackA, stackB);
|
|
}
|
|
if (!isSameTag) {
|
|
return false;
|
|
}
|
|
stackA || (stackA = []);
|
|
stackB || (stackB = []);
|
|
|
|
var length = stackA.length;
|
|
while (length--) {
|
|
if (stackA[length] == object) {
|
|
return stackB[length] == other;
|
|
}
|
|
}
|
|
stackA.push(object);
|
|
stackB.push(other);
|
|
|
|
var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isWhere, stackA, stackB);
|
|
|
|
stackA.pop();
|
|
stackB.pop();
|
|
|
|
return result;
|
|
}
|
|
|
|
module.exports = baseIsEqualDeep;
|
|
|
|
},{"../lang/isArray":228,"../lang/isTypedArray":234,"./equalArrays":215,"./equalByTag":216,"./equalObjects":217}],206:[function(require,module,exports){
|
|
|
|
function baseIsFunction(value) {
|
|
return typeof value == 'function' || false;
|
|
}
|
|
|
|
module.exports = baseIsFunction;
|
|
|
|
},{}],207:[function(require,module,exports){
|
|
var baseIsEqual = require('./baseIsEqual');
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
|
|
function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
|
|
var length = props.length;
|
|
if (object == null) {
|
|
return !length;
|
|
}
|
|
var index = -1,
|
|
noCustomizer = !customizer;
|
|
|
|
while (++index < length) {
|
|
if ((noCustomizer && strictCompareFlags[index])
|
|
? values[index] !== object[props[index]]
|
|
: !hasOwnProperty.call(object, props[index])
|
|
) {
|
|
return false;
|
|
}
|
|
}
|
|
index = -1;
|
|
while (++index < length) {
|
|
var key = props[index];
|
|
if (noCustomizer && strictCompareFlags[index]) {
|
|
var result = hasOwnProperty.call(object, key);
|
|
} else {
|
|
var objValue = object[key],
|
|
srcValue = values[index];
|
|
|
|
result = customizer ? customizer(objValue, srcValue, key) : undefined;
|
|
if (typeof result == 'undefined') {
|
|
result = baseIsEqual(srcValue, objValue, customizer, true);
|
|
}
|
|
}
|
|
if (!result) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
module.exports = baseIsMatch;
|
|
|
|
},{"./baseIsEqual":204}],208:[function(require,module,exports){
|
|
var baseIsMatch = require('./baseIsMatch'),
|
|
isStrictComparable = require('./isStrictComparable'),
|
|
keys = require('../object/keys');
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
|
|
function baseMatches(source) {
|
|
var props = keys(source),
|
|
length = props.length;
|
|
|
|
if (length == 1) {
|
|
var key = props[0],
|
|
value = source[key];
|
|
|
|
if (isStrictComparable(value)) {
|
|
return function(object) {
|
|
return object != null && object[key] === value && hasOwnProperty.call(object, key);
|
|
};
|
|
}
|
|
}
|
|
var values = Array(length),
|
|
strictCompareFlags = Array(length);
|
|
|
|
while (length--) {
|
|
value = source[props[length]];
|
|
values[length] = value;
|
|
strictCompareFlags[length] = isStrictComparable(value);
|
|
}
|
|
return function(object) {
|
|
return baseIsMatch(object, props, values, strictCompareFlags);
|
|
};
|
|
}
|
|
|
|
module.exports = baseMatches;
|
|
|
|
},{"../object/keys":237,"./baseIsMatch":207,"./isStrictComparable":223}],209:[function(require,module,exports){
|
|
var baseIsEqual = require('./baseIsEqual'),
|
|
isStrictComparable = require('./isStrictComparable');
|
|
|
|
|
|
function baseMatchesProperty(key, value) {
|
|
if (isStrictComparable(value)) {
|
|
return function(object) {
|
|
return object != null && object[key] === value;
|
|
};
|
|
}
|
|
return function(object) {
|
|
return object != null && baseIsEqual(value, object[key], null, true);
|
|
};
|
|
}
|
|
|
|
module.exports = baseMatchesProperty;
|
|
|
|
},{"./baseIsEqual":204,"./isStrictComparable":223}],210:[function(require,module,exports){
|
|
|
|
function baseProperty(key) {
|
|
return function(object) {
|
|
return object == null ? undefined : object[key];
|
|
};
|
|
}
|
|
|
|
module.exports = baseProperty;
|
|
|
|
},{}],211:[function(require,module,exports){
|
|
var identity = require('../utility/identity'),
|
|
metaMap = require('./metaMap');
|
|
|
|
|
|
var baseSetData = !metaMap ? identity : function(func, data) {
|
|
metaMap.set(func, data);
|
|
return func;
|
|
};
|
|
|
|
module.exports = baseSetData;
|
|
|
|
},{"../utility/identity":241,"./metaMap":224}],212:[function(require,module,exports){
|
|
|
|
function baseToString(value) {
|
|
if (typeof value == 'string') {
|
|
return value;
|
|
}
|
|
return value == null ? '' : (value + '');
|
|
}
|
|
|
|
module.exports = baseToString;
|
|
|
|
},{}],213:[function(require,module,exports){
|
|
var identity = require('../utility/identity');
|
|
|
|
|
|
function bindCallback(func, thisArg, argCount) {
|
|
if (typeof func != 'function') {
|
|
return identity;
|
|
}
|
|
if (typeof thisArg == 'undefined') {
|
|
return func;
|
|
}
|
|
switch (argCount) {
|
|
case 1: return function(value) {
|
|
return func.call(thisArg, value);
|
|
};
|
|
case 3: return function(value, index, collection) {
|
|
return func.call(thisArg, value, index, collection);
|
|
};
|
|
case 4: return function(accumulator, value, index, collection) {
|
|
return func.call(thisArg, accumulator, value, index, collection);
|
|
};
|
|
case 5: return function(value, other, key, object, source) {
|
|
return func.call(thisArg, value, other, key, object, source);
|
|
};
|
|
}
|
|
return function() {
|
|
return func.apply(thisArg, arguments);
|
|
};
|
|
}
|
|
|
|
module.exports = bindCallback;
|
|
|
|
},{"../utility/identity":241}],214:[function(require,module,exports){
|
|
var bindCallback = require('./bindCallback'),
|
|
isIterateeCall = require('./isIterateeCall');
|
|
|
|
|
|
function createAssigner(assigner) {
|
|
return function() {
|
|
var args = arguments,
|
|
length = args.length,
|
|
object = args[0];
|
|
|
|
if (length < 2 || object == null) {
|
|
return object;
|
|
}
|
|
var customizer = args[length - 2],
|
|
thisArg = args[length - 1],
|
|
guard = args[3];
|
|
|
|
if (length > 3 && typeof customizer == 'function') {
|
|
customizer = bindCallback(customizer, thisArg, 5);
|
|
length -= 2;
|
|
} else {
|
|
customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null;
|
|
length -= (customizer ? 1 : 0);
|
|
}
|
|
if (guard && isIterateeCall(args[1], args[2], guard)) {
|
|
customizer = length == 3 ? null : customizer;
|
|
length = 2;
|
|
}
|
|
var index = 0;
|
|
while (++index < length) {
|
|
var source = args[index];
|
|
if (source) {
|
|
assigner(object, source, customizer);
|
|
}
|
|
}
|
|
return object;
|
|
};
|
|
}
|
|
|
|
module.exports = createAssigner;
|
|
|
|
},{"./bindCallback":213,"./isIterateeCall":220}],215:[function(require,module,exports){
|
|
|
|
function equalArrays(array, other, equalFunc, customizer, isWhere, stackA, stackB) {
|
|
var index = -1,
|
|
arrLength = array.length,
|
|
othLength = other.length,
|
|
result = true;
|
|
|
|
if (arrLength != othLength && !(isWhere && othLength > arrLength)) {
|
|
return false;
|
|
}
|
|
while (result && ++index < arrLength) {
|
|
var arrValue = array[index],
|
|
othValue = other[index];
|
|
|
|
result = undefined;
|
|
if (customizer) {
|
|
result = isWhere
|
|
? customizer(othValue, arrValue, index)
|
|
: customizer(arrValue, othValue, index);
|
|
}
|
|
if (typeof result == 'undefined') {
|
|
if (isWhere) {
|
|
var othIndex = othLength;
|
|
while (othIndex--) {
|
|
othValue = other[othIndex];
|
|
result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
|
|
if (result) {
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
|
|
}
|
|
}
|
|
}
|
|
return !!result;
|
|
}
|
|
|
|
module.exports = equalArrays;
|
|
|
|
},{}],216:[function(require,module,exports){
|
|
|
|
var boolTag = '[object Boolean]',
|
|
dateTag = '[object Date]',
|
|
errorTag = '[object Error]',
|
|
numberTag = '[object Number]',
|
|
regexpTag = '[object RegExp]',
|
|
stringTag = '[object String]';
|
|
|
|
|
|
function equalByTag(object, other, tag) {
|
|
switch (tag) {
|
|
case boolTag:
|
|
case dateTag:
|
|
return +object == +other;
|
|
|
|
case errorTag:
|
|
return object.name == other.name && object.message == other.message;
|
|
|
|
case numberTag:
|
|
return (object != +object)
|
|
? other != +other
|
|
: (object == 0 ? ((1 / object) == (1 / other)) : object == +other);
|
|
|
|
case regexpTag:
|
|
case stringTag:
|
|
return object == (other + '');
|
|
}
|
|
return false;
|
|
}
|
|
|
|
module.exports = equalByTag;
|
|
|
|
},{}],217:[function(require,module,exports){
|
|
var keys = require('../object/keys');
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
|
|
function equalObjects(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
|
|
var objProps = keys(object),
|
|
objLength = objProps.length,
|
|
othProps = keys(other),
|
|
othLength = othProps.length;
|
|
|
|
if (objLength != othLength && !isWhere) {
|
|
return false;
|
|
}
|
|
var hasCtor,
|
|
index = -1;
|
|
|
|
while (++index < objLength) {
|
|
var key = objProps[index],
|
|
result = hasOwnProperty.call(other, key);
|
|
|
|
if (result) {
|
|
var objValue = object[key],
|
|
othValue = other[key];
|
|
|
|
result = undefined;
|
|
if (customizer) {
|
|
result = isWhere
|
|
? customizer(othValue, objValue, key)
|
|
: customizer(objValue, othValue, key);
|
|
}
|
|
if (typeof result == 'undefined') {
|
|
result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isWhere, stackA, stackB);
|
|
}
|
|
}
|
|
if (!result) {
|
|
return false;
|
|
}
|
|
hasCtor || (hasCtor = key == 'constructor');
|
|
}
|
|
if (!hasCtor) {
|
|
var objCtor = object.constructor,
|
|
othCtor = other.constructor;
|
|
|
|
if (objCtor != othCtor &&
|
|
('constructor' in object && 'constructor' in other) &&
|
|
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
|
|
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
module.exports = equalObjects;
|
|
|
|
},{"../object/keys":237}],218:[function(require,module,exports){
|
|
var baseSetData = require('./baseSetData'),
|
|
isNative = require('../lang/isNative'),
|
|
support = require('../support');
|
|
|
|
|
|
var reFuncName = /^\s*function[ \n\r\t]+\w/;
|
|
|
|
|
|
var reThis = /\bthis\b/;
|
|
|
|
|
|
var fnToString = Function.prototype.toString;
|
|
|
|
|
|
function isBindable(func) {
|
|
var result = !(support.funcNames ? func.name : support.funcDecomp);
|
|
|
|
if (!result) {
|
|
var source = fnToString.call(func);
|
|
if (!support.funcNames) {
|
|
result = !reFuncName.test(source);
|
|
}
|
|
if (!result) {
|
|
result = reThis.test(source) || isNative(func);
|
|
baseSetData(func, result);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
module.exports = isBindable;
|
|
|
|
},{"../lang/isNative":231,"../support":240,"./baseSetData":211}],219:[function(require,module,exports){
|
|
|
|
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
|
|
|
|
|
|
function isIndex(value, length) {
|
|
value = +value;
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
return value > -1 && value % 1 == 0 && value < length;
|
|
}
|
|
|
|
module.exports = isIndex;
|
|
|
|
},{}],220:[function(require,module,exports){
|
|
var isIndex = require('./isIndex'),
|
|
isLength = require('./isLength'),
|
|
isObject = require('../lang/isObject');
|
|
|
|
|
|
function isIterateeCall(value, index, object) {
|
|
if (!isObject(object)) {
|
|
return false;
|
|
}
|
|
var type = typeof index;
|
|
if (type == 'number') {
|
|
var length = object.length,
|
|
prereq = isLength(length) && isIndex(index, length);
|
|
} else {
|
|
prereq = type == 'string' && index in object;
|
|
}
|
|
if (prereq) {
|
|
var other = object[index];
|
|
return value === value ? (value === other) : (other !== other);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
module.exports = isIterateeCall;
|
|
|
|
},{"../lang/isObject":232,"./isIndex":219,"./isLength":221}],221:[function(require,module,exports){
|
|
|
|
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
|
|
|
|
|
|
function isLength(value) {
|
|
return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
|
|
module.exports = isLength;
|
|
|
|
},{}],222:[function(require,module,exports){
|
|
|
|
function isObjectLike(value) {
|
|
return (value && typeof value == 'object') || false;
|
|
}
|
|
|
|
module.exports = isObjectLike;
|
|
|
|
},{}],223:[function(require,module,exports){
|
|
var isObject = require('../lang/isObject');
|
|
|
|
|
|
function isStrictComparable(value) {
|
|
return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value));
|
|
}
|
|
|
|
module.exports = isStrictComparable;
|
|
|
|
},{"../lang/isObject":232}],224:[function(require,module,exports){
|
|
(function (global){
|
|
var isNative = require('../lang/isNative');
|
|
|
|
|
|
var WeakMap = isNative(WeakMap = global.WeakMap) && WeakMap;
|
|
|
|
|
|
var metaMap = WeakMap && new WeakMap;
|
|
|
|
module.exports = metaMap;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"../lang/isNative":231}],225:[function(require,module,exports){
|
|
var isArguments = require('../lang/isArguments'),
|
|
isArray = require('../lang/isArray'),
|
|
isIndex = require('./isIndex'),
|
|
isLength = require('./isLength'),
|
|
keysIn = require('../object/keysIn'),
|
|
support = require('../support');
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
|
|
function shimKeys(object) {
|
|
var props = keysIn(object),
|
|
propsLength = props.length,
|
|
length = propsLength && object.length;
|
|
|
|
var allowIndexes = length && isLength(length) &&
|
|
(isArray(object) || (support.nonEnumArgs && isArguments(object)));
|
|
|
|
var index = -1,
|
|
result = [];
|
|
|
|
while (++index < propsLength) {
|
|
var key = props[index];
|
|
if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
module.exports = shimKeys;
|
|
|
|
},{"../lang/isArguments":227,"../lang/isArray":228,"../object/keysIn":238,"../support":240,"./isIndex":219,"./isLength":221}],226:[function(require,module,exports){
|
|
var isObject = require('../lang/isObject');
|
|
|
|
|
|
function toObject(value) {
|
|
return isObject(value) ? value : Object(value);
|
|
}
|
|
|
|
module.exports = toObject;
|
|
|
|
},{"../lang/isObject":232}],227:[function(require,module,exports){
|
|
var isLength = require('../internal/isLength'),
|
|
isObjectLike = require('../internal/isObjectLike');
|
|
|
|
|
|
var argsTag = '[object Arguments]';
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
function isArguments(value) {
|
|
var length = isObjectLike(value) ? value.length : undefined;
|
|
return (isLength(length) && objToString.call(value) == argsTag) || false;
|
|
}
|
|
|
|
module.exports = isArguments;
|
|
|
|
},{"../internal/isLength":221,"../internal/isObjectLike":222}],228:[function(require,module,exports){
|
|
var isLength = require('../internal/isLength'),
|
|
isNative = require('./isNative'),
|
|
isObjectLike = require('../internal/isObjectLike');
|
|
|
|
|
|
var arrayTag = '[object Array]';
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray;
|
|
|
|
|
|
var isArray = nativeIsArray || function(value) {
|
|
return (isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag) || false;
|
|
};
|
|
|
|
module.exports = isArray;
|
|
|
|
},{"../internal/isLength":221,"../internal/isObjectLike":222,"./isNative":231}],229:[function(require,module,exports){
|
|
var isArguments = require('./isArguments'),
|
|
isArray = require('./isArray'),
|
|
isFunction = require('./isFunction'),
|
|
isLength = require('../internal/isLength'),
|
|
isObjectLike = require('../internal/isObjectLike'),
|
|
isString = require('./isString'),
|
|
keys = require('../object/keys');
|
|
|
|
|
|
function isEmpty(value) {
|
|
if (value == null) {
|
|
return true;
|
|
}
|
|
var length = value.length;
|
|
if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||
|
|
(isObjectLike(value) && isFunction(value.splice)))) {
|
|
return !length;
|
|
}
|
|
return !keys(value).length;
|
|
}
|
|
|
|
module.exports = isEmpty;
|
|
|
|
},{"../internal/isLength":221,"../internal/isObjectLike":222,"../object/keys":237,"./isArguments":227,"./isArray":228,"./isFunction":230,"./isString":233}],230:[function(require,module,exports){
|
|
(function (global){
|
|
var baseIsFunction = require('../internal/baseIsFunction'),
|
|
isNative = require('./isNative');
|
|
|
|
|
|
var funcTag = '[object Function]';
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
var Uint8Array = isNative(Uint8Array = global.Uint8Array) && Uint8Array;
|
|
|
|
|
|
var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) {
|
|
return objToString.call(value) == funcTag;
|
|
};
|
|
|
|
module.exports = isFunction;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"../internal/baseIsFunction":206,"./isNative":231}],231:[function(require,module,exports){
|
|
var escapeRegExp = require('../string/escapeRegExp'),
|
|
isObjectLike = require('../internal/isObjectLike');
|
|
|
|
|
|
var funcTag = '[object Function]';
|
|
|
|
|
|
var reHostCtor = /^\[object .+?Constructor\]$/;
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var fnToString = Function.prototype.toString;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
var reNative = RegExp('^' +
|
|
escapeRegExp(objToString)
|
|
.replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|
);
|
|
|
|
|
|
function isNative(value) {
|
|
if (value == null) {
|
|
return false;
|
|
}
|
|
if (objToString.call(value) == funcTag) {
|
|
return reNative.test(fnToString.call(value));
|
|
}
|
|
return (isObjectLike(value) && reHostCtor.test(value)) || false;
|
|
}
|
|
|
|
module.exports = isNative;
|
|
|
|
},{"../internal/isObjectLike":222,"../string/escapeRegExp":239}],232:[function(require,module,exports){
|
|
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return type == 'function' || (value && type == 'object') || false;
|
|
}
|
|
|
|
module.exports = isObject;
|
|
|
|
},{}],233:[function(require,module,exports){
|
|
var isObjectLike = require('../internal/isObjectLike');
|
|
|
|
|
|
var stringTag = '[object String]';
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
function isString(value) {
|
|
return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag) || false;
|
|
}
|
|
|
|
module.exports = isString;
|
|
|
|
},{"../internal/isObjectLike":222}],234:[function(require,module,exports){
|
|
var isLength = require('../internal/isLength'),
|
|
isObjectLike = require('../internal/isObjectLike');
|
|
|
|
|
|
var argsTag = '[object Arguments]',
|
|
arrayTag = '[object Array]',
|
|
boolTag = '[object Boolean]',
|
|
dateTag = '[object Date]',
|
|
errorTag = '[object Error]',
|
|
funcTag = '[object Function]',
|
|
mapTag = '[object Map]',
|
|
numberTag = '[object Number]',
|
|
objectTag = '[object Object]',
|
|
regexpTag = '[object RegExp]',
|
|
setTag = '[object Set]',
|
|
stringTag = '[object String]',
|
|
weakMapTag = '[object WeakMap]';
|
|
|
|
var arrayBufferTag = '[object ArrayBuffer]',
|
|
float32Tag = '[object Float32Array]',
|
|
float64Tag = '[object Float64Array]',
|
|
int8Tag = '[object Int8Array]',
|
|
int16Tag = '[object Int16Array]',
|
|
int32Tag = '[object Int32Array]',
|
|
uint8Tag = '[object Uint8Array]',
|
|
uint8ClampedTag = '[object Uint8ClampedArray]',
|
|
uint16Tag = '[object Uint16Array]',
|
|
uint32Tag = '[object Uint32Array]';
|
|
|
|
|
|
var typedArrayTags = {};
|
|
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
|
|
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
|
|
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
|
|
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
|
|
typedArrayTags[uint32Tag] = true;
|
|
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
|
|
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
|
|
typedArrayTags[dateTag] = typedArrayTags[errorTag] =
|
|
typedArrayTags[funcTag] = typedArrayTags[mapTag] =
|
|
typedArrayTags[numberTag] = typedArrayTags[objectTag] =
|
|
typedArrayTags[regexpTag] = typedArrayTags[setTag] =
|
|
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var objToString = objectProto.toString;
|
|
|
|
|
|
function isTypedArray(value) {
|
|
return (isObjectLike(value) && isLength(value.length) && typedArrayTags[objToString.call(value)]) || false;
|
|
}
|
|
|
|
module.exports = isTypedArray;
|
|
|
|
},{"../internal/isLength":221,"../internal/isObjectLike":222}],235:[function(require,module,exports){
|
|
var baseAssign = require('../internal/baseAssign'),
|
|
createAssigner = require('../internal/createAssigner');
|
|
|
|
|
|
var assign = createAssigner(baseAssign);
|
|
|
|
module.exports = assign;
|
|
|
|
},{"../internal/baseAssign":196,"../internal/createAssigner":214}],236:[function(require,module,exports){
|
|
var baseCopy = require('../internal/baseCopy'),
|
|
baseCreate = require('../internal/baseCreate'),
|
|
isIterateeCall = require('../internal/isIterateeCall'),
|
|
keys = require('./keys');
|
|
|
|
|
|
function create(prototype, properties, guard) {
|
|
var result = baseCreate(prototype);
|
|
if (guard && isIterateeCall(prototype, properties, guard)) {
|
|
properties = null;
|
|
}
|
|
return properties ? baseCopy(properties, result, keys(properties)) : result;
|
|
}
|
|
|
|
module.exports = create;
|
|
|
|
},{"../internal/baseCopy":198,"../internal/baseCreate":199,"../internal/isIterateeCall":220,"./keys":237}],237:[function(require,module,exports){
|
|
var isLength = require('../internal/isLength'),
|
|
isNative = require('../lang/isNative'),
|
|
isObject = require('../lang/isObject'),
|
|
shimKeys = require('../internal/shimKeys');
|
|
|
|
|
|
var nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys;
|
|
|
|
|
|
var keys = !nativeKeys ? shimKeys : function(object) {
|
|
if (object) {
|
|
var Ctor = object.constructor,
|
|
length = object.length;
|
|
}
|
|
if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
|
|
(typeof object != 'function' && (length && isLength(length)))) {
|
|
return shimKeys(object);
|
|
}
|
|
return isObject(object) ? nativeKeys(object) : [];
|
|
};
|
|
|
|
module.exports = keys;
|
|
|
|
},{"../internal/isLength":221,"../internal/shimKeys":225,"../lang/isNative":231,"../lang/isObject":232}],238:[function(require,module,exports){
|
|
var isArguments = require('../lang/isArguments'),
|
|
isArray = require('../lang/isArray'),
|
|
isIndex = require('../internal/isIndex'),
|
|
isLength = require('../internal/isLength'),
|
|
isObject = require('../lang/isObject'),
|
|
support = require('../support');
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
|
|
|
|
function keysIn(object) {
|
|
if (object == null) {
|
|
return [];
|
|
}
|
|
if (!isObject(object)) {
|
|
object = Object(object);
|
|
}
|
|
var length = object.length;
|
|
length = (length && isLength(length) &&
|
|
(isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0;
|
|
|
|
var Ctor = object.constructor,
|
|
index = -1,
|
|
isProto = typeof Ctor == 'function' && Ctor.prototype === object,
|
|
result = Array(length),
|
|
skipIndexes = length > 0;
|
|
|
|
while (++index < length) {
|
|
result[index] = (index + '');
|
|
}
|
|
for (var key in object) {
|
|
if (!(skipIndexes && isIndex(key, length)) &&
|
|
!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
|
|
result.push(key);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
module.exports = keysIn;
|
|
|
|
},{"../internal/isIndex":219,"../internal/isLength":221,"../lang/isArguments":227,"../lang/isArray":228,"../lang/isObject":232,"../support":240}],239:[function(require,module,exports){
|
|
var baseToString = require('../internal/baseToString');
|
|
|
|
|
|
var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g,
|
|
reHasRegExpChars = RegExp(reRegExpChars.source);
|
|
|
|
|
|
function escapeRegExp(string) {
|
|
string = baseToString(string);
|
|
return (string && reHasRegExpChars.test(string))
|
|
? string.replace(reRegExpChars, '\\$&')
|
|
: string;
|
|
}
|
|
|
|
module.exports = escapeRegExp;
|
|
|
|
},{"../internal/baseToString":212}],240:[function(require,module,exports){
|
|
(function (global){
|
|
var isNative = require('./lang/isNative');
|
|
|
|
|
|
var reThis = /\bthis\b/;
|
|
|
|
|
|
var objectProto = Object.prototype;
|
|
|
|
|
|
var document = (document = global.window) && document.document;
|
|
|
|
|
|
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
|
|
|
|
|
|
var support = {};
|
|
|
|
(function(x) {
|
|
|
|
|
|
support.funcDecomp = !isNative(global.WinRTError) && reThis.test(function() { return this; });
|
|
|
|
|
|
support.funcNames = typeof Function.name == 'string';
|
|
|
|
|
|
try {
|
|
support.dom = document.createDocumentFragment().nodeType === 11;
|
|
} catch(e) {
|
|
support.dom = false;
|
|
}
|
|
|
|
|
|
try {
|
|
support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1);
|
|
} catch(e) {
|
|
support.nonEnumArgs = true;
|
|
}
|
|
}(0, 0));
|
|
|
|
module.exports = support;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"./lang/isNative":231}],241:[function(require,module,exports){
|
|
|
|
function identity(value) {
|
|
return value;
|
|
}
|
|
|
|
module.exports = identity;
|
|
|
|
},{}],242:[function(require,module,exports){
|
|
(function (Buffer){
|
|
'use strict'
|
|
var inherits = require('inherits')
|
|
var HashBase = require('hash-base')
|
|
|
|
var ARRAY16 = new Array(16)
|
|
|
|
function MD5 () {
|
|
HashBase.call(this, 64)
|
|
|
|
this._a = 0x67452301
|
|
this._b = 0xefcdab89
|
|
this._c = 0x98badcfe
|
|
this._d = 0x10325476
|
|
}
|
|
|
|
inherits(MD5, HashBase)
|
|
|
|
MD5.prototype._update = function () {
|
|
var M = ARRAY16
|
|
for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4)
|
|
|
|
var a = this._a
|
|
var b = this._b
|
|
var c = this._c
|
|
var d = this._d
|
|
|
|
a = fnF(a, b, c, d, M[0], 0xd76aa478, 7)
|
|
d = fnF(d, a, b, c, M[1], 0xe8c7b756, 12)
|
|
c = fnF(c, d, a, b, M[2], 0x242070db, 17)
|
|
b = fnF(b, c, d, a, M[3], 0xc1bdceee, 22)
|
|
a = fnF(a, b, c, d, M[4], 0xf57c0faf, 7)
|
|
d = fnF(d, a, b, c, M[5], 0x4787c62a, 12)
|
|
c = fnF(c, d, a, b, M[6], 0xa8304613, 17)
|
|
b = fnF(b, c, d, a, M[7], 0xfd469501, 22)
|
|
a = fnF(a, b, c, d, M[8], 0x698098d8, 7)
|
|
d = fnF(d, a, b, c, M[9], 0x8b44f7af, 12)
|
|
c = fnF(c, d, a, b, M[10], 0xffff5bb1, 17)
|
|
b = fnF(b, c, d, a, M[11], 0x895cd7be, 22)
|
|
a = fnF(a, b, c, d, M[12], 0x6b901122, 7)
|
|
d = fnF(d, a, b, c, M[13], 0xfd987193, 12)
|
|
c = fnF(c, d, a, b, M[14], 0xa679438e, 17)
|
|
b = fnF(b, c, d, a, M[15], 0x49b40821, 22)
|
|
|
|
a = fnG(a, b, c, d, M[1], 0xf61e2562, 5)
|
|
d = fnG(d, a, b, c, M[6], 0xc040b340, 9)
|
|
c = fnG(c, d, a, b, M[11], 0x265e5a51, 14)
|
|
b = fnG(b, c, d, a, M[0], 0xe9b6c7aa, 20)
|
|
a = fnG(a, b, c, d, M[5], 0xd62f105d, 5)
|
|
d = fnG(d, a, b, c, M[10], 0x02441453, 9)
|
|
c = fnG(c, d, a, b, M[15], 0xd8a1e681, 14)
|
|
b = fnG(b, c, d, a, M[4], 0xe7d3fbc8, 20)
|
|
a = fnG(a, b, c, d, M[9], 0x21e1cde6, 5)
|
|
d = fnG(d, a, b, c, M[14], 0xc33707d6, 9)
|
|
c = fnG(c, d, a, b, M[3], 0xf4d50d87, 14)
|
|
b = fnG(b, c, d, a, M[8], 0x455a14ed, 20)
|
|
a = fnG(a, b, c, d, M[13], 0xa9e3e905, 5)
|
|
d = fnG(d, a, b, c, M[2], 0xfcefa3f8, 9)
|
|
c = fnG(c, d, a, b, M[7], 0x676f02d9, 14)
|
|
b = fnG(b, c, d, a, M[12], 0x8d2a4c8a, 20)
|
|
|
|
a = fnH(a, b, c, d, M[5], 0xfffa3942, 4)
|
|
d = fnH(d, a, b, c, M[8], 0x8771f681, 11)
|
|
c = fnH(c, d, a, b, M[11], 0x6d9d6122, 16)
|
|
b = fnH(b, c, d, a, M[14], 0xfde5380c, 23)
|
|
a = fnH(a, b, c, d, M[1], 0xa4beea44, 4)
|
|
d = fnH(d, a, b, c, M[4], 0x4bdecfa9, 11)
|
|
c = fnH(c, d, a, b, M[7], 0xf6bb4b60, 16)
|
|
b = fnH(b, c, d, a, M[10], 0xbebfbc70, 23)
|
|
a = fnH(a, b, c, d, M[13], 0x289b7ec6, 4)
|
|
d = fnH(d, a, b, c, M[0], 0xeaa127fa, 11)
|
|
c = fnH(c, d, a, b, M[3], 0xd4ef3085, 16)
|
|
b = fnH(b, c, d, a, M[6], 0x04881d05, 23)
|
|
a = fnH(a, b, c, d, M[9], 0xd9d4d039, 4)
|
|
d = fnH(d, a, b, c, M[12], 0xe6db99e5, 11)
|
|
c = fnH(c, d, a, b, M[15], 0x1fa27cf8, 16)
|
|
b = fnH(b, c, d, a, M[2], 0xc4ac5665, 23)
|
|
|
|
a = fnI(a, b, c, d, M[0], 0xf4292244, 6)
|
|
d = fnI(d, a, b, c, M[7], 0x432aff97, 10)
|
|
c = fnI(c, d, a, b, M[14], 0xab9423a7, 15)
|
|
b = fnI(b, c, d, a, M[5], 0xfc93a039, 21)
|
|
a = fnI(a, b, c, d, M[12], 0x655b59c3, 6)
|
|
d = fnI(d, a, b, c, M[3], 0x8f0ccc92, 10)
|
|
c = fnI(c, d, a, b, M[10], 0xffeff47d, 15)
|
|
b = fnI(b, c, d, a, M[1], 0x85845dd1, 21)
|
|
a = fnI(a, b, c, d, M[8], 0x6fa87e4f, 6)
|
|
d = fnI(d, a, b, c, M[15], 0xfe2ce6e0, 10)
|
|
c = fnI(c, d, a, b, M[6], 0xa3014314, 15)
|
|
b = fnI(b, c, d, a, M[13], 0x4e0811a1, 21)
|
|
a = fnI(a, b, c, d, M[4], 0xf7537e82, 6)
|
|
d = fnI(d, a, b, c, M[11], 0xbd3af235, 10)
|
|
c = fnI(c, d, a, b, M[2], 0x2ad7d2bb, 15)
|
|
b = fnI(b, c, d, a, M[9], 0xeb86d391, 21)
|
|
|
|
this._a = (this._a + a) | 0
|
|
this._b = (this._b + b) | 0
|
|
this._c = (this._c + c) | 0
|
|
this._d = (this._d + d) | 0
|
|
}
|
|
|
|
MD5.prototype._digest = function () {
|
|
this._block[this._blockOffset++] = 0x80
|
|
if (this._blockOffset > 56) {
|
|
this._block.fill(0, this._blockOffset, 64)
|
|
this._update()
|
|
this._blockOffset = 0
|
|
}
|
|
|
|
this._block.fill(0, this._blockOffset, 56)
|
|
this._block.writeUInt32LE(this._length[0], 56)
|
|
this._block.writeUInt32LE(this._length[1], 60)
|
|
this._update()
|
|
|
|
var buffer = new Buffer(16)
|
|
buffer.writeInt32LE(this._a, 0)
|
|
buffer.writeInt32LE(this._b, 4)
|
|
buffer.writeInt32LE(this._c, 8)
|
|
buffer.writeInt32LE(this._d, 12)
|
|
return buffer
|
|
}
|
|
|
|
function rotl (x, n) {
|
|
return (x << n) | (x >>> (32 - n))
|
|
}
|
|
|
|
function fnF (a, b, c, d, m, k, s) {
|
|
return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + b) | 0
|
|
}
|
|
|
|
function fnG (a, b, c, d, m, k, s) {
|
|
return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + b) | 0
|
|
}
|
|
|
|
function fnH (a, b, c, d, m, k, s) {
|
|
return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + b) | 0
|
|
}
|
|
|
|
function fnI (a, b, c, d, m, k, s) {
|
|
return (rotl((a + ((c ^ (b | (~d)))) + m + k) | 0, s) + b) | 0
|
|
}
|
|
|
|
module.exports = MD5
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130,"hash-base":243,"inherits":190}],243:[function(require,module,exports){
|
|
'use strict'
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var Transform = require('stream').Transform
|
|
var inherits = require('inherits')
|
|
|
|
function throwIfNotStringOrBuffer (val, prefix) {
|
|
if (!Buffer.isBuffer(val) && typeof val !== 'string') {
|
|
throw new TypeError(prefix + ' must be a string or a buffer')
|
|
}
|
|
}
|
|
|
|
function HashBase (blockSize) {
|
|
Transform.call(this)
|
|
|
|
this._block = Buffer.allocUnsafe(blockSize)
|
|
this._blockSize = blockSize
|
|
this._blockOffset = 0
|
|
this._length = [0, 0, 0, 0]
|
|
|
|
this._finalized = false
|
|
}
|
|
|
|
inherits(HashBase, Transform)
|
|
|
|
HashBase.prototype._transform = function (chunk, encoding, callback) {
|
|
var error = null
|
|
try {
|
|
this.update(chunk, encoding)
|
|
} catch (err) {
|
|
error = err
|
|
}
|
|
|
|
callback(error)
|
|
}
|
|
|
|
HashBase.prototype._flush = function (callback) {
|
|
var error = null
|
|
try {
|
|
this.push(this.digest())
|
|
} catch (err) {
|
|
error = err
|
|
}
|
|
|
|
callback(error)
|
|
}
|
|
|
|
HashBase.prototype.update = function (data, encoding) {
|
|
throwIfNotStringOrBuffer(data, 'Data')
|
|
if (this._finalized) throw new Error('Digest already called')
|
|
if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding)
|
|
|
|
var block = this._block
|
|
var offset = 0
|
|
while (this._blockOffset + data.length - offset >= this._blockSize) {
|
|
for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++]
|
|
this._update()
|
|
this._blockOffset = 0
|
|
}
|
|
while (offset < data.length) block[this._blockOffset++] = data[offset++]
|
|
|
|
for (var j = 0, carry = data.length * 8; carry > 0; ++j) {
|
|
this._length[j] += carry
|
|
carry = (this._length[j] / 0x0100000000) | 0
|
|
if (carry > 0) this._length[j] -= 0x0100000000 * carry
|
|
}
|
|
|
|
return this
|
|
}
|
|
|
|
HashBase.prototype._update = function () {
|
|
throw new Error('_update is not implemented')
|
|
}
|
|
|
|
HashBase.prototype.digest = function (encoding) {
|
|
if (this._finalized) throw new Error('Digest already called')
|
|
this._finalized = true
|
|
|
|
var digest = this._digest()
|
|
if (encoding !== undefined) digest = digest.toString(encoding)
|
|
|
|
this._block.fill(0)
|
|
this._blockOffset = 0
|
|
for (var i = 0; i < 4; ++i) this._length[i] = 0
|
|
|
|
return digest
|
|
}
|
|
|
|
HashBase.prototype._digest = function () {
|
|
throw new Error('_digest is not implemented')
|
|
}
|
|
|
|
module.exports = HashBase
|
|
|
|
},{"inherits":190,"safe-buffer":305,"stream":314}],244:[function(require,module,exports){
|
|
var bn = require('bn.js');
|
|
var brorand = require('brorand');
|
|
|
|
function MillerRabin(rand) {
|
|
this.rand = rand || new brorand.Rand();
|
|
}
|
|
module.exports = MillerRabin;
|
|
|
|
MillerRabin.create = function create(rand) {
|
|
return new MillerRabin(rand);
|
|
};
|
|
|
|
MillerRabin.prototype._randbelow = function _randbelow(n) {
|
|
var len = n.bitLength();
|
|
var min_bytes = Math.ceil(len / 8);
|
|
|
|
do
|
|
var a = new bn(this.rand.generate(min_bytes));
|
|
while (a.cmp(n) >= 0);
|
|
|
|
return a;
|
|
};
|
|
|
|
MillerRabin.prototype._randrange = function _randrange(start, stop) {
|
|
var size = stop.sub(start);
|
|
return start.add(this._randbelow(size));
|
|
};
|
|
|
|
MillerRabin.prototype.test = function test(n, k, cb) {
|
|
var len = n.bitLength();
|
|
var red = bn.mont(n);
|
|
var rone = new bn(1).toRed(red);
|
|
|
|
if (!k)
|
|
k = Math.max(1, (len / 48) | 0);
|
|
|
|
var n1 = n.subn(1);
|
|
for (var s = 0; !n1.testn(s); s++) {}
|
|
var d = n.shrn(s);
|
|
|
|
var rn1 = n1.toRed(red);
|
|
|
|
var prime = true;
|
|
for (; k > 0; k--) {
|
|
var a = this._randrange(new bn(2), n1);
|
|
if (cb)
|
|
cb(a);
|
|
|
|
var x = a.toRed(red).redPow(d);
|
|
if (x.cmp(rone) === 0 || x.cmp(rn1) === 0)
|
|
continue;
|
|
|
|
for (var i = 1; i < s; i++) {
|
|
x = x.redSqr();
|
|
|
|
if (x.cmp(rone) === 0)
|
|
return false;
|
|
if (x.cmp(rn1) === 0)
|
|
break;
|
|
}
|
|
|
|
if (i === s)
|
|
return false;
|
|
}
|
|
|
|
return prime;
|
|
};
|
|
|
|
MillerRabin.prototype.getDivisor = function getDivisor(n, k) {
|
|
var len = n.bitLength();
|
|
var red = bn.mont(n);
|
|
var rone = new bn(1).toRed(red);
|
|
|
|
if (!k)
|
|
k = Math.max(1, (len / 48) | 0);
|
|
|
|
var n1 = n.subn(1);
|
|
for (var s = 0; !n1.testn(s); s++) {}
|
|
var d = n.shrn(s);
|
|
|
|
var rn1 = n1.toRed(red);
|
|
|
|
for (; k > 0; k--) {
|
|
var a = this._randrange(new bn(2), n1);
|
|
|
|
var g = n.gcd(a);
|
|
if (g.cmpn(1) !== 0)
|
|
return g;
|
|
|
|
var x = a.toRed(red).redPow(d);
|
|
if (x.cmp(rone) === 0 || x.cmp(rn1) === 0)
|
|
continue;
|
|
|
|
for (var i = 1; i < s; i++) {
|
|
x = x.redSqr();
|
|
|
|
if (x.cmp(rone) === 0)
|
|
return x.fromRed().subn(1).gcd(n);
|
|
if (x.cmp(rn1) === 0)
|
|
break;
|
|
}
|
|
|
|
if (i === s) {
|
|
x = x.redSqr();
|
|
return x.fromRed().subn(1).gcd(n);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
},{"bn.js":98,"brorand":99}],245:[function(require,module,exports){
|
|
module.exports = assert;
|
|
|
|
function assert(val, msg) {
|
|
if (!val)
|
|
throw new Error(msg || 'Assertion failed');
|
|
}
|
|
|
|
assert.equal = function assertEqual(l, r, msg) {
|
|
if (l != r)
|
|
throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r));
|
|
};
|
|
|
|
},{}],246:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = exports;
|
|
|
|
function toArray(msg, enc) {
|
|
if (Array.isArray(msg))
|
|
return msg.slice();
|
|
if (!msg)
|
|
return [];
|
|
var res = [];
|
|
if (typeof msg !== 'string') {
|
|
for (var i = 0; i < msg.length; i++)
|
|
res[i] = msg[i] | 0;
|
|
return res;
|
|
}
|
|
if (enc === 'hex') {
|
|
msg = msg.replace(/[^a-z0-9]+/ig, '');
|
|
if (msg.length % 2 !== 0)
|
|
msg = '0' + msg;
|
|
for (var i = 0; i < msg.length; i += 2)
|
|
res.push(parseInt(msg[i] + msg[i + 1], 16));
|
|
} else {
|
|
for (var i = 0; i < msg.length; i++) {
|
|
var c = msg.charCodeAt(i);
|
|
var hi = c >> 8;
|
|
var lo = c & 0xff;
|
|
if (hi)
|
|
res.push(hi, lo);
|
|
else
|
|
res.push(lo);
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
utils.toArray = toArray;
|
|
|
|
function zero2(word) {
|
|
if (word.length === 1)
|
|
return '0' + word;
|
|
else
|
|
return word;
|
|
}
|
|
utils.zero2 = zero2;
|
|
|
|
function toHex(msg) {
|
|
var res = '';
|
|
for (var i = 0; i < msg.length; i++)
|
|
res += zero2(msg[i].toString(16));
|
|
return res;
|
|
}
|
|
utils.toHex = toHex;
|
|
|
|
utils.encode = function encode(arr, enc) {
|
|
if (enc === 'hex')
|
|
return toHex(arr);
|
|
else
|
|
return arr;
|
|
};
|
|
|
|
},{}],247:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
var constants = require('constants');
|
|
var rsa = require('./libs/rsa.js');
|
|
var crypt = require('crypto');
|
|
var ber = require('asn1').Ber;
|
|
var _ = require('./utils')._;
|
|
var utils = require('./utils');
|
|
var schemes = require('./schemes/schemes.js');
|
|
var formats = require('./formats/formats.js');
|
|
|
|
if (typeof constants.RSA_NO_PADDING == "undefined") {
|
|
constants.RSA_NO_PADDING = 3;
|
|
}
|
|
|
|
module.exports = (function () {
|
|
var SUPPORTED_HASH_ALGORITHMS = {
|
|
node10: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'],
|
|
node: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'],
|
|
iojs: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'],
|
|
browser: ['md5', 'ripemd160', 'sha1', 'sha256', 'sha512']
|
|
};
|
|
|
|
var DEFAULT_ENCRYPTION_SCHEME = 'pkcs1_oaep';
|
|
var DEFAULT_SIGNING_SCHEME = 'pkcs1';
|
|
|
|
var DEFAULT_EXPORT_FORMAT = 'private';
|
|
var EXPORT_FORMAT_ALIASES = {
|
|
'private': 'pkcs1-private-pem',
|
|
'private-der': 'pkcs1-private-der',
|
|
'public': 'pkcs8-public-pem',
|
|
'public-der': 'pkcs8-public-der',
|
|
};
|
|
|
|
|
|
function NodeRSA(key, format, options) {
|
|
if (!(this instanceof NodeRSA)) {
|
|
return new NodeRSA(key, format, options);
|
|
}
|
|
|
|
if (_.isObject(format)) {
|
|
options = format;
|
|
format = undefined;
|
|
}
|
|
|
|
this.$options = {
|
|
signingScheme: DEFAULT_SIGNING_SCHEME,
|
|
signingSchemeOptions: {
|
|
hash: 'sha256',
|
|
saltLength: null
|
|
},
|
|
encryptionScheme: DEFAULT_ENCRYPTION_SCHEME,
|
|
encryptionSchemeOptions: {
|
|
hash: 'sha1',
|
|
label: null
|
|
},
|
|
environment: utils.detectEnvironment(),
|
|
rsaUtils: this
|
|
};
|
|
this.keyPair = new rsa.Key();
|
|
this.$cache = {};
|
|
|
|
if (Buffer.isBuffer(key) || _.isString(key)) {
|
|
this.importKey(key, format);
|
|
} else if (_.isObject(key)) {
|
|
this.generateKeyPair(key.b, key.e);
|
|
}
|
|
|
|
this.setOptions(options);
|
|
}
|
|
|
|
|
|
NodeRSA.prototype.setOptions = function (options) {
|
|
options = options || {};
|
|
if (options.environment) {
|
|
this.$options.environment = options.environment;
|
|
}
|
|
|
|
if (options.signingScheme) {
|
|
if (_.isString(options.signingScheme)) {
|
|
var signingScheme = options.signingScheme.toLowerCase().split('-');
|
|
if (signingScheme.length == 1) {
|
|
if (SUPPORTED_HASH_ALGORITHMS.node.indexOf(signingScheme[0]) > -1) {
|
|
this.$options.signingSchemeOptions = {
|
|
hash: signingScheme[0]
|
|
};
|
|
this.$options.signingScheme = DEFAULT_SIGNING_SCHEME;
|
|
} else {
|
|
this.$options.signingScheme = signingScheme[0];
|
|
this.$options.signingSchemeOptions = {
|
|
hash: null
|
|
};
|
|
}
|
|
} else {
|
|
this.$options.signingSchemeOptions = {
|
|
hash: signingScheme[1]
|
|
};
|
|
this.$options.signingScheme = signingScheme[0];
|
|
}
|
|
} else if (_.isObject(options.signingScheme)) {
|
|
this.$options.signingScheme = options.signingScheme.scheme || DEFAULT_SIGNING_SCHEME;
|
|
this.$options.signingSchemeOptions = _.omit(options.signingScheme, 'scheme');
|
|
}
|
|
|
|
if (!schemes.isSignature(this.$options.signingScheme)) {
|
|
throw Error('Unsupported signing scheme');
|
|
}
|
|
|
|
if (this.$options.signingSchemeOptions.hash &&
|
|
SUPPORTED_HASH_ALGORITHMS[this.$options.environment].indexOf(this.$options.signingSchemeOptions.hash) === -1) {
|
|
throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment');
|
|
}
|
|
}
|
|
|
|
if (options.encryptionScheme) {
|
|
if (_.isString(options.encryptionScheme)) {
|
|
this.$options.encryptionScheme = options.encryptionScheme.toLowerCase();
|
|
this.$options.encryptionSchemeOptions = {};
|
|
} else if (_.isObject(options.encryptionScheme)) {
|
|
this.$options.encryptionScheme = options.encryptionScheme.scheme || DEFAULT_ENCRYPTION_SCHEME;
|
|
this.$options.encryptionSchemeOptions = _.omit(options.encryptionScheme, 'scheme');
|
|
}
|
|
|
|
if (!schemes.isEncryption(this.$options.encryptionScheme)) {
|
|
throw Error('Unsupported encryption scheme');
|
|
}
|
|
|
|
if (this.$options.encryptionSchemeOptions.hash &&
|
|
SUPPORTED_HASH_ALGORITHMS[this.$options.environment].indexOf(this.$options.encryptionSchemeOptions.hash) === -1) {
|
|
throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment');
|
|
}
|
|
}
|
|
|
|
this.keyPair.setOptions(this.$options);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.generateKeyPair = function (bits, exp) {
|
|
bits = bits || 2048;
|
|
exp = exp || 65537;
|
|
|
|
if (bits % 8 !== 0) {
|
|
throw Error('Key size must be a multiple of 8.');
|
|
}
|
|
|
|
this.keyPair.generate(bits, exp.toString(16));
|
|
this.$cache = {};
|
|
return this;
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.importKey = function (keyData, format) {
|
|
if (!keyData) {
|
|
throw Error("Empty key given");
|
|
}
|
|
|
|
if (format) {
|
|
format = EXPORT_FORMAT_ALIASES[format] || format;
|
|
}
|
|
|
|
if (!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) {
|
|
throw Error("Key format must be specified");
|
|
}
|
|
|
|
this.$cache = {};
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.exportKey = function (format) {
|
|
format = format || DEFAULT_EXPORT_FORMAT;
|
|
format = EXPORT_FORMAT_ALIASES[format] || format;
|
|
|
|
if (!this.$cache[format]) {
|
|
this.$cache[format] = formats.detectAndExport(this.keyPair, format);
|
|
}
|
|
|
|
return this.$cache[format];
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.isPrivate = function () {
|
|
return this.keyPair.isPrivate();
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.isPublic = function (strict) {
|
|
return this.keyPair.isPublic(strict);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.isEmpty = function (strict) {
|
|
return !(this.keyPair.n || this.keyPair.e || this.keyPair.d);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.encrypt = function (buffer, encoding, source_encoding) {
|
|
return this.$$encryptKey(false, buffer, encoding, source_encoding);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.decrypt = function (buffer, encoding) {
|
|
return this.$$decryptKey(false, buffer, encoding);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.encryptPrivate = function (buffer, encoding, source_encoding) {
|
|
return this.$$encryptKey(true, buffer, encoding, source_encoding);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.decryptPublic = function (buffer, encoding) {
|
|
return this.$$decryptKey(true, buffer, encoding);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.$$encryptKey = function (usePrivate, buffer, encoding, source_encoding) {
|
|
try {
|
|
var res = this.keyPair.encrypt(this.$getDataForEncrypt(buffer, source_encoding), usePrivate);
|
|
|
|
if (encoding == 'buffer' || !encoding) {
|
|
return res;
|
|
} else {
|
|
return res.toString(encoding);
|
|
}
|
|
} catch (e) {
|
|
throw Error('Error during encryption. Original error: ' + e);
|
|
}
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.$$decryptKey = function (usePublic, buffer, encoding) {
|
|
try {
|
|
buffer = _.isString(buffer) ? new Buffer(buffer, 'base64') : buffer;
|
|
var res = this.keyPair.decrypt(buffer, usePublic);
|
|
|
|
if (res === null) {
|
|
throw Error('Key decrypt method returns null.');
|
|
}
|
|
|
|
return this.$getDecryptedData(res, encoding);
|
|
} catch (e) {
|
|
throw Error('Error during decryption (probably incorrect key). Original error: ' + e);
|
|
}
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.sign = function (buffer, encoding, source_encoding) {
|
|
if (!this.isPrivate()) {
|
|
throw Error("This is not private key");
|
|
}
|
|
|
|
var res = this.keyPair.sign(this.$getDataForEncrypt(buffer, source_encoding));
|
|
|
|
if (encoding && encoding != 'buffer') {
|
|
res = res.toString(encoding);
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.verify = function (buffer, signature, source_encoding, signature_encoding) {
|
|
if (!this.isPublic()) {
|
|
throw Error("This is not public key");
|
|
}
|
|
signature_encoding = (!signature_encoding || signature_encoding == 'buffer' ? null : signature_encoding);
|
|
return this.keyPair.verify(this.$getDataForEncrypt(buffer, source_encoding), signature, signature_encoding);
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.getKeySize = function () {
|
|
return this.keyPair.keySize;
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.getMaxMessageSize = function () {
|
|
return this.keyPair.maxMessageLength;
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.$getDataForEncrypt = function (buffer, encoding) {
|
|
if (_.isString(buffer) || _.isNumber(buffer)) {
|
|
return new Buffer('' + buffer, encoding || 'utf8');
|
|
} else if (Buffer.isBuffer(buffer)) {
|
|
return buffer;
|
|
} else if (_.isObject(buffer)) {
|
|
return new Buffer(JSON.stringify(buffer));
|
|
} else {
|
|
throw Error("Unexpected data type");
|
|
}
|
|
};
|
|
|
|
|
|
NodeRSA.prototype.$getDecryptedData = function (buffer, encoding) {
|
|
encoding = encoding || 'buffer';
|
|
|
|
if (encoding == 'buffer') {
|
|
return buffer;
|
|
} else if (encoding == 'json') {
|
|
return JSON.parse(buffer.toString());
|
|
} else {
|
|
return buffer.toString(encoding);
|
|
}
|
|
};
|
|
|
|
return NodeRSA;
|
|
})();
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./formats/formats.js":253,"./libs/rsa.js":257,"./schemes/schemes.js":261,"./utils":262,"asn1":95,"buffer":130,"constants":132,"crypto":128}],248:[function(require,module,exports){
|
|
var crypt = require('crypto');
|
|
|
|
module.exports = {
|
|
getEngine: function (keyPair, options) {
|
|
var engine = require('./js.js');
|
|
if (options.environment === 'node') {
|
|
if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') {
|
|
if (typeof crypt.privateEncrypt === 'function' && typeof crypt.publicDecrypt === 'function') {
|
|
engine = require('./io.js');
|
|
} else {
|
|
engine = require('./node12.js');
|
|
}
|
|
}
|
|
}
|
|
return engine(keyPair, options);
|
|
}
|
|
};
|
|
},{"./io.js":249,"./js.js":250,"./node12.js":251,"crypto":128}],249:[function(require,module,exports){
|
|
var crypto = require('crypto');
|
|
var constants = require('constants');
|
|
var schemes = require('../schemes/schemes.js');
|
|
|
|
module.exports = function (keyPair, options) {
|
|
var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options);
|
|
|
|
return {
|
|
encrypt: function (buffer, usePrivate) {
|
|
if (usePrivate) {
|
|
var padding = constants.RSA_PKCS1_PADDING;
|
|
if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
|
|
padding = options.encryptionSchemeOptions.padding;
|
|
}
|
|
return crypto.privateEncrypt({
|
|
key: options.rsaUtils.exportKey('private'),
|
|
padding: padding
|
|
}, buffer);
|
|
} else {
|
|
var padding = constants.RSA_PKCS1_OAEP_PADDING;
|
|
if (options.encryptionScheme === 'pkcs1') {
|
|
padding = constants.RSA_PKCS1_PADDING;
|
|
}
|
|
if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
|
|
padding = options.encryptionSchemeOptions.padding;
|
|
}
|
|
|
|
var data = buffer;
|
|
if (padding === constants.RSA_NO_PADDING) {
|
|
data = pkcs1Scheme.pkcs0pad(buffer);
|
|
}
|
|
|
|
return crypto.publicEncrypt({
|
|
key: options.rsaUtils.exportKey('public'),
|
|
padding: padding
|
|
}, data);
|
|
}
|
|
},
|
|
|
|
decrypt: function (buffer, usePublic) {
|
|
if (usePublic) {
|
|
var padding = constants.RSA_PKCS1_PADDING;
|
|
if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
|
|
padding = options.encryptionSchemeOptions.padding;
|
|
}
|
|
return crypto.publicDecrypt({
|
|
key: options.rsaUtils.exportKey('public'),
|
|
padding: padding
|
|
}, buffer);
|
|
} else {
|
|
var padding = constants.RSA_PKCS1_OAEP_PADDING;
|
|
if (options.encryptionScheme === 'pkcs1') {
|
|
padding = constants.RSA_PKCS1_PADDING;
|
|
}
|
|
if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
|
|
padding = options.encryptionSchemeOptions.padding;
|
|
}
|
|
var res = crypto.privateDecrypt({
|
|
key: options.rsaUtils.exportKey('private'),
|
|
padding: padding
|
|
}, buffer);
|
|
|
|
if (padding === constants.RSA_NO_PADDING) {
|
|
return pkcs1Scheme.pkcs0unpad(res);
|
|
}
|
|
return res;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
},{"../schemes/schemes.js":261,"constants":132,"crypto":128}],250:[function(require,module,exports){
|
|
var BigInteger = require('../libs/jsbn.js');
|
|
var schemes = require('../schemes/schemes.js');
|
|
|
|
module.exports = function (keyPair, options) {
|
|
var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options);
|
|
|
|
return {
|
|
encrypt: function (buffer, usePrivate) {
|
|
var m, c;
|
|
if (usePrivate) {
|
|
|
|
m = new BigInteger(pkcs1Scheme.encPad(buffer, {type: 1}));
|
|
c = keyPair.$doPrivate(m);
|
|
} else {
|
|
m = new BigInteger(keyPair.encryptionScheme.encPad(buffer));
|
|
c = keyPair.$doPublic(m);
|
|
}
|
|
return c.toBuffer(keyPair.encryptedDataLength);
|
|
},
|
|
|
|
decrypt: function (buffer, usePublic) {
|
|
var m, c = new BigInteger(buffer);
|
|
|
|
if (usePublic) {
|
|
m = keyPair.$doPublic(c);
|
|
|
|
return pkcs1Scheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength), {type: 1});
|
|
} else {
|
|
m = keyPair.$doPrivate(c);
|
|
return keyPair.encryptionScheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength));
|
|
}
|
|
}
|
|
};
|
|
};
|
|
},{"../libs/jsbn.js":256,"../schemes/schemes.js":261}],251:[function(require,module,exports){
|
|
var crypto = require('crypto');
|
|
var constants = require('constants');
|
|
var schemes = require('../schemes/schemes.js');
|
|
|
|
module.exports = function (keyPair, options) {
|
|
var jsEngine = require('./js.js')(keyPair, options);
|
|
var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options);
|
|
|
|
return {
|
|
encrypt: function (buffer, usePrivate) {
|
|
if (usePrivate) {
|
|
return jsEngine.encrypt(buffer, usePrivate);
|
|
}
|
|
var padding = constants.RSA_PKCS1_OAEP_PADDING;
|
|
if (options.encryptionScheme === 'pkcs1') {
|
|
padding = constants.RSA_PKCS1_PADDING;
|
|
}
|
|
if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
|
|
padding = options.encryptionSchemeOptions.padding;
|
|
}
|
|
|
|
var data = buffer;
|
|
if (padding === constants.RSA_NO_PADDING) {
|
|
data = pkcs1Scheme.pkcs0pad(buffer);
|
|
}
|
|
|
|
return crypto.publicEncrypt({
|
|
key: options.rsaUtils.exportKey('public'),
|
|
padding: padding
|
|
}, data);
|
|
},
|
|
|
|
decrypt: function (buffer, usePublic) {
|
|
if (usePublic) {
|
|
return jsEngine.decrypt(buffer, usePublic);
|
|
}
|
|
var padding = constants.RSA_PKCS1_OAEP_PADDING;
|
|
if (options.encryptionScheme === 'pkcs1') {
|
|
padding = constants.RSA_PKCS1_PADDING;
|
|
}
|
|
if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) {
|
|
padding = options.encryptionSchemeOptions.padding;
|
|
}
|
|
|
|
var res = crypto.privateDecrypt({
|
|
key: options.rsaUtils.exportKey('private'),
|
|
padding: padding
|
|
}, buffer);
|
|
|
|
if (padding === constants.RSA_NO_PADDING) {
|
|
return pkcs1Scheme.pkcs0unpad(res);
|
|
}
|
|
return res;
|
|
}
|
|
};
|
|
};
|
|
},{"../schemes/schemes.js":261,"./js.js":250,"constants":132,"crypto":128}],252:[function(require,module,exports){
|
|
var _ = require('../utils')._;
|
|
var utils = require('../utils');
|
|
|
|
module.exports = {
|
|
privateExport: function (key, options) {
|
|
return {
|
|
n: key.n.toBuffer(),
|
|
e: key.e,
|
|
d: key.d.toBuffer(),
|
|
p: key.p.toBuffer(),
|
|
q: key.q.toBuffer(),
|
|
dmp1: key.dmp1.toBuffer(),
|
|
dmq1: key.dmq1.toBuffer(),
|
|
coeff: key.coeff.toBuffer()
|
|
};
|
|
},
|
|
|
|
privateImport: function (key, data, options) {
|
|
if (data.n && data.e && data.d && data.p && data.q && data.dmp1 && data.dmq1 && data.coeff) {
|
|
key.setPrivate(
|
|
data.n,
|
|
data.e,
|
|
data.d,
|
|
data.p,
|
|
data.q,
|
|
data.dmp1,
|
|
data.dmq1,
|
|
data.coeff
|
|
);
|
|
} else {
|
|
throw Error("Invalid key data");
|
|
}
|
|
},
|
|
|
|
publicExport: function (key, options) {
|
|
return {
|
|
n: key.n.toBuffer(),
|
|
e: key.e
|
|
};
|
|
},
|
|
|
|
publicImport: function (key, data, options) {
|
|
if (data.n && data.e) {
|
|
key.setPublic(
|
|
data.n,
|
|
data.e
|
|
);
|
|
} else {
|
|
throw Error("Invalid key data");
|
|
}
|
|
},
|
|
|
|
|
|
autoImport: function (key, data) {
|
|
if (data.n && data.e) {
|
|
if (data.d && data.p && data.q && data.dmp1 && data.dmq1 && data.coeff) {
|
|
module.exports.privateImport(key, data);
|
|
return true;
|
|
} else {
|
|
module.exports.publicImport(key, data);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
};
|
|
|
|
},{"../utils":262}],253:[function(require,module,exports){
|
|
var _ = require('../utils')._;
|
|
|
|
function formatParse(format) {
|
|
format = format.split('-');
|
|
var keyType = 'private';
|
|
var keyOpt = {type: 'default'};
|
|
|
|
for (var i = 1; i < format.length; i++) {
|
|
if (format[i]) {
|
|
switch (format[i]) {
|
|
case 'public':
|
|
keyType = format[i];
|
|
break;
|
|
case 'private':
|
|
keyType = format[i];
|
|
break;
|
|
case 'pem':
|
|
keyOpt.type = format[i];
|
|
break;
|
|
case 'der':
|
|
keyOpt.type = format[i];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {scheme: format[0], keyType: keyType, keyOpt: keyOpt};
|
|
}
|
|
|
|
module.exports = {
|
|
pkcs1: require('./pkcs1'),
|
|
pkcs8: require('./pkcs8'),
|
|
components: require('./components'),
|
|
|
|
isPrivateExport: function (format) {
|
|
return module.exports[format] && typeof module.exports[format].privateExport === 'function';
|
|
},
|
|
|
|
isPrivateImport: function (format) {
|
|
return module.exports[format] && typeof module.exports[format].privateImport === 'function';
|
|
},
|
|
|
|
isPublicExport: function (format) {
|
|
return module.exports[format] && typeof module.exports[format].publicExport === 'function';
|
|
},
|
|
|
|
isPublicImport: function (format) {
|
|
return module.exports[format] && typeof module.exports[format].publicImport === 'function';
|
|
},
|
|
|
|
detectAndImport: function (key, data, format) {
|
|
if (format === undefined) {
|
|
for (var scheme in module.exports) {
|
|
if (typeof module.exports[scheme].autoImport === 'function' && module.exports[scheme].autoImport(key, data)) {
|
|
return true;
|
|
}
|
|
}
|
|
} else if (format) {
|
|
var fmt = formatParse(format);
|
|
|
|
if (module.exports[fmt.scheme]) {
|
|
if (fmt.keyType === 'private') {
|
|
module.exports[fmt.scheme].privateImport(key, data, fmt.keyOpt);
|
|
} else {
|
|
module.exports[fmt.scheme].publicImport(key, data, fmt.keyOpt);
|
|
}
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
detectAndExport: function (key, format) {
|
|
if (format) {
|
|
var fmt = formatParse(format);
|
|
|
|
if (module.exports[fmt.scheme]) {
|
|
if (fmt.keyType === 'private') {
|
|
if (!key.isPrivate()) {
|
|
throw Error("This is not private key");
|
|
}
|
|
return module.exports[fmt.scheme].privateExport(key, fmt.keyOpt);
|
|
} else {
|
|
if (!key.isPublic()) {
|
|
throw Error("This is not public key");
|
|
}
|
|
return module.exports[fmt.scheme].publicExport(key, fmt.keyOpt);
|
|
}
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
}
|
|
}
|
|
};
|
|
},{"../utils":262,"./components":252,"./pkcs1":254,"./pkcs8":255}],254:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var ber = require('asn1').Ber;
|
|
var _ = require('../utils')._;
|
|
var utils = require('../utils');
|
|
|
|
module.exports = {
|
|
privateExport: function (key, options) {
|
|
options = options || {};
|
|
|
|
var n = key.n.toBuffer();
|
|
var d = key.d.toBuffer();
|
|
var p = key.p.toBuffer();
|
|
var q = key.q.toBuffer();
|
|
var dmp1 = key.dmp1.toBuffer();
|
|
var dmq1 = key.dmq1.toBuffer();
|
|
var coeff = key.coeff.toBuffer();
|
|
|
|
var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic
|
|
var writer = new ber.Writer({size: length});
|
|
|
|
writer.startSequence();
|
|
writer.writeInt(0);
|
|
writer.writeBuffer(n, 2);
|
|
writer.writeInt(key.e);
|
|
writer.writeBuffer(d, 2);
|
|
writer.writeBuffer(p, 2);
|
|
writer.writeBuffer(q, 2);
|
|
writer.writeBuffer(dmp1, 2);
|
|
writer.writeBuffer(dmq1, 2);
|
|
writer.writeBuffer(coeff, 2);
|
|
writer.endSequence();
|
|
|
|
if (options.type === 'der') {
|
|
return writer.buffer;
|
|
} else {
|
|
return '-----BEGIN RSA PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----';
|
|
}
|
|
},
|
|
|
|
privateImport: function (key, data, options) {
|
|
options = options || {};
|
|
var buffer;
|
|
|
|
if (options.type !== 'der') {
|
|
if (Buffer.isBuffer(data)) {
|
|
data = data.toString('utf8');
|
|
}
|
|
|
|
if (_.isString(data)) {
|
|
var pem = data.replace('-----BEGIN RSA PRIVATE KEY-----', '')
|
|
.replace('-----END RSA PRIVATE KEY-----', '')
|
|
.replace(/\s+|\n\r|\n|\r$/gm, '');
|
|
buffer = new Buffer(pem, 'base64');
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
} else if (Buffer.isBuffer(data)) {
|
|
buffer = data;
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
|
|
var reader = new ber.Reader(buffer);
|
|
reader.readSequence();
|
|
reader.readString(2, true); // just zero
|
|
key.setPrivate(
|
|
reader.readString(2, true), // modulus
|
|
reader.readString(2, true), // publicExponent
|
|
reader.readString(2, true), // privateExponent
|
|
reader.readString(2, true), // prime1
|
|
reader.readString(2, true), // prime2
|
|
reader.readString(2, true), // exponent1 -- d mod (p1)
|
|
reader.readString(2, true), // exponent2 -- d mod (q-1)
|
|
reader.readString(2, true) // coefficient -- (inverse of q) mod p
|
|
);
|
|
},
|
|
|
|
publicExport: function (key, options) {
|
|
options = options || {};
|
|
|
|
var n = key.n.toBuffer();
|
|
var length = n.length + 512; // magic
|
|
|
|
var bodyWriter = new ber.Writer({size: length});
|
|
bodyWriter.startSequence();
|
|
bodyWriter.writeBuffer(n, 2);
|
|
bodyWriter.writeInt(key.e);
|
|
bodyWriter.endSequence();
|
|
|
|
if (options.type === 'der') {
|
|
return bodyWriter.buffer;
|
|
} else {
|
|
return '-----BEGIN RSA PUBLIC KEY-----\n' + utils.linebrk(bodyWriter.buffer.toString('base64'), 64) + '\n-----END RSA PUBLIC KEY-----';
|
|
}
|
|
},
|
|
|
|
publicImport: function (key, data, options) {
|
|
options = options || {};
|
|
var buffer;
|
|
|
|
if (options.type !== 'der') {
|
|
if (Buffer.isBuffer(data)) {
|
|
data = data.toString('utf8');
|
|
}
|
|
|
|
if (_.isString(data)) {
|
|
var pem = data.replace('-----BEGIN RSA PUBLIC KEY-----', '')
|
|
.replace('-----END RSA PUBLIC KEY-----', '')
|
|
.replace(/\s+|\n\r|\n|\r$/gm, '');
|
|
buffer = new Buffer(pem, 'base64');
|
|
}
|
|
} else if (Buffer.isBuffer(data)) {
|
|
buffer = data;
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
|
|
var body = new ber.Reader(buffer);
|
|
body.readSequence();
|
|
key.setPublic(
|
|
body.readString(0x02, true), // modulus
|
|
body.readString(0x02, true) // publicExponent
|
|
);
|
|
},
|
|
|
|
|
|
autoImport: function (key, data) {
|
|
if (/^\s*-----BEGIN RSA PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PRIVATE KEY-----\s*$/g.test(data)) {
|
|
module.exports.privateImport(key, data);
|
|
return true;
|
|
}
|
|
|
|
if (/^\s*-----BEGIN RSA PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PUBLIC KEY-----\s*$/g.test(data)) {
|
|
module.exports.publicImport(key, data);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
};
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../utils":262,"asn1":95,"buffer":130}],255:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var ber = require('asn1').Ber;
|
|
var _ = require('../utils')._;
|
|
var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1';
|
|
var utils = require('../utils');
|
|
|
|
module.exports = {
|
|
privateExport: function (key, options) {
|
|
options = options || {};
|
|
|
|
var n = key.n.toBuffer();
|
|
var d = key.d.toBuffer();
|
|
var p = key.p.toBuffer();
|
|
var q = key.q.toBuffer();
|
|
var dmp1 = key.dmp1.toBuffer();
|
|
var dmq1 = key.dmq1.toBuffer();
|
|
var coeff = key.coeff.toBuffer();
|
|
|
|
var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic
|
|
var bodyWriter = new ber.Writer({size: length});
|
|
|
|
bodyWriter.startSequence();
|
|
bodyWriter.writeInt(0);
|
|
bodyWriter.writeBuffer(n, 2);
|
|
bodyWriter.writeInt(key.e);
|
|
bodyWriter.writeBuffer(d, 2);
|
|
bodyWriter.writeBuffer(p, 2);
|
|
bodyWriter.writeBuffer(q, 2);
|
|
bodyWriter.writeBuffer(dmp1, 2);
|
|
bodyWriter.writeBuffer(dmq1, 2);
|
|
bodyWriter.writeBuffer(coeff, 2);
|
|
bodyWriter.endSequence();
|
|
|
|
var writer = new ber.Writer({size: length});
|
|
writer.startSequence();
|
|
writer.writeInt(0);
|
|
writer.startSequence();
|
|
writer.writeOID(PUBLIC_RSA_OID);
|
|
writer.writeNull();
|
|
writer.endSequence();
|
|
writer.writeBuffer(bodyWriter.buffer, 4);
|
|
writer.endSequence();
|
|
|
|
if (options.type === 'der') {
|
|
return writer.buffer;
|
|
} else {
|
|
return '-----BEGIN PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PRIVATE KEY-----';
|
|
}
|
|
},
|
|
|
|
privateImport: function (key, data, options) {
|
|
options = options || {};
|
|
var buffer;
|
|
|
|
if (options.type !== 'der') {
|
|
if (Buffer.isBuffer(data)) {
|
|
data = data.toString('utf8');
|
|
}
|
|
|
|
if (_.isString(data)) {
|
|
var pem = data.replace('-----BEGIN PRIVATE KEY-----', '')
|
|
.replace('-----END PRIVATE KEY-----', '')
|
|
.replace(/\s+|\n\r|\n|\r$/gm, '');
|
|
buffer = new Buffer(pem, 'base64');
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
} else if (Buffer.isBuffer(data)) {
|
|
buffer = data;
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
|
|
var reader = new ber.Reader(buffer);
|
|
reader.readSequence();
|
|
reader.readInt(0);
|
|
var header = new ber.Reader(reader.readString(0x30, true));
|
|
|
|
if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) {
|
|
throw Error('Invalid Public key format');
|
|
}
|
|
|
|
var body = new ber.Reader(reader.readString(0x04, true));
|
|
body.readSequence();
|
|
body.readString(2, true); // just zero
|
|
key.setPrivate(
|
|
body.readString(2, true), // modulus
|
|
body.readString(2, true), // publicExponent
|
|
body.readString(2, true), // privateExponent
|
|
body.readString(2, true), // prime1
|
|
body.readString(2, true), // prime2
|
|
body.readString(2, true), // exponent1 -- d mod (p1)
|
|
body.readString(2, true), // exponent2 -- d mod (q-1)
|
|
body.readString(2, true) // coefficient -- (inverse of q) mod p
|
|
);
|
|
},
|
|
|
|
publicExport: function (key, options) {
|
|
options = options || {};
|
|
|
|
var n = key.n.toBuffer();
|
|
var length = n.length + 512; // magic
|
|
|
|
var bodyWriter = new ber.Writer({size: length});
|
|
bodyWriter.writeByte(0);
|
|
bodyWriter.startSequence();
|
|
bodyWriter.writeBuffer(n, 2);
|
|
bodyWriter.writeInt(key.e);
|
|
bodyWriter.endSequence();
|
|
|
|
var writer = new ber.Writer({size: length});
|
|
writer.startSequence();
|
|
writer.startSequence();
|
|
writer.writeOID(PUBLIC_RSA_OID);
|
|
writer.writeNull();
|
|
writer.endSequence();
|
|
writer.writeBuffer(bodyWriter.buffer, 3);
|
|
writer.endSequence();
|
|
|
|
if (options.type === 'der') {
|
|
return writer.buffer;
|
|
} else {
|
|
return '-----BEGIN PUBLIC KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PUBLIC KEY-----';
|
|
}
|
|
},
|
|
|
|
publicImport: function (key, data, options) {
|
|
options = options || {};
|
|
var buffer;
|
|
|
|
if (options.type !== 'der') {
|
|
if (Buffer.isBuffer(data)) {
|
|
data = data.toString('utf8');
|
|
}
|
|
|
|
if (_.isString(data)) {
|
|
var pem = data.replace('-----BEGIN PUBLIC KEY-----', '')
|
|
.replace('-----END PUBLIC KEY-----', '')
|
|
.replace(/\s+|\n\r|\n|\r$/gm, '');
|
|
buffer = new Buffer(pem, 'base64');
|
|
}
|
|
} else if (Buffer.isBuffer(data)) {
|
|
buffer = data;
|
|
} else {
|
|
throw Error('Unsupported key format');
|
|
}
|
|
|
|
var reader = new ber.Reader(buffer);
|
|
reader.readSequence();
|
|
var header = new ber.Reader(reader.readString(0x30, true));
|
|
|
|
if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) {
|
|
throw Error('Invalid Public key format');
|
|
}
|
|
|
|
var body = new ber.Reader(reader.readString(0x03, true));
|
|
body.readByte();
|
|
body.readSequence();
|
|
key.setPublic(
|
|
body.readString(0x02, true), // modulus
|
|
body.readString(0x02, true) // publicExponent
|
|
);
|
|
},
|
|
|
|
|
|
autoImport: function (key, data) {
|
|
if (/^\s*-----BEGIN PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PRIVATE KEY-----\s*$/g.test(data)) {
|
|
module.exports.privateImport(key, data);
|
|
return true;
|
|
}
|
|
|
|
if (/^\s*-----BEGIN PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PUBLIC KEY-----\s*$/g.test(data)) {
|
|
module.exports.publicImport(key, data);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
};
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../utils":262,"asn1":95,"buffer":130}],256:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
|
|
|
|
var crypt = require('crypto');
|
|
var _ = require('../utils')._;
|
|
|
|
var dbits;
|
|
|
|
var canary = 0xdeadbeefcafe;
|
|
var j_lm = ((canary & 0xffffff) == 0xefcafe);
|
|
|
|
function BigInteger(a, b) {
|
|
if (a != null) {
|
|
if ("number" == typeof a) {
|
|
this.fromNumber(a, b);
|
|
} else if (Buffer.isBuffer(a)) {
|
|
this.fromBuffer(a);
|
|
} else if (b == null && "string" != typeof a) {
|
|
this.fromByteArray(a);
|
|
} else {
|
|
this.fromString(a, b);
|
|
}
|
|
}
|
|
}
|
|
|
|
function nbi() {
|
|
return new BigInteger(null);
|
|
}
|
|
|
|
|
|
function am1(i, x, w, j, c, n) {
|
|
while (--n >= 0) {
|
|
var v = x * this[i++] + w[j] + c;
|
|
c = Math.floor(v / 0x4000000);
|
|
w[j++] = v & 0x3ffffff;
|
|
}
|
|
return c;
|
|
}
|
|
function am2(i, x, w, j, c, n) {
|
|
var xl = x & 0x7fff, xh = x >> 15;
|
|
while (--n >= 0) {
|
|
var l = this[i] & 0x7fff;
|
|
var h = this[i++] >> 15;
|
|
var m = xh * l + h * xl;
|
|
l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
|
|
c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
|
|
w[j++] = l & 0x3fffffff;
|
|
}
|
|
return c;
|
|
}
|
|
function am3(i, x, w, j, c, n) {
|
|
var xl = x & 0x3fff, xh = x >> 14;
|
|
while (--n >= 0) {
|
|
var l = this[i] & 0x3fff;
|
|
var h = this[i++] >> 14;
|
|
var m = xh * l + h * xl;
|
|
l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
|
|
c = (l >> 28) + (m >> 14) + xh * h;
|
|
w[j++] = l & 0xfffffff;
|
|
}
|
|
return c;
|
|
}
|
|
|
|
|
|
BigInteger.prototype.am = am3;
|
|
dbits = 28;
|
|
|
|
BigInteger.prototype.DB = dbits;
|
|
BigInteger.prototype.DM = ((1 << dbits) - 1);
|
|
BigInteger.prototype.DV = (1 << dbits);
|
|
|
|
var BI_FP = 52;
|
|
BigInteger.prototype.FV = Math.pow(2, BI_FP);
|
|
BigInteger.prototype.F1 = BI_FP - dbits;
|
|
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
|
|
|
|
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
var BI_RC = new Array();
|
|
var rr, vv;
|
|
rr = "0".charCodeAt(0);
|
|
for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
|
|
rr = "a".charCodeAt(0);
|
|
for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
|
|
rr = "A".charCodeAt(0);
|
|
for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
|
|
|
|
function int2char(n) {
|
|
return BI_RM.charAt(n);
|
|
}
|
|
function intAt(s, i) {
|
|
var c = BI_RC[s.charCodeAt(i)];
|
|
return (c == null) ? -1 : c;
|
|
}
|
|
|
|
function bnpCopyTo(r) {
|
|
for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];
|
|
r.t = this.t;
|
|
r.s = this.s;
|
|
}
|
|
|
|
function bnpFromInt(x) {
|
|
this.t = 1;
|
|
this.s = (x < 0) ? -1 : 0;
|
|
if (x > 0) this[0] = x;
|
|
else if (x < -1) this[0] = x + DV;
|
|
else this.t = 0;
|
|
}
|
|
|
|
function nbv(i) {
|
|
var r = nbi();
|
|
r.fromInt(i);
|
|
return r;
|
|
}
|
|
|
|
function bnpFromString(data, radix, unsigned) {
|
|
var k;
|
|
switch (radix) {
|
|
case 2:
|
|
k = 1;
|
|
break;
|
|
case 4:
|
|
k = 2;
|
|
break;
|
|
case 8:
|
|
k = 3;
|
|
break;
|
|
case 16:
|
|
k = 4;
|
|
break;
|
|
case 32:
|
|
k = 5;
|
|
break;
|
|
case 256:
|
|
k = 8;
|
|
break;
|
|
default:
|
|
this.fromRadix(data, radix);
|
|
return;
|
|
}
|
|
|
|
this.t = 0;
|
|
this.s = 0;
|
|
|
|
var i = data.length;
|
|
var mi = false;
|
|
var sh = 0;
|
|
|
|
while (--i >= 0) {
|
|
var x = (k == 8) ? data[i] & 0xff : intAt(data, i);
|
|
if (x < 0) {
|
|
if (data.charAt(i) == "-") mi = true;
|
|
continue;
|
|
}
|
|
mi = false;
|
|
if (sh === 0)
|
|
this[this.t++] = x;
|
|
else if (sh + k > this.DB) {
|
|
this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
|
|
this[this.t++] = (x >> (this.DB - sh));
|
|
}
|
|
else
|
|
this[this.t - 1] |= x << sh;
|
|
sh += k;
|
|
if (sh >= this.DB) sh -= this.DB;
|
|
}
|
|
if ((!unsigned) && k == 8 && (data[0] & 0x80) != 0) {
|
|
this.s = -1;
|
|
if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
|
|
}
|
|
this.clamp();
|
|
if (mi) BigInteger.ZERO.subTo(this, this);
|
|
}
|
|
|
|
function bnpFromByteArray(a, unsigned) {
|
|
this.fromString(a, 256, unsigned)
|
|
}
|
|
|
|
function bnpFromBuffer(a) {
|
|
this.fromString(a, 256, true)
|
|
}
|
|
|
|
function bnpClamp() {
|
|
var c = this.s & this.DM;
|
|
while (this.t > 0 && this[this.t - 1] == c) --this.t;
|
|
}
|
|
|
|
function bnToString(b) {
|
|
if (this.s < 0) return "-" + this.negate().toString(b);
|
|
var k;
|
|
if (b == 16) k = 4;
|
|
else if (b == 8) k = 3;
|
|
else if (b == 2) k = 1;
|
|
else if (b == 32) k = 5;
|
|
else if (b == 4) k = 2;
|
|
else return this.toRadix(b);
|
|
var km = (1 << k) - 1, d, m = false, r = "", i = this.t;
|
|
var p = this.DB - (i * this.DB) % k;
|
|
if (i-- > 0) {
|
|
if (p < this.DB && (d = this[i] >> p) > 0) {
|
|
m = true;
|
|
r = int2char(d);
|
|
}
|
|
while (i >= 0) {
|
|
if (p < k) {
|
|
d = (this[i] & ((1 << p) - 1)) << (k - p);
|
|
d |= this[--i] >> (p += this.DB - k);
|
|
}
|
|
else {
|
|
d = (this[i] >> (p -= k)) & km;
|
|
if (p <= 0) {
|
|
p += this.DB;
|
|
--i;
|
|
}
|
|
}
|
|
if (d > 0) m = true;
|
|
if (m) r += int2char(d);
|
|
}
|
|
}
|
|
return m ? r : "0";
|
|
}
|
|
|
|
function bnNegate() {
|
|
var r = nbi();
|
|
BigInteger.ZERO.subTo(this, r);
|
|
return r;
|
|
}
|
|
|
|
function bnAbs() {
|
|
return (this.s < 0) ? this.negate() : this;
|
|
}
|
|
|
|
function bnCompareTo(a) {
|
|
var r = this.s - a.s;
|
|
if (r != 0) return r;
|
|
var i = this.t;
|
|
r = i - a.t;
|
|
if (r != 0) return (this.s < 0) ? -r : r;
|
|
while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r;
|
|
return 0;
|
|
}
|
|
|
|
function nbits(x) {
|
|
var r = 1, t;
|
|
if ((t = x >>> 16) != 0) {
|
|
x = t;
|
|
r += 16;
|
|
}
|
|
if ((t = x >> 8) != 0) {
|
|
x = t;
|
|
r += 8;
|
|
}
|
|
if ((t = x >> 4) != 0) {
|
|
x = t;
|
|
r += 4;
|
|
}
|
|
if ((t = x >> 2) != 0) {
|
|
x = t;
|
|
r += 2;
|
|
}
|
|
if ((t = x >> 1) != 0) {
|
|
x = t;
|
|
r += 1;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function bnBitLength() {
|
|
if (this.t <= 0) return 0;
|
|
return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
|
|
}
|
|
|
|
function bnpDLShiftTo(n, r) {
|
|
var i;
|
|
for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];
|
|
for (i = n - 1; i >= 0; --i) r[i] = 0;
|
|
r.t = this.t + n;
|
|
r.s = this.s;
|
|
}
|
|
|
|
function bnpDRShiftTo(n, r) {
|
|
for (var i = n; i < this.t; ++i) r[i - n] = this[i];
|
|
r.t = Math.max(this.t - n, 0);
|
|
r.s = this.s;
|
|
}
|
|
|
|
function bnpLShiftTo(n, r) {
|
|
var bs = n % this.DB;
|
|
var cbs = this.DB - bs;
|
|
var bm = (1 << cbs) - 1;
|
|
var ds = Math.floor(n / this.DB), c = (this.s << bs) & this.DM, i;
|
|
for (i = this.t - 1; i >= 0; --i) {
|
|
r[i + ds + 1] = (this[i] >> cbs) | c;
|
|
c = (this[i] & bm) << bs;
|
|
}
|
|
for (i = ds - 1; i >= 0; --i) r[i] = 0;
|
|
r[ds] = c;
|
|
r.t = this.t + ds + 1;
|
|
r.s = this.s;
|
|
r.clamp();
|
|
}
|
|
|
|
function bnpRShiftTo(n, r) {
|
|
r.s = this.s;
|
|
var ds = Math.floor(n / this.DB);
|
|
if (ds >= this.t) {
|
|
r.t = 0;
|
|
return;
|
|
}
|
|
var bs = n % this.DB;
|
|
var cbs = this.DB - bs;
|
|
var bm = (1 << bs) - 1;
|
|
r[0] = this[ds] >> bs;
|
|
for (var i = ds + 1; i < this.t; ++i) {
|
|
r[i - ds - 1] |= (this[i] & bm) << cbs;
|
|
r[i - ds] = this[i] >> bs;
|
|
}
|
|
if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;
|
|
r.t = this.t - ds;
|
|
r.clamp();
|
|
}
|
|
|
|
function bnpSubTo(a, r) {
|
|
var i = 0, c = 0, m = Math.min(a.t, this.t);
|
|
while (i < m) {
|
|
c += this[i] - a[i];
|
|
r[i++] = c & this.DM;
|
|
c >>= this.DB;
|
|
}
|
|
if (a.t < this.t) {
|
|
c -= a.s;
|
|
while (i < this.t) {
|
|
c += this[i];
|
|
r[i++] = c & this.DM;
|
|
c >>= this.DB;
|
|
}
|
|
c += this.s;
|
|
}
|
|
else {
|
|
c += this.s;
|
|
while (i < a.t) {
|
|
c -= a[i];
|
|
r[i++] = c & this.DM;
|
|
c >>= this.DB;
|
|
}
|
|
c -= a.s;
|
|
}
|
|
r.s = (c < 0) ? -1 : 0;
|
|
if (c < -1) r[i++] = this.DV + c;
|
|
else if (c > 0) r[i++] = c;
|
|
r.t = i;
|
|
r.clamp();
|
|
}
|
|
|
|
function bnpMultiplyTo(a, r) {
|
|
var x = this.abs(), y = a.abs();
|
|
var i = x.t;
|
|
r.t = i + y.t;
|
|
while (--i >= 0) r[i] = 0;
|
|
for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
|
|
r.s = 0;
|
|
r.clamp();
|
|
if (this.s != a.s) BigInteger.ZERO.subTo(r, r);
|
|
}
|
|
|
|
function bnpSquareTo(r) {
|
|
var x = this.abs();
|
|
var i = r.t = 2 * x.t;
|
|
while (--i >= 0) r[i] = 0;
|
|
for (i = 0; i < x.t - 1; ++i) {
|
|
var c = x.am(i, x[i], r, 2 * i, 0, 1);
|
|
if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {
|
|
r[i + x.t] -= x.DV;
|
|
r[i + x.t + 1] = 1;
|
|
}
|
|
}
|
|
if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
|
|
r.s = 0;
|
|
r.clamp();
|
|
}
|
|
|
|
function bnpDivRemTo(m, q, r) {
|
|
var pm = m.abs();
|
|
if (pm.t <= 0) return;
|
|
var pt = this.abs();
|
|
if (pt.t < pm.t) {
|
|
if (q != null) q.fromInt(0);
|
|
if (r != null) this.copyTo(r);
|
|
return;
|
|
}
|
|
if (r == null) r = nbi();
|
|
var y = nbi(), ts = this.s, ms = m.s;
|
|
var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
|
|
if (nsh > 0) {
|
|
pm.lShiftTo(nsh, y);
|
|
pt.lShiftTo(nsh, r);
|
|
}
|
|
else {
|
|
pm.copyTo(y);
|
|
pt.copyTo(r);
|
|
}
|
|
var ys = y.t;
|
|
var y0 = y[ys - 1];
|
|
if (y0 === 0) return;
|
|
var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
|
|
var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2;
|
|
var i = r.t, j = i - ys, t = (q == null) ? nbi() : q;
|
|
y.dlShiftTo(j, t);
|
|
if (r.compareTo(t) >= 0) {
|
|
r[r.t++] = 1;
|
|
r.subTo(t, r);
|
|
}
|
|
BigInteger.ONE.dlShiftTo(ys, t);
|
|
t.subTo(y, y); // "negative" y so we can replace sub with am later
|
|
while (y.t < ys) y[y.t++] = 0;
|
|
while (--j >= 0) {
|
|
var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
|
|
if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
|
|
y.dlShiftTo(j, t);
|
|
r.subTo(t, r);
|
|
while (r[i] < --qd) r.subTo(t, r);
|
|
}
|
|
}
|
|
if (q != null) {
|
|
r.drShiftTo(ys, q);
|
|
if (ts != ms) BigInteger.ZERO.subTo(q, q);
|
|
}
|
|
r.t = ys;
|
|
r.clamp();
|
|
if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder
|
|
if (ts < 0) BigInteger.ZERO.subTo(r, r);
|
|
}
|
|
|
|
function bnMod(a) {
|
|
var r = nbi();
|
|
this.abs().divRemTo(a, null, r);
|
|
if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);
|
|
return r;
|
|
}
|
|
|
|
function Classic(m) {
|
|
this.m = m;
|
|
}
|
|
function cConvert(x) {
|
|
if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
|
|
else return x;
|
|
}
|
|
function cRevert(x) {
|
|
return x;
|
|
}
|
|
function cReduce(x) {
|
|
x.divRemTo(this.m, null, x);
|
|
}
|
|
function cMulTo(x, y, r) {
|
|
x.multiplyTo(y, r);
|
|
this.reduce(r);
|
|
}
|
|
function cSqrTo(x, r) {
|
|
x.squareTo(r);
|
|
this.reduce(r);
|
|
}
|
|
|
|
Classic.prototype.convert = cConvert;
|
|
Classic.prototype.revert = cRevert;
|
|
Classic.prototype.reduce = cReduce;
|
|
Classic.prototype.mulTo = cMulTo;
|
|
Classic.prototype.sqrTo = cSqrTo;
|
|
|
|
function bnpInvDigit() {
|
|
if (this.t < 1) return 0;
|
|
var x = this[0];
|
|
if ((x & 1) === 0) return 0;
|
|
var y = x & 3; // y == 1/x mod 2^2
|
|
y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
|
|
y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
|
|
y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
|
|
y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
|
|
return (y > 0) ? this.DV - y : -y;
|
|
}
|
|
|
|
function Montgomery(m) {
|
|
this.m = m;
|
|
this.mp = m.invDigit();
|
|
this.mpl = this.mp & 0x7fff;
|
|
this.mph = this.mp >> 15;
|
|
this.um = (1 << (m.DB - 15)) - 1;
|
|
this.mt2 = 2 * m.t;
|
|
}
|
|
|
|
function montConvert(x) {
|
|
var r = nbi();
|
|
x.abs().dlShiftTo(this.m.t, r);
|
|
r.divRemTo(this.m, null, r);
|
|
if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);
|
|
return r;
|
|
}
|
|
|
|
function montRevert(x) {
|
|
var r = nbi();
|
|
x.copyTo(r);
|
|
this.reduce(r);
|
|
return r;
|
|
}
|
|
|
|
function montReduce(x) {
|
|
while (x.t <= this.mt2) // pad x so am has enough room later
|
|
x[x.t++] = 0;
|
|
for (var i = 0; i < this.m.t; ++i) {
|
|
var j = x[i] & 0x7fff;
|
|
var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;
|
|
j = i + this.m.t;
|
|
x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
|
|
while (x[j] >= x.DV) {
|
|
x[j] -= x.DV;
|
|
x[++j]++;
|
|
}
|
|
}
|
|
x.clamp();
|
|
x.drShiftTo(this.m.t, x);
|
|
if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
|
|
}
|
|
|
|
function montSqrTo(x, r) {
|
|
x.squareTo(r);
|
|
this.reduce(r);
|
|
}
|
|
|
|
function montMulTo(x, y, r) {
|
|
x.multiplyTo(y, r);
|
|
this.reduce(r);
|
|
}
|
|
|
|
Montgomery.prototype.convert = montConvert;
|
|
Montgomery.prototype.revert = montRevert;
|
|
Montgomery.prototype.reduce = montReduce;
|
|
Montgomery.prototype.mulTo = montMulTo;
|
|
Montgomery.prototype.sqrTo = montSqrTo;
|
|
|
|
function bnpIsEven() {
|
|
return ((this.t > 0) ? (this[0] & 1) : this.s) === 0;
|
|
}
|
|
|
|
function bnpExp(e, z) {
|
|
if (e > 0xffffffff || e < 1) return BigInteger.ONE;
|
|
var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1;
|
|
g.copyTo(r);
|
|
while (--i >= 0) {
|
|
z.sqrTo(r, r2);
|
|
if ((e & (1 << i)) > 0) z.mulTo(r2, g, r);
|
|
else {
|
|
var t = r;
|
|
r = r2;
|
|
r2 = t;
|
|
}
|
|
}
|
|
return z.revert(r);
|
|
}
|
|
|
|
function bnModPowInt(e, m) {
|
|
var z;
|
|
if (e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
|
|
return this.exp(e, z);
|
|
}
|
|
|
|
|
|
|
|
|
|
function bnClone() {
|
|
var r = nbi();
|
|
this.copyTo(r);
|
|
return r;
|
|
}
|
|
|
|
function bnIntValue() {
|
|
if (this.s < 0) {
|
|
if (this.t == 1) return this[0] - this.DV;
|
|
else if (this.t === 0) return -1;
|
|
}
|
|
else if (this.t == 1) return this[0];
|
|
else if (this.t === 0) return 0;
|
|
return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
|
|
}
|
|
|
|
function bnByteValue() {
|
|
return (this.t == 0) ? this.s : (this[0] << 24) >> 24;
|
|
}
|
|
|
|
function bnShortValue() {
|
|
return (this.t == 0) ? this.s : (this[0] << 16) >> 16;
|
|
}
|
|
|
|
function bnpChunkSize(r) {
|
|
return Math.floor(Math.LN2 * this.DB / Math.log(r));
|
|
}
|
|
|
|
function bnSigNum() {
|
|
if (this.s < 0) return -1;
|
|
else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
|
|
else return 1;
|
|
}
|
|
|
|
function bnpToRadix(b) {
|
|
if (b == null) b = 10;
|
|
if (this.signum() === 0 || b < 2 || b > 36) return "0";
|
|
var cs = this.chunkSize(b);
|
|
var a = Math.pow(b, cs);
|
|
var d = nbv(a), y = nbi(), z = nbi(), r = "";
|
|
this.divRemTo(d, y, z);
|
|
while (y.signum() > 0) {
|
|
r = (a + z.intValue()).toString(b).substr(1) + r;
|
|
y.divRemTo(d, y, z);
|
|
}
|
|
return z.intValue().toString(b) + r;
|
|
}
|
|
|
|
function bnpFromRadix(s, b) {
|
|
this.fromInt(0);
|
|
if (b == null) b = 10;
|
|
var cs = this.chunkSize(b);
|
|
var d = Math.pow(b, cs), mi = false, j = 0, w = 0;
|
|
for (var i = 0; i < s.length; ++i) {
|
|
var x = intAt(s, i);
|
|
if (x < 0) {
|
|
if (s.charAt(i) == "-" && this.signum() === 0) mi = true;
|
|
continue;
|
|
}
|
|
w = b * w + x;
|
|
if (++j >= cs) {
|
|
this.dMultiply(d);
|
|
this.dAddOffset(w, 0);
|
|
j = 0;
|
|
w = 0;
|
|
}
|
|
}
|
|
if (j > 0) {
|
|
this.dMultiply(Math.pow(b, j));
|
|
this.dAddOffset(w, 0);
|
|
}
|
|
if (mi) BigInteger.ZERO.subTo(this, this);
|
|
}
|
|
|
|
function bnpFromNumber(a, b) {
|
|
if ("number" == typeof b) {
|
|
if (a < 2) this.fromInt(1);
|
|
else {
|
|
this.fromNumber(a);
|
|
if (!this.testBit(a - 1)) // force MSB set
|
|
this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
|
|
if (this.isEven()) this.dAddOffset(1, 0); // force odd
|
|
while (!this.isProbablePrime(b)) {
|
|
this.dAddOffset(2, 0);
|
|
if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
|
|
}
|
|
}
|
|
} else {
|
|
var x = crypt.randomBytes((a >> 3) + 1)
|
|
var t = a & 7;
|
|
|
|
if (t > 0)
|
|
x[0] &= ((1 << t) - 1);
|
|
else
|
|
x[0] = 0;
|
|
|
|
this.fromByteArray(x);
|
|
}
|
|
}
|
|
|
|
function bnToByteArray() {
|
|
var i = this.t, r = new Array();
|
|
r[0] = this.s;
|
|
var p = this.DB - (i * this.DB) % 8, d, k = 0;
|
|
if (i-- > 0) {
|
|
if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p)
|
|
r[k++] = d | (this.s << (this.DB - p));
|
|
while (i >= 0) {
|
|
if (p < 8) {
|
|
d = (this[i] & ((1 << p) - 1)) << (8 - p);
|
|
d |= this[--i] >> (p += this.DB - 8);
|
|
}
|
|
else {
|
|
d = (this[i] >> (p -= 8)) & 0xff;
|
|
if (p <= 0) {
|
|
p += this.DB;
|
|
--i;
|
|
}
|
|
}
|
|
if ((d & 0x80) != 0) d |= -256;
|
|
if (k === 0 && (this.s & 0x80) != (d & 0x80)) ++k;
|
|
if (k > 0 || d != this.s) r[k++] = d;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
|
|
function bnToBuffer(trimOrSize) {
|
|
var res = new Buffer(this.toByteArray());
|
|
if (trimOrSize === true && res[0] === 0) {
|
|
res = res.slice(1);
|
|
} else if (_.isNumber(trimOrSize)) {
|
|
if (res.length > trimOrSize) {
|
|
for (var i = 0; i < res.length - trimOrSize; i++) {
|
|
if (res[i] !== 0) {
|
|
return null;
|
|
}
|
|
}
|
|
return res.slice(res.length - trimOrSize);
|
|
} else if (res.length < trimOrSize) {
|
|
var padded = new Buffer(trimOrSize);
|
|
padded.fill(0, 0, trimOrSize - res.length);
|
|
res.copy(padded, trimOrSize - res.length);
|
|
return padded;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
|
|
function bnEquals(a) {
|
|
return (this.compareTo(a) == 0);
|
|
}
|
|
function bnMin(a) {
|
|
return (this.compareTo(a) < 0) ? this : a;
|
|
}
|
|
function bnMax(a) {
|
|
return (this.compareTo(a) > 0) ? this : a;
|
|
}
|
|
|
|
function bnpBitwiseTo(a, op, r) {
|
|
var i, f, m = Math.min(a.t, this.t);
|
|
for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]);
|
|
if (a.t < this.t) {
|
|
f = a.s & this.DM;
|
|
for (i = m; i < this.t; ++i) r[i] = op(this[i], f);
|
|
r.t = this.t;
|
|
}
|
|
else {
|
|
f = this.s & this.DM;
|
|
for (i = m; i < a.t; ++i) r[i] = op(f, a[i]);
|
|
r.t = a.t;
|
|
}
|
|
r.s = op(this.s, a.s);
|
|
r.clamp();
|
|
}
|
|
|
|
function op_and(x, y) {
|
|
return x & y;
|
|
}
|
|
function bnAnd(a) {
|
|
var r = nbi();
|
|
this.bitwiseTo(a, op_and, r);
|
|
return r;
|
|
}
|
|
|
|
function op_or(x, y) {
|
|
return x | y;
|
|
}
|
|
function bnOr(a) {
|
|
var r = nbi();
|
|
this.bitwiseTo(a, op_or, r);
|
|
return r;
|
|
}
|
|
|
|
function op_xor(x, y) {
|
|
return x ^ y;
|
|
}
|
|
function bnXor(a) {
|
|
var r = nbi();
|
|
this.bitwiseTo(a, op_xor, r);
|
|
return r;
|
|
}
|
|
|
|
function op_andnot(x, y) {
|
|
return x & ~y;
|
|
}
|
|
function bnAndNot(a) {
|
|
var r = nbi();
|
|
this.bitwiseTo(a, op_andnot, r);
|
|
return r;
|
|
}
|
|
|
|
function bnNot() {
|
|
var r = nbi();
|
|
for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i];
|
|
r.t = this.t;
|
|
r.s = ~this.s;
|
|
return r;
|
|
}
|
|
|
|
function bnShiftLeft(n) {
|
|
var r = nbi();
|
|
if (n < 0) this.rShiftTo(-n, r); else this.lShiftTo(n, r);
|
|
return r;
|
|
}
|
|
|
|
function bnShiftRight(n) {
|
|
var r = nbi();
|
|
if (n < 0) this.lShiftTo(-n, r); else this.rShiftTo(n, r);
|
|
return r;
|
|
}
|
|
|
|
function lbit(x) {
|
|
if (x === 0) return -1;
|
|
var r = 0;
|
|
if ((x & 0xffff) === 0) {
|
|
x >>= 16;
|
|
r += 16;
|
|
}
|
|
if ((x & 0xff) === 0) {
|
|
x >>= 8;
|
|
r += 8;
|
|
}
|
|
if ((x & 0xf) === 0) {
|
|
x >>= 4;
|
|
r += 4;
|
|
}
|
|
if ((x & 3) === 0) {
|
|
x >>= 2;
|
|
r += 2;
|
|
}
|
|
if ((x & 1) === 0) ++r;
|
|
return r;
|
|
}
|
|
|
|
function bnGetLowestSetBit() {
|
|
for (var i = 0; i < this.t; ++i)
|
|
if (this[i] != 0) return i * this.DB + lbit(this[i]);
|
|
if (this.s < 0) return this.t * this.DB;
|
|
return -1;
|
|
}
|
|
|
|
function cbit(x) {
|
|
var r = 0;
|
|
while (x != 0) {
|
|
x &= x - 1;
|
|
++r;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function bnBitCount() {
|
|
var r = 0, x = this.s & this.DM;
|
|
for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x);
|
|
return r;
|
|
}
|
|
|
|
function bnTestBit(n) {
|
|
var j = Math.floor(n / this.DB);
|
|
if (j >= this.t) return (this.s != 0);
|
|
return ((this[j] & (1 << (n % this.DB))) != 0);
|
|
}
|
|
|
|
function bnpChangeBit(n, op) {
|
|
var r = BigInteger.ONE.shiftLeft(n);
|
|
this.bitwiseTo(r, op, r);
|
|
return r;
|
|
}
|
|
|
|
function bnSetBit(n) {
|
|
return this.changeBit(n, op_or);
|
|
}
|
|
|
|
function bnClearBit(n) {
|
|
return this.changeBit(n, op_andnot);
|
|
}
|
|
|
|
function bnFlipBit(n) {
|
|
return this.changeBit(n, op_xor);
|
|
}
|
|
|
|
function bnpAddTo(a, r) {
|
|
var i = 0, c = 0, m = Math.min(a.t, this.t);
|
|
while (i < m) {
|
|
c += this[i] + a[i];
|
|
r[i++] = c & this.DM;
|
|
c >>= this.DB;
|
|
}
|
|
if (a.t < this.t) {
|
|
c += a.s;
|
|
while (i < this.t) {
|
|
c += this[i];
|
|
r[i++] = c & this.DM;
|
|
c >>= this.DB;
|
|
}
|
|
c += this.s;
|
|
}
|
|
else {
|
|
c += this.s;
|
|
while (i < a.t) {
|
|
c += a[i];
|
|
r[i++] = c & this.DM;
|
|
c >>= this.DB;
|
|
}
|
|
c += a.s;
|
|
}
|
|
r.s = (c < 0) ? -1 : 0;
|
|
if (c > 0) r[i++] = c;
|
|
else if (c < -1) r[i++] = this.DV + c;
|
|
r.t = i;
|
|
r.clamp();
|
|
}
|
|
|
|
function bnAdd(a) {
|
|
var r = nbi();
|
|
this.addTo(a, r);
|
|
return r;
|
|
}
|
|
|
|
function bnSubtract(a) {
|
|
var r = nbi();
|
|
this.subTo(a, r);
|
|
return r;
|
|
}
|
|
|
|
function bnMultiply(a) {
|
|
var r = nbi();
|
|
this.multiplyTo(a, r);
|
|
return r;
|
|
}
|
|
|
|
function bnSquare() {
|
|
var r = nbi();
|
|
this.squareTo(r);
|
|
return r;
|
|
}
|
|
|
|
function bnDivide(a) {
|
|
var r = nbi();
|
|
this.divRemTo(a, r, null);
|
|
return r;
|
|
}
|
|
|
|
function bnRemainder(a) {
|
|
var r = nbi();
|
|
this.divRemTo(a, null, r);
|
|
return r;
|
|
}
|
|
|
|
function bnDivideAndRemainder(a) {
|
|
var q = nbi(), r = nbi();
|
|
this.divRemTo(a, q, r);
|
|
return new Array(q, r);
|
|
}
|
|
|
|
function bnpDMultiply(n) {
|
|
this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
|
|
++this.t;
|
|
this.clamp();
|
|
}
|
|
|
|
function bnpDAddOffset(n, w) {
|
|
if (n === 0) return;
|
|
while (this.t <= w) this[this.t++] = 0;
|
|
this[w] += n;
|
|
while (this[w] >= this.DV) {
|
|
this[w] -= this.DV;
|
|
if (++w >= this.t) this[this.t++] = 0;
|
|
++this[w];
|
|
}
|
|
}
|
|
|
|
function NullExp() {
|
|
}
|
|
function nNop(x) {
|
|
return x;
|
|
}
|
|
function nMulTo(x, y, r) {
|
|
x.multiplyTo(y, r);
|
|
}
|
|
function nSqrTo(x, r) {
|
|
x.squareTo(r);
|
|
}
|
|
|
|
NullExp.prototype.convert = nNop;
|
|
NullExp.prototype.revert = nNop;
|
|
NullExp.prototype.mulTo = nMulTo;
|
|
NullExp.prototype.sqrTo = nSqrTo;
|
|
|
|
function bnPow(e) {
|
|
return this.exp(e, new NullExp());
|
|
}
|
|
|
|
function bnpMultiplyLowerTo(a, n, r) {
|
|
var i = Math.min(this.t + a.t, n);
|
|
r.s = 0; // assumes a,this >= 0
|
|
r.t = i;
|
|
while (i > 0) r[--i] = 0;
|
|
var j;
|
|
for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
|
|
for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i);
|
|
r.clamp();
|
|
}
|
|
|
|
function bnpMultiplyUpperTo(a, n, r) {
|
|
--n;
|
|
var i = r.t = this.t + a.t - n;
|
|
r.s = 0; // assumes a,this >= 0
|
|
while (--i >= 0) r[i] = 0;
|
|
for (i = Math.max(n - this.t, 0); i < a.t; ++i)
|
|
r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
|
|
r.clamp();
|
|
r.drShiftTo(1, r);
|
|
}
|
|
|
|
function Barrett(m) {
|
|
this.r2 = nbi();
|
|
this.q3 = nbi();
|
|
BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
|
|
this.mu = this.r2.divide(m);
|
|
this.m = m;
|
|
}
|
|
|
|
function barrettConvert(x) {
|
|
if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);
|
|
else if (x.compareTo(this.m) < 0) return x;
|
|
else {
|
|
var r = nbi();
|
|
x.copyTo(r);
|
|
this.reduce(r);
|
|
return r;
|
|
}
|
|
}
|
|
|
|
function barrettRevert(x) {
|
|
return x;
|
|
}
|
|
|
|
function barrettReduce(x) {
|
|
x.drShiftTo(this.m.t - 1, this.r2);
|
|
if (x.t > this.m.t + 1) {
|
|
x.t = this.m.t + 1;
|
|
x.clamp();
|
|
}
|
|
this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
|
|
this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
|
|
while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1);
|
|
x.subTo(this.r2, x);
|
|
while (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
|
|
}
|
|
|
|
function barrettSqrTo(x, r) {
|
|
x.squareTo(r);
|
|
this.reduce(r);
|
|
}
|
|
|
|
function barrettMulTo(x, y, r) {
|
|
x.multiplyTo(y, r);
|
|
this.reduce(r);
|
|
}
|
|
|
|
Barrett.prototype.convert = barrettConvert;
|
|
Barrett.prototype.revert = barrettRevert;
|
|
Barrett.prototype.reduce = barrettReduce;
|
|
Barrett.prototype.mulTo = barrettMulTo;
|
|
Barrett.prototype.sqrTo = barrettSqrTo;
|
|
|
|
function bnModPow(e, m) {
|
|
var i = e.bitLength(), k, r = nbv(1), z;
|
|
if (i <= 0) return r;
|
|
else if (i < 18) k = 1;
|
|
else if (i < 48) k = 3;
|
|
else if (i < 144) k = 4;
|
|
else if (i < 768) k = 5;
|
|
else k = 6;
|
|
if (i < 8)
|
|
z = new Classic(m);
|
|
else if (m.isEven())
|
|
z = new Barrett(m);
|
|
else
|
|
z = new Montgomery(m);
|
|
|
|
var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1;
|
|
g[1] = z.convert(this);
|
|
if (k > 1) {
|
|
var g2 = nbi();
|
|
z.sqrTo(g[1], g2);
|
|
while (n <= km) {
|
|
g[n] = nbi();
|
|
z.mulTo(g2, g[n - 2], g[n]);
|
|
n += 2;
|
|
}
|
|
}
|
|
|
|
var j = e.t - 1, w, is1 = true, r2 = nbi(), t;
|
|
i = nbits(e[j]) - 1;
|
|
while (j >= 0) {
|
|
if (i >= k1) w = (e[j] >> (i - k1)) & km;
|
|
else {
|
|
w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
|
|
if (j > 0) w |= e[j - 1] >> (this.DB + i - k1);
|
|
}
|
|
|
|
n = k;
|
|
while ((w & 1) === 0) {
|
|
w >>= 1;
|
|
--n;
|
|
}
|
|
if ((i -= n) < 0) {
|
|
i += this.DB;
|
|
--j;
|
|
}
|
|
if (is1) { // ret == 1, don't bother squaring or multiplying it
|
|
g[w].copyTo(r);
|
|
is1 = false;
|
|
}
|
|
else {
|
|
while (n > 1) {
|
|
z.sqrTo(r, r2);
|
|
z.sqrTo(r2, r);
|
|
n -= 2;
|
|
}
|
|
if (n > 0) z.sqrTo(r, r2); else {
|
|
t = r;
|
|
r = r2;
|
|
r2 = t;
|
|
}
|
|
z.mulTo(r2, g[w], r);
|
|
}
|
|
|
|
while (j >= 0 && (e[j] & (1 << i)) === 0) {
|
|
z.sqrTo(r, r2);
|
|
t = r;
|
|
r = r2;
|
|
r2 = t;
|
|
if (--i < 0) {
|
|
i = this.DB - 1;
|
|
--j;
|
|
}
|
|
}
|
|
}
|
|
return z.revert(r);
|
|
}
|
|
|
|
function bnGCD(a) {
|
|
var x = (this.s < 0) ? this.negate() : this.clone();
|
|
var y = (a.s < 0) ? a.negate() : a.clone();
|
|
if (x.compareTo(y) < 0) {
|
|
var t = x;
|
|
x = y;
|
|
y = t;
|
|
}
|
|
var i = x.getLowestSetBit(), g = y.getLowestSetBit();
|
|
if (g < 0) return x;
|
|
if (i < g) g = i;
|
|
if (g > 0) {
|
|
x.rShiftTo(g, x);
|
|
y.rShiftTo(g, y);
|
|
}
|
|
while (x.signum() > 0) {
|
|
if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x);
|
|
if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y);
|
|
if (x.compareTo(y) >= 0) {
|
|
x.subTo(y, x);
|
|
x.rShiftTo(1, x);
|
|
}
|
|
else {
|
|
y.subTo(x, y);
|
|
y.rShiftTo(1, y);
|
|
}
|
|
}
|
|
if (g > 0) y.lShiftTo(g, y);
|
|
return y;
|
|
}
|
|
|
|
function bnpModInt(n) {
|
|
if (n <= 0) return 0;
|
|
var d = this.DV % n, r = (this.s < 0) ? n - 1 : 0;
|
|
if (this.t > 0)
|
|
if (d === 0) r = this[0] % n;
|
|
else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n;
|
|
return r;
|
|
}
|
|
|
|
function bnModInverse(m) {
|
|
var ac = m.isEven();
|
|
if ((this.isEven() && ac) || m.signum() === 0) return BigInteger.ZERO;
|
|
var u = m.clone(), v = this.clone();
|
|
var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
|
|
while (u.signum() != 0) {
|
|
while (u.isEven()) {
|
|
u.rShiftTo(1, u);
|
|
if (ac) {
|
|
if (!a.isEven() || !b.isEven()) {
|
|
a.addTo(this, a);
|
|
b.subTo(m, b);
|
|
}
|
|
a.rShiftTo(1, a);
|
|
}
|
|
else if (!b.isEven()) b.subTo(m, b);
|
|
b.rShiftTo(1, b);
|
|
}
|
|
while (v.isEven()) {
|
|
v.rShiftTo(1, v);
|
|
if (ac) {
|
|
if (!c.isEven() || !d.isEven()) {
|
|
c.addTo(this, c);
|
|
d.subTo(m, d);
|
|
}
|
|
c.rShiftTo(1, c);
|
|
}
|
|
else if (!d.isEven()) d.subTo(m, d);
|
|
d.rShiftTo(1, d);
|
|
}
|
|
if (u.compareTo(v) >= 0) {
|
|
u.subTo(v, u);
|
|
if (ac) a.subTo(c, a);
|
|
b.subTo(d, b);
|
|
}
|
|
else {
|
|
v.subTo(u, v);
|
|
if (ac) c.subTo(a, c);
|
|
d.subTo(b, d);
|
|
}
|
|
}
|
|
if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
|
|
if (d.compareTo(m) >= 0) return d.subtract(m);
|
|
if (d.signum() < 0) d.addTo(m, d); else return d;
|
|
if (d.signum() < 0) return d.add(m); else return d;
|
|
}
|
|
|
|
var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
|
|
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
|
|
|
|
function bnIsProbablePrime(t) {
|
|
var i, x = this.abs();
|
|
if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
|
|
for (i = 0; i < lowprimes.length; ++i)
|
|
if (x[0] == lowprimes[i]) return true;
|
|
return false;
|
|
}
|
|
if (x.isEven()) return false;
|
|
i = 1;
|
|
while (i < lowprimes.length) {
|
|
var m = lowprimes[i], j = i + 1;
|
|
while (j < lowprimes.length && m < lplim) m *= lowprimes[j++];
|
|
m = x.modInt(m);
|
|
while (i < j) if (m % lowprimes[i++] === 0) return false;
|
|
}
|
|
return x.millerRabin(t);
|
|
}
|
|
|
|
function bnpMillerRabin(t) {
|
|
var n1 = this.subtract(BigInteger.ONE);
|
|
var k = n1.getLowestSetBit();
|
|
if (k <= 0) return false;
|
|
var r = n1.shiftRight(k);
|
|
t = (t + 1) >> 1;
|
|
if (t > lowprimes.length) t = lowprimes.length;
|
|
var a = nbi();
|
|
for (var i = 0; i < t; ++i) {
|
|
a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
|
|
var y = a.modPow(r, this);
|
|
if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
|
|
var j = 1;
|
|
while (j++ < k && y.compareTo(n1) != 0) {
|
|
y = y.modPowInt(2, this);
|
|
if (y.compareTo(BigInteger.ONE) === 0) return false;
|
|
}
|
|
if (y.compareTo(n1) != 0) return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
BigInteger.prototype.copyTo = bnpCopyTo;
|
|
BigInteger.prototype.fromInt = bnpFromInt;
|
|
BigInteger.prototype.fromString = bnpFromString;
|
|
BigInteger.prototype.fromByteArray = bnpFromByteArray;
|
|
BigInteger.prototype.fromBuffer = bnpFromBuffer;
|
|
BigInteger.prototype.clamp = bnpClamp;
|
|
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
|
|
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
|
|
BigInteger.prototype.lShiftTo = bnpLShiftTo;
|
|
BigInteger.prototype.rShiftTo = bnpRShiftTo;
|
|
BigInteger.prototype.subTo = bnpSubTo;
|
|
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
|
|
BigInteger.prototype.squareTo = bnpSquareTo;
|
|
BigInteger.prototype.divRemTo = bnpDivRemTo;
|
|
BigInteger.prototype.invDigit = bnpInvDigit;
|
|
BigInteger.prototype.isEven = bnpIsEven;
|
|
BigInteger.prototype.exp = bnpExp;
|
|
|
|
BigInteger.prototype.chunkSize = bnpChunkSize;
|
|
BigInteger.prototype.toRadix = bnpToRadix;
|
|
BigInteger.prototype.fromRadix = bnpFromRadix;
|
|
BigInteger.prototype.fromNumber = bnpFromNumber;
|
|
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
|
|
BigInteger.prototype.changeBit = bnpChangeBit;
|
|
BigInteger.prototype.addTo = bnpAddTo;
|
|
BigInteger.prototype.dMultiply = bnpDMultiply;
|
|
BigInteger.prototype.dAddOffset = bnpDAddOffset;
|
|
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
|
|
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
|
|
BigInteger.prototype.modInt = bnpModInt;
|
|
BigInteger.prototype.millerRabin = bnpMillerRabin;
|
|
|
|
|
|
BigInteger.prototype.toString = bnToString;
|
|
BigInteger.prototype.negate = bnNegate;
|
|
BigInteger.prototype.abs = bnAbs;
|
|
BigInteger.prototype.compareTo = bnCompareTo;
|
|
BigInteger.prototype.bitLength = bnBitLength;
|
|
BigInteger.prototype.mod = bnMod;
|
|
BigInteger.prototype.modPowInt = bnModPowInt;
|
|
|
|
BigInteger.prototype.clone = bnClone;
|
|
BigInteger.prototype.intValue = bnIntValue;
|
|
BigInteger.prototype.byteValue = bnByteValue;
|
|
BigInteger.prototype.shortValue = bnShortValue;
|
|
BigInteger.prototype.signum = bnSigNum;
|
|
BigInteger.prototype.toByteArray = bnToByteArray;
|
|
BigInteger.prototype.toBuffer = bnToBuffer;
|
|
BigInteger.prototype.equals = bnEquals;
|
|
BigInteger.prototype.min = bnMin;
|
|
BigInteger.prototype.max = bnMax;
|
|
BigInteger.prototype.and = bnAnd;
|
|
BigInteger.prototype.or = bnOr;
|
|
BigInteger.prototype.xor = bnXor;
|
|
BigInteger.prototype.andNot = bnAndNot;
|
|
BigInteger.prototype.not = bnNot;
|
|
BigInteger.prototype.shiftLeft = bnShiftLeft;
|
|
BigInteger.prototype.shiftRight = bnShiftRight;
|
|
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
|
|
BigInteger.prototype.bitCount = bnBitCount;
|
|
BigInteger.prototype.testBit = bnTestBit;
|
|
BigInteger.prototype.setBit = bnSetBit;
|
|
BigInteger.prototype.clearBit = bnClearBit;
|
|
BigInteger.prototype.flipBit = bnFlipBit;
|
|
BigInteger.prototype.add = bnAdd;
|
|
BigInteger.prototype.subtract = bnSubtract;
|
|
BigInteger.prototype.multiply = bnMultiply;
|
|
BigInteger.prototype.divide = bnDivide;
|
|
BigInteger.prototype.remainder = bnRemainder;
|
|
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
|
|
BigInteger.prototype.modPow = bnModPow;
|
|
BigInteger.prototype.modInverse = bnModInverse;
|
|
BigInteger.prototype.pow = bnPow;
|
|
BigInteger.prototype.gcd = bnGCD;
|
|
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
|
|
BigInteger.int2char = int2char;
|
|
|
|
BigInteger.ZERO = nbv(0);
|
|
BigInteger.ONE = nbv(1);
|
|
|
|
BigInteger.prototype.square = bnSquare;
|
|
|
|
|
|
|
|
module.exports = BigInteger;
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../utils":262,"buffer":130,"crypto":128}],257:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
|
|
|
|
var _ = require('../utils')._;
|
|
var crypt = require('crypto');
|
|
var BigInteger = require('./jsbn.js');
|
|
var utils = require('../utils.js');
|
|
var schemes = require('../schemes/schemes.js');
|
|
var encryptEngines = require('../encryptEngines/encryptEngines.js');
|
|
|
|
exports.BigInteger = BigInteger;
|
|
module.exports.Key = (function () {
|
|
|
|
function RSAKey() {
|
|
this.n = null;
|
|
this.e = 0;
|
|
this.d = null;
|
|
this.p = null;
|
|
this.q = null;
|
|
this.dmp1 = null;
|
|
this.dmq1 = null;
|
|
this.coeff = null;
|
|
}
|
|
|
|
RSAKey.prototype.setOptions = function (options) {
|
|
var signingSchemeProvider = schemes[options.signingScheme];
|
|
var encryptionSchemeProvider = schemes[options.encryptionScheme];
|
|
|
|
if (signingSchemeProvider === encryptionSchemeProvider) {
|
|
this.signingScheme = this.encryptionScheme = encryptionSchemeProvider.makeScheme(this, options);
|
|
} else {
|
|
this.encryptionScheme = encryptionSchemeProvider.makeScheme(this, options);
|
|
this.signingScheme = signingSchemeProvider.makeScheme(this, options);
|
|
}
|
|
|
|
this.encryptEngine = encryptEngines.getEngine(this, options);
|
|
};
|
|
|
|
|
|
RSAKey.prototype.generate = function (B, E) {
|
|
var qs = B >> 1;
|
|
this.e = parseInt(E, 16);
|
|
var ee = new BigInteger(E, 16);
|
|
while (true) {
|
|
while (true) {
|
|
this.p = new BigInteger(B - qs, 1);
|
|
if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) === 0 && this.p.isProbablePrime(10))
|
|
break;
|
|
}
|
|
while (true) {
|
|
this.q = new BigInteger(qs, 1);
|
|
if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) === 0 && this.q.isProbablePrime(10))
|
|
break;
|
|
}
|
|
if (this.p.compareTo(this.q) <= 0) {
|
|
var t = this.p;
|
|
this.p = this.q;
|
|
this.q = t;
|
|
}
|
|
var p1 = this.p.subtract(BigInteger.ONE);
|
|
var q1 = this.q.subtract(BigInteger.ONE);
|
|
var phi = p1.multiply(q1);
|
|
if (phi.gcd(ee).compareTo(BigInteger.ONE) === 0) {
|
|
this.n = this.p.multiply(this.q);
|
|
if (this.n.bitLength() < B) {
|
|
continue;
|
|
}
|
|
this.d = ee.modInverse(phi);
|
|
this.dmp1 = this.d.mod(p1);
|
|
this.dmq1 = this.d.mod(q1);
|
|
this.coeff = this.q.modInverse(this.p);
|
|
break;
|
|
}
|
|
}
|
|
this.$$recalculateCache();
|
|
};
|
|
|
|
|
|
RSAKey.prototype.setPrivate = function (N, E, D, P, Q, DP, DQ, C) {
|
|
if (N && E && D && N.length > 0 && (_.isNumber(E) || E.length > 0) && D.length > 0) {
|
|
this.n = new BigInteger(N);
|
|
this.e = _.isNumber(E) ? E : utils.get32IntFromBuffer(E, 0);
|
|
this.d = new BigInteger(D);
|
|
|
|
if (P && Q && DP && DQ && C) {
|
|
this.p = new BigInteger(P);
|
|
this.q = new BigInteger(Q);
|
|
this.dmp1 = new BigInteger(DP);
|
|
this.dmq1 = new BigInteger(DQ);
|
|
this.coeff = new BigInteger(C);
|
|
} else {
|
|
}
|
|
this.$$recalculateCache();
|
|
} else {
|
|
throw Error("Invalid RSA private key");
|
|
}
|
|
};
|
|
|
|
|
|
RSAKey.prototype.setPublic = function (N, E) {
|
|
if (N && E && N.length > 0 && (_.isNumber(E) || E.length > 0)) {
|
|
this.n = new BigInteger(N);
|
|
this.e = _.isNumber(E) ? E : utils.get32IntFromBuffer(E, 0);
|
|
this.$$recalculateCache();
|
|
} else {
|
|
throw Error("Invalid RSA public key");
|
|
}
|
|
};
|
|
|
|
|
|
RSAKey.prototype.$doPrivate = function (x) {
|
|
if (this.p || this.q) {
|
|
return x.modPow(this.d, this.n);
|
|
}
|
|
|
|
var xp = x.mod(this.p).modPow(this.dmp1, this.p);
|
|
var xq = x.mod(this.q).modPow(this.dmq1, this.q);
|
|
|
|
while (xp.compareTo(xq) < 0) {
|
|
xp = xp.add(this.p);
|
|
}
|
|
return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
|
|
};
|
|
|
|
|
|
RSAKey.prototype.$doPublic = function (x) {
|
|
return x.modPowInt(this.e, this.n);
|
|
};
|
|
|
|
|
|
RSAKey.prototype.encrypt = function (buffer, usePrivate) {
|
|
var buffers = [];
|
|
var results = [];
|
|
var bufferSize = buffer.length;
|
|
var buffersCount = Math.ceil(bufferSize / this.maxMessageLength) || 1; // total buffers count for encrypt
|
|
var dividedSize = Math.ceil(bufferSize / buffersCount || 1); // each buffer size
|
|
|
|
if (buffersCount == 1) {
|
|
buffers.push(buffer);
|
|
} else {
|
|
for (var bufNum = 0; bufNum < buffersCount; bufNum++) {
|
|
buffers.push(buffer.slice(bufNum * dividedSize, (bufNum + 1) * dividedSize));
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < buffers.length; i++) {
|
|
results.push(this.encryptEngine.encrypt(buffers[i], usePrivate));
|
|
}
|
|
|
|
return Buffer.concat(results);
|
|
};
|
|
|
|
|
|
RSAKey.prototype.decrypt = function (buffer, usePublic) {
|
|
if (buffer.length % this.encryptedDataLength > 0) {
|
|
throw Error('Incorrect data or key');
|
|
}
|
|
|
|
var result = [];
|
|
var offset = 0;
|
|
var length = 0;
|
|
var buffersCount = buffer.length / this.encryptedDataLength;
|
|
|
|
for (var i = 0; i < buffersCount; i++) {
|
|
offset = i * this.encryptedDataLength;
|
|
length = offset + this.encryptedDataLength;
|
|
result.push(this.encryptEngine.decrypt(buffer.slice(offset, Math.min(length, buffer.length)), usePublic));
|
|
}
|
|
|
|
return Buffer.concat(result);
|
|
};
|
|
|
|
RSAKey.prototype.sign = function (buffer) {
|
|
return this.signingScheme.sign.apply(this.signingScheme, arguments);
|
|
};
|
|
|
|
RSAKey.prototype.verify = function (buffer, signature, signature_encoding) {
|
|
return this.signingScheme.verify.apply(this.signingScheme, arguments);
|
|
};
|
|
|
|
|
|
RSAKey.prototype.isPrivate = function () {
|
|
return this.n && this.e && this.d || false;
|
|
};
|
|
|
|
|
|
RSAKey.prototype.isPublic = function (strict) {
|
|
return this.n && this.e && !(strict && this.d) || false;
|
|
};
|
|
|
|
Object.defineProperty(RSAKey.prototype, 'keySize', {
|
|
get: function () {
|
|
return this.cache.keyBitLength;
|
|
}
|
|
});
|
|
|
|
Object.defineProperty(RSAKey.prototype, 'encryptedDataLength', {
|
|
get: function () {
|
|
return this.cache.keyByteLength;
|
|
}
|
|
});
|
|
|
|
Object.defineProperty(RSAKey.prototype, 'maxMessageLength', {
|
|
get: function () {
|
|
return this.encryptionScheme.maxMessageLength();
|
|
}
|
|
});
|
|
|
|
|
|
RSAKey.prototype.$$recalculateCache = function () {
|
|
this.cache = this.cache || {};
|
|
this.cache.keyBitLength = this.n.bitLength();
|
|
this.cache.keyByteLength = (this.cache.keyBitLength + 6) >> 3;
|
|
};
|
|
|
|
return RSAKey;
|
|
})();
|
|
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../encryptEngines/encryptEngines.js":248,"../schemes/schemes.js":261,"../utils":262,"../utils.js":262,"./jsbn.js":256,"buffer":130,"crypto":128}],258:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
var BigInteger = require('../libs/jsbn');
|
|
var crypt = require('crypto');
|
|
|
|
module.exports = {
|
|
isEncryption: true,
|
|
isSignature: false
|
|
};
|
|
|
|
module.exports.digestLength = {
|
|
md4: 16,
|
|
md5: 16,
|
|
ripemd160: 20,
|
|
rmd160: 20,
|
|
sha: 20,
|
|
sha1: 20,
|
|
sha224: 28,
|
|
sha256: 32,
|
|
sha384: 48,
|
|
sha512: 64
|
|
};
|
|
|
|
var DEFAULT_HASH_FUNCTION = 'sha1';
|
|
|
|
|
|
module.exports.eme_oaep_mgf1 = function (seed, maskLength, hashFunction) {
|
|
hashFunction = hashFunction || DEFAULT_HASH_FUNCTION;
|
|
var hLen = module.exports.digestLength[hashFunction];
|
|
var count = Math.ceil(maskLength / hLen);
|
|
var T = new Buffer(hLen * count);
|
|
var c = new Buffer(4);
|
|
for (var i = 0; i < count; ++i) {
|
|
var hash = crypt.createHash(hashFunction);
|
|
hash.update(seed);
|
|
c.writeUInt32BE(i, 0);
|
|
hash.update(c);
|
|
hash.digest().copy(T, i * hLen);
|
|
}
|
|
return T.slice(0, maskLength);
|
|
};
|
|
|
|
module.exports.makeScheme = function (key, options) {
|
|
function Scheme(key, options) {
|
|
this.key = key;
|
|
this.options = options;
|
|
}
|
|
|
|
Scheme.prototype.maxMessageLength = function () {
|
|
return this.key.encryptedDataLength - 2 * module.exports.digestLength[this.options.encryptionSchemeOptions.hash || DEFAULT_HASH_FUNCTION] - 2;
|
|
};
|
|
|
|
|
|
Scheme.prototype.encPad = function (buffer) {
|
|
var hash = this.options.encryptionSchemeOptions.hash || DEFAULT_HASH_FUNCTION;
|
|
var mgf = this.options.encryptionSchemeOptions.mgf || module.exports.eme_oaep_mgf1;
|
|
var label = this.options.encryptionSchemeOptions.label || new Buffer(0);
|
|
var emLen = this.key.encryptedDataLength;
|
|
|
|
var hLen = module.exports.digestLength[hash];
|
|
|
|
if (buffer.length > emLen - 2 * hLen - 2) {
|
|
throw new Error("Message is too long to encode into an encoded message with a length of " + emLen + " bytes, increase" +
|
|
"emLen to fix this error (minimum value for given parameters and options: " + (emLen - 2 * hLen - 2) + ")");
|
|
}
|
|
|
|
var lHash = crypt.createHash(hash);
|
|
lHash.update(label);
|
|
lHash = lHash.digest();
|
|
|
|
var PS = new Buffer(emLen - buffer.length - 2 * hLen - 1); // Padding "String"
|
|
PS.fill(0); // Fill the buffer with octets of 0
|
|
PS[PS.length - 1] = 1;
|
|
|
|
var DB = Buffer.concat([lHash, PS, buffer]);
|
|
var seed = crypt.randomBytes(hLen);
|
|
|
|
var mask = mgf(seed, DB.length, hash);
|
|
for (var i = 0; i < DB.length; i++) {
|
|
DB[i] ^= mask[i];
|
|
}
|
|
|
|
mask = mgf(DB, hLen, hash);
|
|
for (i = 0; i < seed.length; i++) {
|
|
seed[i] ^= mask[i];
|
|
}
|
|
|
|
var em = new Buffer(1 + seed.length + DB.length);
|
|
em[0] = 0;
|
|
seed.copy(em, 1);
|
|
DB.copy(em, 1 + seed.length);
|
|
|
|
return em;
|
|
};
|
|
|
|
|
|
Scheme.prototype.encUnPad = function (buffer) {
|
|
var hash = this.options.encryptionSchemeOptions.hash || DEFAULT_HASH_FUNCTION;
|
|
var mgf = this.options.encryptionSchemeOptions.mgf || module.exports.eme_oaep_mgf1;
|
|
var label = this.options.encryptionSchemeOptions.label || new Buffer(0);
|
|
|
|
var hLen = module.exports.digestLength[hash];
|
|
|
|
if (buffer.length < 2 * hLen + 2) {
|
|
throw new Error("Error decoding message, the supplied message is not long enough to be a valid OAEP encoded message");
|
|
}
|
|
|
|
var seed = buffer.slice(1, hLen + 1); // seed = maskedSeed
|
|
var DB = buffer.slice(1 + hLen); // DB = maskedDB
|
|
|
|
var mask = mgf(DB, hLen, hash); // seedMask
|
|
for (var i = 0; i < seed.length; i++) {
|
|
seed[i] ^= mask[i];
|
|
}
|
|
|
|
mask = mgf(seed, DB.length, hash); // dbMask
|
|
for (i = 0; i < DB.length; i++) {
|
|
DB[i] ^= mask[i];
|
|
}
|
|
|
|
var lHash = crypt.createHash(hash);
|
|
lHash.update(label);
|
|
lHash = lHash.digest();
|
|
|
|
var lHashEM = DB.slice(0, hLen);
|
|
if (lHashEM.toString("hex") != lHash.toString("hex")) {
|
|
throw new Error("Error decoding message, the lHash calculated from the label provided and the lHash in the encrypted data do not match.");
|
|
}
|
|
|
|
i = hLen;
|
|
while (DB[i++] === 0 && i < DB.length);
|
|
if (DB[i - 1] != 1) {
|
|
throw new Error("Error decoding message, there is no padding message separator byte");
|
|
}
|
|
|
|
return DB.slice(i); // Message
|
|
};
|
|
|
|
return new Scheme(key, options);
|
|
};
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../libs/jsbn":256,"buffer":130,"crypto":128}],259:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
var BigInteger = require('../libs/jsbn');
|
|
var crypt = require('crypto');
|
|
var constants = require('constants');
|
|
var SIGN_INFO_HEAD = {
|
|
md2: new Buffer('3020300c06082a864886f70d020205000410', 'hex'),
|
|
md5: new Buffer('3020300c06082a864886f70d020505000410', 'hex'),
|
|
sha1: new Buffer('3021300906052b0e03021a05000414', 'hex'),
|
|
sha224: new Buffer('302d300d06096086480165030402040500041c', 'hex'),
|
|
sha256: new Buffer('3031300d060960864801650304020105000420', 'hex'),
|
|
sha384: new Buffer('3041300d060960864801650304020205000430', 'hex'),
|
|
sha512: new Buffer('3051300d060960864801650304020305000440', 'hex'),
|
|
ripemd160: new Buffer('3021300906052b2403020105000414', 'hex'),
|
|
rmd160: new Buffer('3021300906052b2403020105000414', 'hex')
|
|
};
|
|
|
|
var SIGN_ALG_TO_HASH_ALIASES = {
|
|
'ripemd160': 'rmd160'
|
|
};
|
|
|
|
var DEFAULT_HASH_FUNCTION = 'sha256';
|
|
|
|
module.exports = {
|
|
isEncryption: true,
|
|
isSignature: true
|
|
};
|
|
|
|
module.exports.makeScheme = function (key, options) {
|
|
function Scheme(key, options) {
|
|
this.key = key;
|
|
this.options = options;
|
|
}
|
|
|
|
Scheme.prototype.maxMessageLength = function () {
|
|
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) {
|
|
return this.key.encryptedDataLength;
|
|
}
|
|
return this.key.encryptedDataLength - 11;
|
|
};
|
|
|
|
|
|
Scheme.prototype.encPad = function (buffer, options) {
|
|
options = options || {};
|
|
var filled;
|
|
if (buffer.length > this.key.maxMessageLength) {
|
|
throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")");
|
|
}
|
|
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) {
|
|
return this.pkcs0pad(buffer);
|
|
}
|
|
|
|
|
|
if (options.type === 1) {
|
|
filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1);
|
|
filled.fill(0xff, 0, filled.length - 1);
|
|
filled[0] = 1;
|
|
filled[filled.length - 1] = 0;
|
|
|
|
return Buffer.concat([filled, buffer]);
|
|
} else {
|
|
|
|
filled = new Buffer(this.key.encryptedDataLength - buffer.length);
|
|
filled[0] = 0;
|
|
filled[1] = 2;
|
|
var rand = crypt.randomBytes(filled.length - 3);
|
|
for (var i = 0; i < rand.length; i++) {
|
|
var r = rand[i];
|
|
while (r === 0) { // non-zero only
|
|
r = crypt.randomBytes(1)[0];
|
|
}
|
|
filled[i + 2] = r;
|
|
}
|
|
filled[filled.length - 1] = 0;
|
|
return Buffer.concat([filled, buffer]);
|
|
}
|
|
};
|
|
|
|
|
|
Scheme.prototype.encUnPad = function (buffer, options) {
|
|
options = options || {};
|
|
var i = 0;
|
|
|
|
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) {
|
|
return this.pkcs0unpad(buffer);
|
|
}
|
|
|
|
if (buffer.length < 4) {
|
|
return null;
|
|
}
|
|
|
|
|
|
if (options.type === 1) {
|
|
if (buffer[0] !== 0 && buffer[1] !== 1) {
|
|
return null;
|
|
}
|
|
i = 3;
|
|
while (buffer[i] !== 0) {
|
|
if (buffer[i] != 0xFF || ++i >= buffer.length) {
|
|
return null;
|
|
}
|
|
}
|
|
} else {
|
|
|
|
if (buffer[0] !== 0 && buffer[1] !== 2) {
|
|
return null;
|
|
}
|
|
i = 3;
|
|
while (buffer[i] !== 0) {
|
|
if (++i >= buffer.length) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
return buffer.slice(i + 1, buffer.length);
|
|
};
|
|
|
|
Scheme.prototype.sign = function (buffer) {
|
|
var hashAlgorithm = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION;
|
|
if (this.options.environment === 'browser') {
|
|
hashAlgorithm = SIGN_ALG_TO_HASH_ALIASES[hashAlgorithm] || hashAlgorithm;
|
|
|
|
var hasher = crypt.createHash(hashAlgorithm);
|
|
hasher.update(buffer);
|
|
var hash = this.pkcs1pad(hasher.digest(), hashAlgorithm);
|
|
var res = this.key.$doPrivate(new BigInteger(hash)).toBuffer(this.key.encryptedDataLength);
|
|
|
|
return res;
|
|
} else {
|
|
var signer = crypt.createSign('RSA-' + hashAlgorithm.toUpperCase());
|
|
signer.update(buffer);
|
|
return signer.sign(this.options.rsaUtils.exportKey('private'));
|
|
}
|
|
};
|
|
|
|
Scheme.prototype.verify = function (buffer, signature, signature_encoding) {
|
|
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) {
|
|
return false;
|
|
}
|
|
var hashAlgorithm = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION;
|
|
if (this.options.environment === 'browser') {
|
|
hashAlgorithm = SIGN_ALG_TO_HASH_ALIASES[hashAlgorithm] || hashAlgorithm;
|
|
|
|
if (signature_encoding) {
|
|
signature = new Buffer(signature, signature_encoding);
|
|
}
|
|
|
|
var hasher = crypt.createHash(hashAlgorithm);
|
|
hasher.update(buffer);
|
|
var hash = this.pkcs1pad(hasher.digest(), hashAlgorithm);
|
|
var m = this.key.$doPublic(new BigInteger(signature));
|
|
|
|
return m.toBuffer().toString('hex') == hash.toString('hex');
|
|
} else {
|
|
var verifier = crypt.createVerify('RSA-' + hashAlgorithm.toUpperCase());
|
|
verifier.update(buffer);
|
|
return verifier.verify(this.options.rsaUtils.exportKey('public'), signature, signature_encoding);
|
|
}
|
|
};
|
|
|
|
|
|
Scheme.prototype.pkcs0pad = function (buffer) {
|
|
var filled = new Buffer(this.key.maxMessageLength - buffer.length);
|
|
filled.fill(0);
|
|
return Buffer.concat([filled, buffer]);
|
|
|
|
return filled;
|
|
};
|
|
|
|
Scheme.prototype.pkcs0unpad = function (buffer) {
|
|
var unPad;
|
|
if (typeof buffer.lastIndexOf == "function") { //patch for old node version
|
|
unPad = buffer.slice(buffer.lastIndexOf('\0') + 1, buffer.length);
|
|
} else {
|
|
unPad = buffer.slice(String.prototype.lastIndexOf.call(buffer, '\0') + 1, buffer.length);
|
|
}
|
|
|
|
return unPad;
|
|
};
|
|
|
|
|
|
Scheme.prototype.pkcs1pad = function (hashBuf, hashAlgorithm) {
|
|
var digest = SIGN_INFO_HEAD[hashAlgorithm];
|
|
if (!digest) {
|
|
throw Error('Unsupported hash algorithm');
|
|
}
|
|
|
|
var data = Buffer.concat([digest, hashBuf]);
|
|
|
|
if (data.length + 10 > this.key.encryptedDataLength) {
|
|
throw Error('Key is too short for signing algorithm (' + hashAlgorithm + ')');
|
|
}
|
|
|
|
var filled = new Buffer(this.key.encryptedDataLength - data.length - 1);
|
|
filled.fill(0xff, 0, filled.length - 1);
|
|
filled[0] = 1;
|
|
filled[filled.length - 1] = 0;
|
|
|
|
var res = Buffer.concat([filled, data]);
|
|
|
|
return res;
|
|
};
|
|
|
|
return new Scheme(key, options);
|
|
};
|
|
|
|
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../libs/jsbn":256,"buffer":130,"constants":132,"crypto":128}],260:[function(require,module,exports){
|
|
(function (Buffer){
|
|
|
|
|
|
var BigInteger = require('../libs/jsbn');
|
|
var crypt = require('crypto');
|
|
|
|
module.exports = {
|
|
isEncryption: false,
|
|
isSignature: true
|
|
};
|
|
|
|
var DEFAULT_HASH_FUNCTION = 'sha1';
|
|
var DEFAULT_SALT_LENGTH = 20;
|
|
|
|
module.exports.makeScheme = function (key, options) {
|
|
var OAEP = require('./schemes').pkcs1_oaep;
|
|
|
|
|
|
function Scheme(key, options) {
|
|
this.key = key;
|
|
this.options = options;
|
|
}
|
|
|
|
Scheme.prototype.sign = function (buffer) {
|
|
var mHash = crypt.createHash(this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION);
|
|
mHash.update(buffer);
|
|
|
|
var encoded = this.emsa_pss_encode(mHash.digest(), this.key.keySize - 1);
|
|
return this.key.$doPrivate(new BigInteger(encoded)).toBuffer(this.key.encryptedDataLength);
|
|
};
|
|
|
|
Scheme.prototype.verify = function (buffer, signature, signature_encoding) {
|
|
if (signature_encoding) {
|
|
signature = new Buffer(signature, signature_encoding);
|
|
}
|
|
signature = new BigInteger(signature);
|
|
|
|
var emLen = Math.ceil((this.key.keySize - 1) / 8);
|
|
var m = this.key.$doPublic(signature).toBuffer(emLen);
|
|
|
|
var mHash = crypt.createHash(this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION);
|
|
mHash.update(buffer);
|
|
|
|
return this.emsa_pss_verify(mHash.digest(), m, this.key.keySize - 1);
|
|
};
|
|
|
|
|
|
Scheme.prototype.emsa_pss_encode = function (mHash, emBits) {
|
|
var hash = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION;
|
|
var mgf = this.options.signingSchemeOptions.mgf || OAEP.eme_oaep_mgf1;
|
|
var sLen = this.options.signingSchemeOptions.saltLength || DEFAULT_SALT_LENGTH;
|
|
|
|
var hLen = OAEP.digestLength[hash];
|
|
var emLen = Math.ceil(emBits / 8);
|
|
|
|
if (emLen < hLen + sLen + 2) {
|
|
throw new Error("Output length passed to emBits(" + emBits + ") is too small for the options " +
|
|
"specified(" + hash + ", " + sLen + "). To fix this issue increase the value of emBits. (minimum size: " +
|
|
(8 * hLen + 8 * sLen + 9) + ")"
|
|
);
|
|
}
|
|
|
|
var salt = crypt.randomBytes(sLen);
|
|
|
|
var Mapostrophe = new Buffer(8 + hLen + sLen);
|
|
Mapostrophe.fill(0, 0, 8);
|
|
mHash.copy(Mapostrophe, 8);
|
|
salt.copy(Mapostrophe, 8 + mHash.length);
|
|
|
|
var H = crypt.createHash(hash);
|
|
H.update(Mapostrophe);
|
|
H = H.digest();
|
|
|
|
var PS = new Buffer(emLen - salt.length - hLen - 2);
|
|
PS.fill(0);
|
|
|
|
var DB = new Buffer(PS.length + 1 + salt.length);
|
|
PS.copy(DB);
|
|
DB[PS.length] = 0x01;
|
|
salt.copy(DB, PS.length + 1);
|
|
|
|
var dbMask = mgf(H, DB.length, hash);
|
|
|
|
var maskedDB = new Buffer(DB.length);
|
|
for (var i = 0; i < dbMask.length; i++) {
|
|
maskedDB[i] = DB[i] ^ dbMask[i];
|
|
}
|
|
|
|
var bits = 8 * emLen - emBits;
|
|
var mask = 255 ^ (255 >> 8 - bits << 8 - bits);
|
|
maskedDB[0] = maskedDB[0] & mask;
|
|
|
|
var EM = new Buffer(maskedDB.length + H.length + 1);
|
|
maskedDB.copy(EM, 0);
|
|
H.copy(EM, maskedDB.length);
|
|
EM[EM.length - 1] = 0xbc;
|
|
|
|
return EM;
|
|
};
|
|
|
|
|
|
Scheme.prototype.emsa_pss_verify = function (mHash, EM, emBits) {
|
|
var hash = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION;
|
|
var mgf = this.options.signingSchemeOptions.mgf || OAEP.eme_oaep_mgf1;
|
|
var sLen = this.options.signingSchemeOptions.saltLength || DEFAULT_SALT_LENGTH;
|
|
|
|
var hLen = OAEP.digestLength[hash];
|
|
var emLen = Math.ceil(emBits / 8);
|
|
|
|
if (emLen < hLen + sLen + 2 || EM[EM.length - 1] != 0xbc) {
|
|
return false;
|
|
}
|
|
|
|
var DB = new Buffer(emLen - hLen - 1);
|
|
EM.copy(DB, 0, 0, emLen - hLen - 1);
|
|
|
|
var mask = 0;
|
|
for (var i = 0, bits = 8 * emLen - emBits; i < bits; i++) {
|
|
mask |= 1 << (7 - i);
|
|
}
|
|
|
|
if ((DB[0] & mask) !== 0) {
|
|
return false;
|
|
}
|
|
|
|
var H = EM.slice(emLen - hLen - 1, emLen - 1);
|
|
var dbMask = mgf(H, DB.length, hash);
|
|
|
|
for (i = 0; i < DB.length; i++) {
|
|
DB[i] ^= dbMask[i];
|
|
}
|
|
|
|
bits = 8 * emLen - emBits;
|
|
mask = 255 ^ (255 >> 8 - bits << 8 - bits);
|
|
DB[0] = DB[0] & mask;
|
|
|
|
for (i = 0; DB[i] === 0 && i < DB.length; i++);
|
|
if (DB[i] != 1) {
|
|
return false;
|
|
}
|
|
|
|
var salt = DB.slice(DB.length - sLen);
|
|
|
|
var Mapostrophe = new Buffer(8 + hLen + sLen);
|
|
Mapostrophe.fill(0, 0, 8);
|
|
mHash.copy(Mapostrophe, 8);
|
|
salt.copy(Mapostrophe, 8 + mHash.length);
|
|
|
|
var Hapostrophe = crypt.createHash(hash);
|
|
Hapostrophe.update(Mapostrophe);
|
|
Hapostrophe = Hapostrophe.digest();
|
|
|
|
return H.toString("hex") === Hapostrophe.toString("hex");
|
|
};
|
|
|
|
return new Scheme(key, options);
|
|
};
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"../libs/jsbn":256,"./schemes":261,"buffer":130,"crypto":128}],261:[function(require,module,exports){
|
|
module.exports = {
|
|
pkcs1: require('./pkcs1'),
|
|
pkcs1_oaep: require('./oaep'),
|
|
pss: require('./pss'),
|
|
|
|
|
|
isEncryption: function (scheme) {
|
|
return module.exports[scheme] && module.exports[scheme].isEncryption;
|
|
},
|
|
|
|
|
|
isSignature: function (scheme) {
|
|
return module.exports[scheme] && module.exports[scheme].isSignature;
|
|
}
|
|
};
|
|
},{"./oaep":258,"./pkcs1":259,"./pss":260}],262:[function(require,module,exports){
|
|
(function (process){
|
|
|
|
|
|
var crypt = require('crypto');
|
|
|
|
|
|
module.exports.linebrk = function (str, maxLen) {
|
|
var res = '';
|
|
var i = 0;
|
|
while (i + maxLen < str.length) {
|
|
res += str.substring(i, i + maxLen) + "\n";
|
|
i += maxLen;
|
|
}
|
|
return res + str.substring(i, str.length);
|
|
};
|
|
|
|
module.exports.detectEnvironment = function () {
|
|
if (process && process.title === 'browser' || (typeof(window) !== 'undefined' && window)) {
|
|
return 'browser';
|
|
}
|
|
|
|
return 'node';
|
|
};
|
|
|
|
|
|
module.exports.get32IntFromBuffer = function (buffer, offset) {
|
|
offset = offset || 0;
|
|
var size = 0;
|
|
if ((size = buffer.length - offset) > 0) {
|
|
if (size >= 4) {
|
|
return buffer.readUInt32BE(offset);
|
|
} else {
|
|
var res = 0;
|
|
for (var i = offset + size, d = 0; i > offset; i--, d += 2) {
|
|
res += buffer[i - 1] * Math.pow(16, d);
|
|
}
|
|
return res;
|
|
}
|
|
} else {
|
|
return NaN;
|
|
}
|
|
};
|
|
|
|
module.exports._ = {
|
|
isObject: function (value) {
|
|
var type = typeof value;
|
|
return !!value && (type == 'object' || type == 'function');
|
|
},
|
|
|
|
isString: function (value) {
|
|
return typeof value == 'string' || value instanceof String;
|
|
},
|
|
|
|
isNumber: function (value) {
|
|
return typeof value == 'number' || !isNaN(parseFloat(value)) && isFinite(value);
|
|
},
|
|
|
|
|
|
omit: function (obj, removeProp) {
|
|
var newObj = {};
|
|
for (var prop in obj) {
|
|
if (!obj.hasOwnProperty(prop) || prop === removeProp) {
|
|
continue;
|
|
}
|
|
newObj[prop] = obj[prop];
|
|
}
|
|
|
|
return newObj;
|
|
}
|
|
};
|
|
}).call(this,require('_process'))
|
|
},{"_process":274,"crypto":128}],263:[function(require,module,exports){
|
|
module.exports={"2.16.840.1.101.3.4.1.1": "aes-128-ecb",
|
|
"2.16.840.1.101.3.4.1.2": "aes-128-cbc",
|
|
"2.16.840.1.101.3.4.1.3": "aes-128-ofb",
|
|
"2.16.840.1.101.3.4.1.4": "aes-128-cfb",
|
|
"2.16.840.1.101.3.4.1.21": "aes-192-ecb",
|
|
"2.16.840.1.101.3.4.1.22": "aes-192-cbc",
|
|
"2.16.840.1.101.3.4.1.23": "aes-192-ofb",
|
|
"2.16.840.1.101.3.4.1.24": "aes-192-cfb",
|
|
"2.16.840.1.101.3.4.1.41": "aes-256-ecb",
|
|
"2.16.840.1.101.3.4.1.42": "aes-256-cbc",
|
|
"2.16.840.1.101.3.4.1.43": "aes-256-ofb",
|
|
"2.16.840.1.101.3.4.1.44": "aes-256-cfb"
|
|
}
|
|
},{}],264:[function(require,module,exports){
|
|
'use strict'
|
|
|
|
var asn1 = require('asn1.js')
|
|
|
|
exports.certificate = require('./certificate')
|
|
|
|
var RSAPrivateKey = asn1.define('RSAPrivateKey', function () {
|
|
this.seq().obj(
|
|
this.key('version').int(),
|
|
this.key('modulus').int(),
|
|
this.key('publicExponent').int(),
|
|
this.key('privateExponent').int(),
|
|
this.key('prime1').int(),
|
|
this.key('prime2').int(),
|
|
this.key('exponent1').int(),
|
|
this.key('exponent2').int(),
|
|
this.key('coefficient').int()
|
|
)
|
|
})
|
|
exports.RSAPrivateKey = RSAPrivateKey
|
|
|
|
var RSAPublicKey = asn1.define('RSAPublicKey', function () {
|
|
this.seq().obj(
|
|
this.key('modulus').int(),
|
|
this.key('publicExponent').int()
|
|
)
|
|
})
|
|
exports.RSAPublicKey = RSAPublicKey
|
|
|
|
var PublicKey = asn1.define('SubjectPublicKeyInfo', function () {
|
|
this.seq().obj(
|
|
this.key('algorithm').use(AlgorithmIdentifier),
|
|
this.key('subjectPublicKey').bitstr()
|
|
)
|
|
})
|
|
exports.PublicKey = PublicKey
|
|
|
|
var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () {
|
|
this.seq().obj(
|
|
this.key('algorithm').objid(),
|
|
this.key('none').null_().optional(),
|
|
this.key('curve').objid().optional(),
|
|
this.key('params').seq().obj(
|
|
this.key('p').int(),
|
|
this.key('q').int(),
|
|
this.key('g').int()
|
|
).optional()
|
|
)
|
|
})
|
|
|
|
var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () {
|
|
this.seq().obj(
|
|
this.key('version').int(),
|
|
this.key('algorithm').use(AlgorithmIdentifier),
|
|
this.key('subjectPrivateKey').octstr()
|
|
)
|
|
})
|
|
exports.PrivateKey = PrivateKeyInfo
|
|
var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () {
|
|
this.seq().obj(
|
|
this.key('algorithm').seq().obj(
|
|
this.key('id').objid(),
|
|
this.key('decrypt').seq().obj(
|
|
this.key('kde').seq().obj(
|
|
this.key('id').objid(),
|
|
this.key('kdeparams').seq().obj(
|
|
this.key('salt').octstr(),
|
|
this.key('iters').int()
|
|
)
|
|
),
|
|
this.key('cipher').seq().obj(
|
|
this.key('algo').objid(),
|
|
this.key('iv').octstr()
|
|
)
|
|
)
|
|
),
|
|
this.key('subjectPrivateKey').octstr()
|
|
)
|
|
})
|
|
|
|
exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo
|
|
|
|
var DSAPrivateKey = asn1.define('DSAPrivateKey', function () {
|
|
this.seq().obj(
|
|
this.key('version').int(),
|
|
this.key('p').int(),
|
|
this.key('q').int(),
|
|
this.key('g').int(),
|
|
this.key('pub_key').int(),
|
|
this.key('priv_key').int()
|
|
)
|
|
})
|
|
exports.DSAPrivateKey = DSAPrivateKey
|
|
|
|
exports.DSAparam = asn1.define('DSAparam', function () {
|
|
this.int()
|
|
})
|
|
|
|
var ECPrivateKey = asn1.define('ECPrivateKey', function () {
|
|
this.seq().obj(
|
|
this.key('version').int(),
|
|
this.key('privateKey').octstr(),
|
|
this.key('parameters').optional().explicit(0).use(ECParameters),
|
|
this.key('publicKey').optional().explicit(1).bitstr()
|
|
)
|
|
})
|
|
exports.ECPrivateKey = ECPrivateKey
|
|
|
|
var ECParameters = asn1.define('ECParameters', function () {
|
|
this.choice({
|
|
namedCurve: this.objid()
|
|
})
|
|
})
|
|
|
|
exports.signature = asn1.define('signature', function () {
|
|
this.seq().obj(
|
|
this.key('r').int(),
|
|
this.key('s').int()
|
|
)
|
|
})
|
|
|
|
},{"./certificate":265,"asn1.js":76}],265:[function(require,module,exports){
|
|
|
|
'use strict'
|
|
|
|
var asn = require('asn1.js')
|
|
|
|
var Time = asn.define('Time', function () {
|
|
this.choice({
|
|
utcTime: this.utctime(),
|
|
generalTime: this.gentime()
|
|
})
|
|
})
|
|
|
|
var AttributeTypeValue = asn.define('AttributeTypeValue', function () {
|
|
this.seq().obj(
|
|
this.key('type').objid(),
|
|
this.key('value').any()
|
|
)
|
|
})
|
|
|
|
var AlgorithmIdentifier = asn.define('AlgorithmIdentifier', function () {
|
|
this.seq().obj(
|
|
this.key('algorithm').objid(),
|
|
this.key('parameters').optional()
|
|
)
|
|
})
|
|
|
|
var SubjectPublicKeyInfo = asn.define('SubjectPublicKeyInfo', function () {
|
|
this.seq().obj(
|
|
this.key('algorithm').use(AlgorithmIdentifier),
|
|
this.key('subjectPublicKey').bitstr()
|
|
)
|
|
})
|
|
|
|
var RelativeDistinguishedName = asn.define('RelativeDistinguishedName', function () {
|
|
this.setof(AttributeTypeValue)
|
|
})
|
|
|
|
var RDNSequence = asn.define('RDNSequence', function () {
|
|
this.seqof(RelativeDistinguishedName)
|
|
})
|
|
|
|
var Name = asn.define('Name', function () {
|
|
this.choice({
|
|
rdnSequence: this.use(RDNSequence)
|
|
})
|
|
})
|
|
|
|
var Validity = asn.define('Validity', function () {
|
|
this.seq().obj(
|
|
this.key('notBefore').use(Time),
|
|
this.key('notAfter').use(Time)
|
|
)
|
|
})
|
|
|
|
var Extension = asn.define('Extension', function () {
|
|
this.seq().obj(
|
|
this.key('extnID').objid(),
|
|
this.key('critical').bool().def(false),
|
|
this.key('extnValue').octstr()
|
|
)
|
|
})
|
|
|
|
var TBSCertificate = asn.define('TBSCertificate', function () {
|
|
this.seq().obj(
|
|
this.key('version').explicit(0).int(),
|
|
this.key('serialNumber').int(),
|
|
this.key('signature').use(AlgorithmIdentifier),
|
|
this.key('issuer').use(Name),
|
|
this.key('validity').use(Validity),
|
|
this.key('subject').use(Name),
|
|
this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo),
|
|
this.key('issuerUniqueID').implicit(1).bitstr().optional(),
|
|
this.key('subjectUniqueID').implicit(2).bitstr().optional(),
|
|
this.key('extensions').explicit(3).seqof(Extension).optional()
|
|
)
|
|
})
|
|
|
|
var X509Certificate = asn.define('X509Certificate', function () {
|
|
this.seq().obj(
|
|
this.key('tbsCertificate').use(TBSCertificate),
|
|
this.key('signatureAlgorithm').use(AlgorithmIdentifier),
|
|
this.key('signatureValue').bitstr()
|
|
)
|
|
})
|
|
|
|
module.exports = X509Certificate
|
|
|
|
},{"asn1.js":76}],266:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var findProc = /Proc-Type: 4,ENCRYPTED\n\r?DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\n\r?\n\r?([0-9A-z\n\r\+\/\=]+)\n\r?/m
|
|
var startRegex = /^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----\n/m
|
|
var fullRegex = /^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----\n\r?([0-9A-z\n\r\+\/\=]+)\n\r?-----END \1-----$/m
|
|
var evp = require('evp_bytestokey')
|
|
var ciphers = require('browserify-aes')
|
|
module.exports = function (okey, password) {
|
|
var key = okey.toString()
|
|
var match = key.match(findProc)
|
|
var decrypted
|
|
if (!match) {
|
|
var match2 = key.match(fullRegex)
|
|
decrypted = new Buffer(match2[2].replace(/\r?\n/g, ''), 'base64')
|
|
} else {
|
|
var suite = 'aes' + match[1]
|
|
var iv = new Buffer(match[2], 'hex')
|
|
var cipherText = new Buffer(match[3].replace(/\r?\n/g, ''), 'base64')
|
|
var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key
|
|
var out = []
|
|
var cipher = ciphers.createDecipheriv(suite, cipherKey, iv)
|
|
out.push(cipher.update(cipherText))
|
|
out.push(cipher.final())
|
|
decrypted = Buffer.concat(out)
|
|
}
|
|
var tag = key.match(startRegex)[1]
|
|
return {
|
|
tag: tag,
|
|
data: decrypted
|
|
}
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"browserify-aes":103,"buffer":130,"evp_bytestokey":173}],267:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var asn1 = require('./asn1')
|
|
var aesid = require('./aesid.json')
|
|
var fixProc = require('./fixProc')
|
|
var ciphers = require('browserify-aes')
|
|
var compat = require('pbkdf2')
|
|
module.exports = parseKeys
|
|
|
|
function parseKeys (buffer) {
|
|
var password
|
|
if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) {
|
|
password = buffer.passphrase
|
|
buffer = buffer.key
|
|
}
|
|
if (typeof buffer === 'string') {
|
|
buffer = new Buffer(buffer)
|
|
}
|
|
|
|
var stripped = fixProc(buffer, password)
|
|
|
|
var type = stripped.tag
|
|
var data = stripped.data
|
|
var subtype, ndata
|
|
switch (type) {
|
|
case 'CERTIFICATE':
|
|
ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo
|
|
case 'PUBLIC KEY':
|
|
if (!ndata) {
|
|
ndata = asn1.PublicKey.decode(data, 'der')
|
|
}
|
|
subtype = ndata.algorithm.algorithm.join('.')
|
|
switch (subtype) {
|
|
case '1.2.840.113549.1.1.1':
|
|
return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der')
|
|
case '1.2.840.10045.2.1':
|
|
ndata.subjectPrivateKey = ndata.subjectPublicKey
|
|
return {
|
|
type: 'ec',
|
|
data: ndata
|
|
}
|
|
case '1.2.840.10040.4.1':
|
|
ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der')
|
|
return {
|
|
type: 'dsa',
|
|
data: ndata.algorithm.params
|
|
}
|
|
default: throw new Error('unknown key id ' + subtype)
|
|
}
|
|
throw new Error('unknown key type ' + type)
|
|
case 'ENCRYPTED PRIVATE KEY':
|
|
data = asn1.EncryptedPrivateKey.decode(data, 'der')
|
|
data = decrypt(data, password)
|
|
case 'PRIVATE KEY':
|
|
ndata = asn1.PrivateKey.decode(data, 'der')
|
|
subtype = ndata.algorithm.algorithm.join('.')
|
|
switch (subtype) {
|
|
case '1.2.840.113549.1.1.1':
|
|
return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der')
|
|
case '1.2.840.10045.2.1':
|
|
return {
|
|
curve: ndata.algorithm.curve,
|
|
privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey
|
|
}
|
|
case '1.2.840.10040.4.1':
|
|
ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der')
|
|
return {
|
|
type: 'dsa',
|
|
params: ndata.algorithm.params
|
|
}
|
|
default: throw new Error('unknown key id ' + subtype)
|
|
}
|
|
throw new Error('unknown key type ' + type)
|
|
case 'RSA PUBLIC KEY':
|
|
return asn1.RSAPublicKey.decode(data, 'der')
|
|
case 'RSA PRIVATE KEY':
|
|
return asn1.RSAPrivateKey.decode(data, 'der')
|
|
case 'DSA PRIVATE KEY':
|
|
return {
|
|
type: 'dsa',
|
|
params: asn1.DSAPrivateKey.decode(data, 'der')
|
|
}
|
|
case 'EC PRIVATE KEY':
|
|
data = asn1.ECPrivateKey.decode(data, 'der')
|
|
return {
|
|
curve: data.parameters.value,
|
|
privateKey: data.privateKey
|
|
}
|
|
default: throw new Error('unknown key type ' + type)
|
|
}
|
|
}
|
|
parseKeys.signature = asn1.signature
|
|
function decrypt (data, password) {
|
|
var salt = data.algorithm.decrypt.kde.kdeparams.salt
|
|
var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10)
|
|
var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')]
|
|
var iv = data.algorithm.decrypt.cipher.iv
|
|
var cipherText = data.subjectPrivateKey
|
|
var keylen = parseInt(algo.split('-')[1], 10) / 8
|
|
var key = compat.pbkdf2Sync(password, salt, iters, keylen)
|
|
var cipher = ciphers.createDecipheriv(algo, key, iv)
|
|
var out = []
|
|
out.push(cipher.update(cipherText))
|
|
out.push(cipher.final())
|
|
return Buffer.concat(out)
|
|
}
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./aesid.json":263,"./asn1":264,"./fixProc":266,"browserify-aes":103,"buffer":130,"pbkdf2":268}],268:[function(require,module,exports){
|
|
|
|
exports.pbkdf2 = require('./lib/async')
|
|
|
|
exports.pbkdf2Sync = require('./lib/sync')
|
|
|
|
},{"./lib/async":269,"./lib/sync":272}],269:[function(require,module,exports){
|
|
(function (process,global){
|
|
var checkParameters = require('./precondition')
|
|
var defaultEncoding = require('./default-encoding')
|
|
var sync = require('./sync')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var ZERO_BUF
|
|
var subtle = global.crypto && global.crypto.subtle
|
|
var toBrowser = {
|
|
'sha': 'SHA-1',
|
|
'sha-1': 'SHA-1',
|
|
'sha1': 'SHA-1',
|
|
'sha256': 'SHA-256',
|
|
'sha-256': 'SHA-256',
|
|
'sha384': 'SHA-384',
|
|
'sha-384': 'SHA-384',
|
|
'sha-512': 'SHA-512',
|
|
'sha512': 'SHA-512'
|
|
}
|
|
var checks = []
|
|
function checkNative (algo) {
|
|
if (global.process && !global.process.browser) {
|
|
return Promise.resolve(false)
|
|
}
|
|
if (!subtle || !subtle.importKey || !subtle.deriveBits) {
|
|
return Promise.resolve(false)
|
|
}
|
|
if (checks[algo] !== undefined) {
|
|
return checks[algo]
|
|
}
|
|
ZERO_BUF = ZERO_BUF || Buffer.alloc(8)
|
|
var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo)
|
|
.then(function () {
|
|
return true
|
|
}).catch(function () {
|
|
return false
|
|
})
|
|
checks[algo] = prom
|
|
return prom
|
|
}
|
|
function browserPbkdf2 (password, salt, iterations, length, algo) {
|
|
return subtle.importKey(
|
|
'raw', password, {name: 'PBKDF2'}, false, ['deriveBits']
|
|
).then(function (key) {
|
|
return subtle.deriveBits({
|
|
name: 'PBKDF2',
|
|
salt: salt,
|
|
iterations: iterations,
|
|
hash: {
|
|
name: algo
|
|
}
|
|
}, key, length << 3)
|
|
}).then(function (res) {
|
|
return Buffer.from(res)
|
|
})
|
|
}
|
|
function resolvePromise (promise, callback) {
|
|
promise.then(function (out) {
|
|
process.nextTick(function () {
|
|
callback(null, out)
|
|
})
|
|
}, function (e) {
|
|
process.nextTick(function () {
|
|
callback(e)
|
|
})
|
|
})
|
|
}
|
|
module.exports = function (password, salt, iterations, keylen, digest, callback) {
|
|
if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding)
|
|
if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding)
|
|
|
|
checkParameters(iterations, keylen)
|
|
if (typeof digest === 'function') {
|
|
callback = digest
|
|
digest = undefined
|
|
}
|
|
if (typeof callback !== 'function') throw new Error('No callback provided to pbkdf2')
|
|
|
|
digest = digest || 'sha1'
|
|
var algo = toBrowser[digest.toLowerCase()]
|
|
if (!algo || typeof global.Promise !== 'function') {
|
|
return process.nextTick(function () {
|
|
var out
|
|
try {
|
|
out = sync(password, salt, iterations, keylen, digest)
|
|
} catch (e) {
|
|
return callback(e)
|
|
}
|
|
callback(null, out)
|
|
})
|
|
}
|
|
resolvePromise(checkNative(algo).then(function (resp) {
|
|
if (resp) {
|
|
return browserPbkdf2(password, salt, iterations, keylen, algo)
|
|
} else {
|
|
return sync(password, salt, iterations, keylen, digest)
|
|
}
|
|
}), callback)
|
|
}
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"./default-encoding":270,"./precondition":271,"./sync":272,"_process":274,"safe-buffer":305}],270:[function(require,module,exports){
|
|
(function (process){
|
|
var defaultEncoding
|
|
|
|
if (process.browser) {
|
|
defaultEncoding = 'utf-8'
|
|
} else {
|
|
var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10)
|
|
|
|
defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary'
|
|
}
|
|
module.exports = defaultEncoding
|
|
|
|
}).call(this,require('_process'))
|
|
},{"_process":274}],271:[function(require,module,exports){
|
|
var MAX_ALLOC = Math.pow(2, 30) - 1 // default in iojs
|
|
module.exports = function (iterations, keylen) {
|
|
if (typeof iterations !== 'number') {
|
|
throw new TypeError('Iterations not a number')
|
|
}
|
|
|
|
if (iterations < 0) {
|
|
throw new TypeError('Bad iterations')
|
|
}
|
|
|
|
if (typeof keylen !== 'number') {
|
|
throw new TypeError('Key length not a number')
|
|
}
|
|
|
|
if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { /* eslint no-self-compare: 0 */
|
|
throw new TypeError('Bad key length')
|
|
}
|
|
}
|
|
|
|
},{}],272:[function(require,module,exports){
|
|
var md5 = require('create-hash/md5')
|
|
var rmd160 = require('ripemd160')
|
|
var sha = require('sha.js')
|
|
|
|
var checkParameters = require('./precondition')
|
|
var defaultEncoding = require('./default-encoding')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var ZEROS = Buffer.alloc(128)
|
|
var sizes = {
|
|
md5: 16,
|
|
sha1: 20,
|
|
sha224: 28,
|
|
sha256: 32,
|
|
sha384: 48,
|
|
sha512: 64,
|
|
rmd160: 20,
|
|
ripemd160: 20
|
|
}
|
|
|
|
function Hmac (alg, key, saltLen) {
|
|
var hash = getDigest(alg)
|
|
var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64
|
|
|
|
if (key.length > blocksize) {
|
|
key = hash(key)
|
|
} else if (key.length < blocksize) {
|
|
key = Buffer.concat([key, ZEROS], blocksize)
|
|
}
|
|
|
|
var ipad = Buffer.allocUnsafe(blocksize + sizes[alg])
|
|
var opad = Buffer.allocUnsafe(blocksize + sizes[alg])
|
|
for (var i = 0; i < blocksize; i++) {
|
|
ipad[i] = key[i] ^ 0x36
|
|
opad[i] = key[i] ^ 0x5C
|
|
}
|
|
|
|
var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4)
|
|
ipad.copy(ipad1, 0, 0, blocksize)
|
|
this.ipad1 = ipad1
|
|
this.ipad2 = ipad
|
|
this.opad = opad
|
|
this.alg = alg
|
|
this.blocksize = blocksize
|
|
this.hash = hash
|
|
this.size = sizes[alg]
|
|
}
|
|
|
|
Hmac.prototype.run = function (data, ipad) {
|
|
data.copy(ipad, this.blocksize)
|
|
var h = this.hash(ipad)
|
|
h.copy(this.opad, this.blocksize)
|
|
return this.hash(this.opad)
|
|
}
|
|
|
|
function getDigest (alg) {
|
|
function shaFunc (data) {
|
|
return sha(alg).update(data).digest()
|
|
}
|
|
|
|
if (alg === 'rmd160' || alg === 'ripemd160') return rmd160
|
|
if (alg === 'md5') return md5
|
|
return shaFunc
|
|
}
|
|
|
|
function pbkdf2 (password, salt, iterations, keylen, digest) {
|
|
if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding)
|
|
if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding)
|
|
|
|
checkParameters(iterations, keylen)
|
|
|
|
digest = digest || 'sha1'
|
|
|
|
var hmac = new Hmac(digest, password, salt.length)
|
|
|
|
var DK = Buffer.allocUnsafe(keylen)
|
|
var block1 = Buffer.allocUnsafe(salt.length + 4)
|
|
salt.copy(block1, 0, 0, salt.length)
|
|
|
|
var destPos = 0
|
|
var hLen = sizes[digest]
|
|
var l = Math.ceil(keylen / hLen)
|
|
|
|
for (var i = 1; i <= l; i++) {
|
|
block1.writeUInt32BE(i, salt.length)
|
|
|
|
var T = hmac.run(block1, hmac.ipad1)
|
|
var U = T
|
|
|
|
for (var j = 1; j < iterations; j++) {
|
|
U = hmac.run(U, hmac.ipad2)
|
|
for (var k = 0; k < hLen; k++) T[k] ^= U[k]
|
|
}
|
|
|
|
T.copy(DK, destPos)
|
|
destPos += hLen
|
|
}
|
|
|
|
return DK
|
|
}
|
|
|
|
module.exports = pbkdf2
|
|
|
|
},{"./default-encoding":270,"./precondition":271,"create-hash/md5":137,"ripemd160":304,"safe-buffer":305,"sha.js":307}],273:[function(require,module,exports){
|
|
(function (process){
|
|
'use strict';
|
|
|
|
if (!process.version ||
|
|
process.version.indexOf('v0.') === 0 ||
|
|
process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
|
|
module.exports = nextTick;
|
|
} else {
|
|
module.exports = process.nextTick;
|
|
}
|
|
|
|
function nextTick(fn, arg1, arg2, arg3) {
|
|
if (typeof fn !== 'function') {
|
|
throw new TypeError('"callback" argument must be a function');
|
|
}
|
|
var len = arguments.length;
|
|
var args, i;
|
|
switch (len) {
|
|
case 0:
|
|
case 1:
|
|
return process.nextTick(fn);
|
|
case 2:
|
|
return process.nextTick(function afterTickOne() {
|
|
fn.call(null, arg1);
|
|
});
|
|
case 3:
|
|
return process.nextTick(function afterTickTwo() {
|
|
fn.call(null, arg1, arg2);
|
|
});
|
|
case 4:
|
|
return process.nextTick(function afterTickThree() {
|
|
fn.call(null, arg1, arg2, arg3);
|
|
});
|
|
default:
|
|
args = new Array(len - 1);
|
|
i = 0;
|
|
while (i < args.length) {
|
|
args[i++] = arguments[i];
|
|
}
|
|
return process.nextTick(function afterTick() {
|
|
fn.apply(null, args);
|
|
});
|
|
}
|
|
}
|
|
|
|
}).call(this,require('_process'))
|
|
},{"_process":274}],274:[function(require,module,exports){
|
|
var process = module.exports = {};
|
|
|
|
|
|
var cachedSetTimeout;
|
|
var cachedClearTimeout;
|
|
|
|
function defaultSetTimout() {
|
|
throw new Error('setTimeout has not been defined');
|
|
}
|
|
function defaultClearTimeout () {
|
|
throw new Error('clearTimeout has not been defined');
|
|
}
|
|
(function () {
|
|
try {
|
|
if (typeof setTimeout === 'function') {
|
|
cachedSetTimeout = setTimeout;
|
|
} else {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
} catch (e) {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
try {
|
|
if (typeof clearTimeout === 'function') {
|
|
cachedClearTimeout = clearTimeout;
|
|
} else {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} catch (e) {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} ())
|
|
function runTimeout(fun) {
|
|
if (cachedSetTimeout === setTimeout) {
|
|
return setTimeout(fun, 0);
|
|
}
|
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
cachedSetTimeout = setTimeout;
|
|
return setTimeout(fun, 0);
|
|
}
|
|
try {
|
|
return cachedSetTimeout(fun, 0);
|
|
} catch(e){
|
|
try {
|
|
return cachedSetTimeout.call(null, fun, 0);
|
|
} catch(e){
|
|
return cachedSetTimeout.call(this, fun, 0);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
function runClearTimeout(marker) {
|
|
if (cachedClearTimeout === clearTimeout) {
|
|
return clearTimeout(marker);
|
|
}
|
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
cachedClearTimeout = clearTimeout;
|
|
return clearTimeout(marker);
|
|
}
|
|
try {
|
|
return cachedClearTimeout(marker);
|
|
} catch (e){
|
|
try {
|
|
return cachedClearTimeout.call(null, marker);
|
|
} catch (e){
|
|
return cachedClearTimeout.call(this, marker);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
var queue = [];
|
|
var draining = false;
|
|
var currentQueue;
|
|
var queueIndex = -1;
|
|
|
|
function cleanUpNextTick() {
|
|
if (!draining || !currentQueue) {
|
|
return;
|
|
}
|
|
draining = false;
|
|
if (currentQueue.length) {
|
|
queue = currentQueue.concat(queue);
|
|
} else {
|
|
queueIndex = -1;
|
|
}
|
|
if (queue.length) {
|
|
drainQueue();
|
|
}
|
|
}
|
|
|
|
function drainQueue() {
|
|
if (draining) {
|
|
return;
|
|
}
|
|
var timeout = runTimeout(cleanUpNextTick);
|
|
draining = true;
|
|
|
|
var len = queue.length;
|
|
while(len) {
|
|
currentQueue = queue;
|
|
queue = [];
|
|
while (++queueIndex < len) {
|
|
if (currentQueue) {
|
|
currentQueue[queueIndex].run();
|
|
}
|
|
}
|
|
queueIndex = -1;
|
|
len = queue.length;
|
|
}
|
|
currentQueue = null;
|
|
draining = false;
|
|
runClearTimeout(timeout);
|
|
}
|
|
|
|
process.nextTick = function (fun) {
|
|
var args = new Array(arguments.length - 1);
|
|
if (arguments.length > 1) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
args[i - 1] = arguments[i];
|
|
}
|
|
}
|
|
queue.push(new Item(fun, args));
|
|
if (queue.length === 1 && !draining) {
|
|
runTimeout(drainQueue);
|
|
}
|
|
};
|
|
|
|
function Item(fun, array) {
|
|
this.fun = fun;
|
|
this.array = array;
|
|
}
|
|
Item.prototype.run = function () {
|
|
this.fun.apply(null, this.array);
|
|
};
|
|
process.title = 'browser';
|
|
process.browser = true;
|
|
process.env = {};
|
|
process.argv = [];
|
|
process.version = ''; // empty string to avoid regexp issues
|
|
process.versions = {};
|
|
|
|
function noop() {}
|
|
|
|
process.on = noop;
|
|
process.addListener = noop;
|
|
process.once = noop;
|
|
process.off = noop;
|
|
process.removeListener = noop;
|
|
process.removeAllListeners = noop;
|
|
process.emit = noop;
|
|
process.prependListener = noop;
|
|
process.prependOnceListener = noop;
|
|
|
|
process.listeners = function (name) { return [] }
|
|
|
|
process.binding = function (name) {
|
|
throw new Error('process.binding is not supported');
|
|
};
|
|
|
|
process.cwd = function () { return '/' };
|
|
process.chdir = function (dir) {
|
|
throw new Error('process.chdir is not supported');
|
|
};
|
|
process.umask = function() { return 0; };
|
|
|
|
},{}],275:[function(require,module,exports){
|
|
exports.publicEncrypt = require('./publicEncrypt');
|
|
exports.privateDecrypt = require('./privateDecrypt');
|
|
|
|
exports.privateEncrypt = function privateEncrypt(key, buf) {
|
|
return exports.publicEncrypt(key, buf, true);
|
|
};
|
|
|
|
exports.publicDecrypt = function publicDecrypt(key, buf) {
|
|
return exports.privateDecrypt(key, buf, true);
|
|
};
|
|
},{"./privateDecrypt":277,"./publicEncrypt":278}],276:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var createHash = require('create-hash');
|
|
module.exports = function (seed, len) {
|
|
var t = new Buffer('');
|
|
var i = 0, c;
|
|
while (t.length < len) {
|
|
c = i2ops(i++);
|
|
t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()]);
|
|
}
|
|
return t.slice(0, len);
|
|
};
|
|
|
|
function i2ops(c) {
|
|
var out = new Buffer(4);
|
|
out.writeUInt32BE(c,0);
|
|
return out;
|
|
}
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130,"create-hash":135}],277:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var parseKeys = require('parse-asn1');
|
|
var mgf = require('./mgf');
|
|
var xor = require('./xor');
|
|
var bn = require('bn.js');
|
|
var crt = require('browserify-rsa');
|
|
var createHash = require('create-hash');
|
|
var withPublic = require('./withPublic');
|
|
module.exports = function privateDecrypt(private_key, enc, reverse) {
|
|
var padding;
|
|
if (private_key.padding) {
|
|
padding = private_key.padding;
|
|
} else if (reverse) {
|
|
padding = 1;
|
|
} else {
|
|
padding = 4;
|
|
}
|
|
|
|
var key = parseKeys(private_key);
|
|
var k = key.modulus.byteLength();
|
|
if (enc.length > k || new bn(enc).cmp(key.modulus) >= 0) {
|
|
throw new Error('decryption error');
|
|
}
|
|
var msg;
|
|
if (reverse) {
|
|
msg = withPublic(new bn(enc), key);
|
|
} else {
|
|
msg = crt(enc, key);
|
|
}
|
|
var zBuffer = new Buffer(k - msg.length);
|
|
zBuffer.fill(0);
|
|
msg = Buffer.concat([zBuffer, msg], k);
|
|
if (padding === 4) {
|
|
return oaep(key, msg);
|
|
} else if (padding === 1) {
|
|
return pkcs1(key, msg, reverse);
|
|
} else if (padding === 3) {
|
|
return msg;
|
|
} else {
|
|
throw new Error('unknown padding');
|
|
}
|
|
};
|
|
|
|
function oaep(key, msg){
|
|
var n = key.modulus;
|
|
var k = key.modulus.byteLength();
|
|
var mLen = msg.length;
|
|
var iHash = createHash('sha1').update(new Buffer('')).digest();
|
|
var hLen = iHash.length;
|
|
var hLen2 = 2 * hLen;
|
|
if (msg[0] !== 0) {
|
|
throw new Error('decryption error');
|
|
}
|
|
var maskedSeed = msg.slice(1, hLen + 1);
|
|
var maskedDb = msg.slice(hLen + 1);
|
|
var seed = xor(maskedSeed, mgf(maskedDb, hLen));
|
|
var db = xor(maskedDb, mgf(seed, k - hLen - 1));
|
|
if (compare(iHash, db.slice(0, hLen))) {
|
|
throw new Error('decryption error');
|
|
}
|
|
var i = hLen;
|
|
while (db[i] === 0) {
|
|
i++;
|
|
}
|
|
if (db[i++] !== 1) {
|
|
throw new Error('decryption error');
|
|
}
|
|
return db.slice(i);
|
|
}
|
|
|
|
function pkcs1(key, msg, reverse){
|
|
var p1 = msg.slice(0, 2);
|
|
var i = 2;
|
|
var status = 0;
|
|
while (msg[i++] !== 0) {
|
|
if (i >= msg.length) {
|
|
status++;
|
|
break;
|
|
}
|
|
}
|
|
var ps = msg.slice(2, i - 1);
|
|
var p2 = msg.slice(i - 1, i);
|
|
|
|
if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)){
|
|
status++;
|
|
}
|
|
if (ps.length < 8) {
|
|
status++;
|
|
}
|
|
if (status) {
|
|
throw new Error('decryption error');
|
|
}
|
|
return msg.slice(i);
|
|
}
|
|
function compare(a, b){
|
|
a = new Buffer(a);
|
|
b = new Buffer(b);
|
|
var dif = 0;
|
|
var len = a.length;
|
|
if (a.length !== b.length) {
|
|
dif++;
|
|
len = Math.min(a.length, b.length);
|
|
}
|
|
var i = -1;
|
|
while (++i < len) {
|
|
dif += (a[i] ^ b[i]);
|
|
}
|
|
return dif;
|
|
}
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./mgf":276,"./withPublic":279,"./xor":280,"bn.js":98,"browserify-rsa":121,"buffer":130,"create-hash":135,"parse-asn1":267}],278:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var parseKeys = require('parse-asn1');
|
|
var randomBytes = require('randombytes');
|
|
var createHash = require('create-hash');
|
|
var mgf = require('./mgf');
|
|
var xor = require('./xor');
|
|
var bn = require('bn.js');
|
|
var withPublic = require('./withPublic');
|
|
var crt = require('browserify-rsa');
|
|
|
|
var constants = {
|
|
RSA_PKCS1_OAEP_PADDING: 4,
|
|
RSA_PKCS1_PADDIN: 1,
|
|
RSA_NO_PADDING: 3
|
|
};
|
|
|
|
module.exports = function publicEncrypt(public_key, msg, reverse) {
|
|
var padding;
|
|
if (public_key.padding) {
|
|
padding = public_key.padding;
|
|
} else if (reverse) {
|
|
padding = 1;
|
|
} else {
|
|
padding = 4;
|
|
}
|
|
var key = parseKeys(public_key);
|
|
var paddedMsg;
|
|
if (padding === 4) {
|
|
paddedMsg = oaep(key, msg);
|
|
} else if (padding === 1) {
|
|
paddedMsg = pkcs1(key, msg, reverse);
|
|
} else if (padding === 3) {
|
|
paddedMsg = new bn(msg);
|
|
if (paddedMsg.cmp(key.modulus) >= 0) {
|
|
throw new Error('data too long for modulus');
|
|
}
|
|
} else {
|
|
throw new Error('unknown padding');
|
|
}
|
|
if (reverse) {
|
|
return crt(paddedMsg, key);
|
|
} else {
|
|
return withPublic(paddedMsg, key);
|
|
}
|
|
};
|
|
|
|
function oaep(key, msg){
|
|
var k = key.modulus.byteLength();
|
|
var mLen = msg.length;
|
|
var iHash = createHash('sha1').update(new Buffer('')).digest();
|
|
var hLen = iHash.length;
|
|
var hLen2 = 2 * hLen;
|
|
if (mLen > k - hLen2 - 2) {
|
|
throw new Error('message too long');
|
|
}
|
|
var ps = new Buffer(k - mLen - hLen2 - 2);
|
|
ps.fill(0);
|
|
var dblen = k - hLen - 1;
|
|
var seed = randomBytes(hLen);
|
|
var maskedDb = xor(Buffer.concat([iHash, ps, new Buffer([1]), msg], dblen), mgf(seed, dblen));
|
|
var maskedSeed = xor(seed, mgf(maskedDb, hLen));
|
|
return new bn(Buffer.concat([new Buffer([0]), maskedSeed, maskedDb], k));
|
|
}
|
|
function pkcs1(key, msg, reverse){
|
|
var mLen = msg.length;
|
|
var k = key.modulus.byteLength();
|
|
if (mLen > k - 11) {
|
|
throw new Error('message too long');
|
|
}
|
|
var ps;
|
|
if (reverse) {
|
|
ps = new Buffer(k - mLen - 3);
|
|
ps.fill(0xff);
|
|
} else {
|
|
ps = nonZero(k - mLen - 3);
|
|
}
|
|
return new bn(Buffer.concat([new Buffer([0, reverse?1:2]), ps, new Buffer([0]), msg], k));
|
|
}
|
|
function nonZero(len, crypto) {
|
|
var out = new Buffer(len);
|
|
var i = 0;
|
|
var cache = randomBytes(len*2);
|
|
var cur = 0;
|
|
var num;
|
|
while (i < len) {
|
|
if (cur === cache.length) {
|
|
cache = randomBytes(len*2);
|
|
cur = 0;
|
|
}
|
|
num = cache[cur++];
|
|
if (num) {
|
|
out[i++] = num;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"./mgf":276,"./withPublic":279,"./xor":280,"bn.js":98,"browserify-rsa":121,"buffer":130,"create-hash":135,"parse-asn1":267,"randombytes":288}],279:[function(require,module,exports){
|
|
(function (Buffer){
|
|
var bn = require('bn.js');
|
|
function withPublic(paddedMsg, key) {
|
|
return new Buffer(paddedMsg
|
|
.toRed(bn.mont(key.modulus))
|
|
.redPow(new bn(key.publicExponent))
|
|
.fromRed()
|
|
.toArray());
|
|
}
|
|
|
|
module.exports = withPublic;
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"bn.js":98,"buffer":130}],280:[function(require,module,exports){
|
|
module.exports = function xor(a, b) {
|
|
var len = a.length;
|
|
var i = -1;
|
|
while (++i < len) {
|
|
a[i] ^= b[i];
|
|
}
|
|
return a
|
|
};
|
|
},{}],281:[function(require,module,exports){
|
|
(function (global){
|
|
|
|
;(function(root) {
|
|
|
|
|
|
var freeExports = typeof exports == 'object' && exports &&
|
|
!exports.nodeType && exports;
|
|
var freeModule = typeof module == 'object' && module &&
|
|
!module.nodeType && module;
|
|
var freeGlobal = typeof global == 'object' && global;
|
|
if (
|
|
freeGlobal.global === freeGlobal ||
|
|
freeGlobal.window === freeGlobal ||
|
|
freeGlobal.self === freeGlobal
|
|
) {
|
|
root = freeGlobal;
|
|
}
|
|
|
|
|
|
var punycode,
|
|
|
|
|
|
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
|
|
|
|
|
|
base = 36,
|
|
tMin = 1,
|
|
tMax = 26,
|
|
skew = 38,
|
|
damp = 700,
|
|
initialBias = 72,
|
|
initialN = 128, // 0x80
|
|
delimiter = '-', // '\x2D'
|
|
|
|
|
|
regexPunycode = /^xn--/,
|
|
regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
|
|
regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
|
|
|
|
|
|
errors = {
|
|
'overflow': 'Overflow: input needs wider integers to process',
|
|
'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
|
|
'invalid-input': 'Invalid input'
|
|
},
|
|
|
|
|
|
baseMinusTMin = base - tMin,
|
|
floor = Math.floor,
|
|
stringFromCharCode = String.fromCharCode,
|
|
|
|
|
|
key;
|
|
|
|
|
|
|
|
|
|
function error(type) {
|
|
throw RangeError(errors[type]);
|
|
}
|
|
|
|
|
|
function map(array, fn) {
|
|
var length = array.length;
|
|
var result = [];
|
|
while (length--) {
|
|
result[length] = fn(array[length]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
function mapDomain(string, fn) {
|
|
var parts = string.split('@');
|
|
var result = '';
|
|
if (parts.length > 1) {
|
|
result = parts[0] + '@';
|
|
string = parts[1];
|
|
}
|
|
string = string.replace(regexSeparators, '\x2E');
|
|
var labels = string.split('.');
|
|
var encoded = map(labels, fn).join('.');
|
|
return result + encoded;
|
|
}
|
|
|
|
|
|
function ucs2decode(string) {
|
|
var output = [],
|
|
counter = 0,
|
|
length = string.length,
|
|
value,
|
|
extra;
|
|
while (counter < length) {
|
|
value = string.charCodeAt(counter++);
|
|
if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
|
|
extra = string.charCodeAt(counter++);
|
|
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
|
|
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
|
|
} else {
|
|
output.push(value);
|
|
counter--;
|
|
}
|
|
} else {
|
|
output.push(value);
|
|
}
|
|
}
|
|
return output;
|
|
}
|
|
|
|
|
|
function ucs2encode(array) {
|
|
return map(array, function(value) {
|
|
var output = '';
|
|
if (value > 0xFFFF) {
|
|
value -= 0x10000;
|
|
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
|
|
value = 0xDC00 | value & 0x3FF;
|
|
}
|
|
output += stringFromCharCode(value);
|
|
return output;
|
|
}).join('');
|
|
}
|
|
|
|
|
|
function basicToDigit(codePoint) {
|
|
if (codePoint - 48 < 10) {
|
|
return codePoint - 22;
|
|
}
|
|
if (codePoint - 65 < 26) {
|
|
return codePoint - 65;
|
|
}
|
|
if (codePoint - 97 < 26) {
|
|
return codePoint - 97;
|
|
}
|
|
return base;
|
|
}
|
|
|
|
|
|
function digitToBasic(digit, flag) {
|
|
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
|
|
}
|
|
|
|
|
|
function adapt(delta, numPoints, firstTime) {
|
|
var k = 0;
|
|
delta = firstTime ? floor(delta / damp) : delta >> 1;
|
|
delta += floor(delta / numPoints);
|
|
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
|
|
delta = floor(delta / baseMinusTMin);
|
|
}
|
|
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
|
|
}
|
|
|
|
|
|
function decode(input) {
|
|
var output = [],
|
|
inputLength = input.length,
|
|
out,
|
|
i = 0,
|
|
n = initialN,
|
|
bias = initialBias,
|
|
basic,
|
|
j,
|
|
index,
|
|
oldi,
|
|
w,
|
|
k,
|
|
digit,
|
|
t,
|
|
|
|
baseMinusT;
|
|
|
|
|
|
basic = input.lastIndexOf(delimiter);
|
|
if (basic < 0) {
|
|
basic = 0;
|
|
}
|
|
|
|
for (j = 0; j < basic; ++j) {
|
|
if (input.charCodeAt(j) >= 0x80) {
|
|
error('not-basic');
|
|
}
|
|
output.push(input.charCodeAt(j));
|
|
}
|
|
|
|
|
|
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
|
|
|
|
for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
|
|
|
|
if (index >= inputLength) {
|
|
error('invalid-input');
|
|
}
|
|
|
|
digit = basicToDigit(input.charCodeAt(index++));
|
|
|
|
if (digit >= base || digit > floor((maxInt - i) / w)) {
|
|
error('overflow');
|
|
}
|
|
|
|
i += digit * w;
|
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
|
|
|
|
if (digit < t) {
|
|
break;
|
|
}
|
|
|
|
baseMinusT = base - t;
|
|
if (w > floor(maxInt / baseMinusT)) {
|
|
error('overflow');
|
|
}
|
|
|
|
w *= baseMinusT;
|
|
|
|
}
|
|
|
|
out = output.length + 1;
|
|
bias = adapt(i - oldi, out, oldi == 0);
|
|
|
|
if (floor(i / out) > maxInt - n) {
|
|
error('overflow');
|
|
}
|
|
|
|
n += floor(i / out);
|
|
i %= out;
|
|
|
|
output.splice(i++, 0, n);
|
|
|
|
}
|
|
|
|
return ucs2encode(output);
|
|
}
|
|
|
|
|
|
function encode(input) {
|
|
var n,
|
|
delta,
|
|
handledCPCount,
|
|
basicLength,
|
|
bias,
|
|
j,
|
|
m,
|
|
q,
|
|
k,
|
|
t,
|
|
currentValue,
|
|
output = [],
|
|
|
|
inputLength,
|
|
|
|
handledCPCountPlusOne,
|
|
baseMinusT,
|
|
qMinusT;
|
|
|
|
input = ucs2decode(input);
|
|
|
|
inputLength = input.length;
|
|
|
|
n = initialN;
|
|
delta = 0;
|
|
bias = initialBias;
|
|
|
|
for (j = 0; j < inputLength; ++j) {
|
|
currentValue = input[j];
|
|
if (currentValue < 0x80) {
|
|
output.push(stringFromCharCode(currentValue));
|
|
}
|
|
}
|
|
|
|
handledCPCount = basicLength = output.length;
|
|
|
|
|
|
if (basicLength) {
|
|
output.push(delimiter);
|
|
}
|
|
|
|
while (handledCPCount < inputLength) {
|
|
|
|
for (m = maxInt, j = 0; j < inputLength; ++j) {
|
|
currentValue = input[j];
|
|
if (currentValue >= n && currentValue < m) {
|
|
m = currentValue;
|
|
}
|
|
}
|
|
|
|
handledCPCountPlusOne = handledCPCount + 1;
|
|
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
|
|
error('overflow');
|
|
}
|
|
|
|
delta += (m - n) * handledCPCountPlusOne;
|
|
n = m;
|
|
|
|
for (j = 0; j < inputLength; ++j) {
|
|
currentValue = input[j];
|
|
|
|
if (currentValue < n && ++delta > maxInt) {
|
|
error('overflow');
|
|
}
|
|
|
|
if (currentValue == n) {
|
|
for (q = delta, k = base; /* no condition */; k += base) {
|
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
|
|
if (q < t) {
|
|
break;
|
|
}
|
|
qMinusT = q - t;
|
|
baseMinusT = base - t;
|
|
output.push(
|
|
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
|
|
);
|
|
q = floor(qMinusT / baseMinusT);
|
|
}
|
|
|
|
output.push(stringFromCharCode(digitToBasic(q, 0)));
|
|
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
|
|
delta = 0;
|
|
++handledCPCount;
|
|
}
|
|
}
|
|
|
|
++delta;
|
|
++n;
|
|
|
|
}
|
|
return output.join('');
|
|
}
|
|
|
|
|
|
function toUnicode(input) {
|
|
return mapDomain(input, function(string) {
|
|
return regexPunycode.test(string)
|
|
? decode(string.slice(4).toLowerCase())
|
|
: string;
|
|
});
|
|
}
|
|
|
|
|
|
function toASCII(input) {
|
|
return mapDomain(input, function(string) {
|
|
return regexNonASCII.test(string)
|
|
? 'xn--' + encode(string)
|
|
: string;
|
|
});
|
|
}
|
|
|
|
|
|
|
|
|
|
punycode = {
|
|
|
|
'version': '1.3.2',
|
|
|
|
'ucs2': {
|
|
'decode': ucs2decode,
|
|
'encode': ucs2encode
|
|
},
|
|
'decode': decode,
|
|
'encode': encode,
|
|
'toASCII': toASCII,
|
|
'toUnicode': toUnicode
|
|
};
|
|
|
|
|
|
if (
|
|
typeof define == 'function' &&
|
|
typeof define.amd == 'object' &&
|
|
define.amd
|
|
) {
|
|
define('punycode', function() {
|
|
return punycode;
|
|
});
|
|
} else if (freeExports && freeModule) {
|
|
if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+
|
|
freeModule.exports = punycode;
|
|
} else { // in Narwhal or RingoJS v0.7.0-
|
|
for (key in punycode) {
|
|
punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
|
|
}
|
|
}
|
|
} else { // in Rhino or a web browser
|
|
root.punycode = punycode;
|
|
}
|
|
|
|
}(this));
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],282:[function(require,module,exports){
|
|
|
|
'use strict';
|
|
|
|
function hasOwnProperty(obj, prop) {
|
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
}
|
|
|
|
module.exports = function(qs, sep, eq, options) {
|
|
sep = sep || '&';
|
|
eq = eq || '=';
|
|
var obj = {};
|
|
|
|
if (typeof qs !== 'string' || qs.length === 0) {
|
|
return obj;
|
|
}
|
|
|
|
var regexp = /\+/g;
|
|
qs = qs.split(sep);
|
|
|
|
var maxKeys = 1000;
|
|
if (options && typeof options.maxKeys === 'number') {
|
|
maxKeys = options.maxKeys;
|
|
}
|
|
|
|
var len = qs.length;
|
|
if (maxKeys > 0 && len > maxKeys) {
|
|
len = maxKeys;
|
|
}
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
var x = qs[i].replace(regexp, '%20'),
|
|
idx = x.indexOf(eq),
|
|
kstr, vstr, k, v;
|
|
|
|
if (idx >= 0) {
|
|
kstr = x.substr(0, idx);
|
|
vstr = x.substr(idx + 1);
|
|
} else {
|
|
kstr = x;
|
|
vstr = '';
|
|
}
|
|
|
|
k = decodeURIComponent(kstr);
|
|
v = decodeURIComponent(vstr);
|
|
|
|
if (!hasOwnProperty(obj, k)) {
|
|
obj[k] = v;
|
|
} else if (isArray(obj[k])) {
|
|
obj[k].push(v);
|
|
} else {
|
|
obj[k] = [obj[k], v];
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
|
|
var isArray = Array.isArray || function (xs) {
|
|
return Object.prototype.toString.call(xs) === '[object Array]';
|
|
};
|
|
|
|
},{}],283:[function(require,module,exports){
|
|
|
|
'use strict';
|
|
|
|
var stringifyPrimitive = function(v) {
|
|
switch (typeof v) {
|
|
case 'string':
|
|
return v;
|
|
|
|
case 'boolean':
|
|
return v ? 'true' : 'false';
|
|
|
|
case 'number':
|
|
return isFinite(v) ? v : '';
|
|
|
|
default:
|
|
return '';
|
|
}
|
|
};
|
|
|
|
module.exports = function(obj, sep, eq, name) {
|
|
sep = sep || '&';
|
|
eq = eq || '=';
|
|
if (obj === null) {
|
|
obj = undefined;
|
|
}
|
|
|
|
if (typeof obj === 'object') {
|
|
return map(objectKeys(obj), function(k) {
|
|
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
|
|
if (isArray(obj[k])) {
|
|
return map(obj[k], function(v) {
|
|
return ks + encodeURIComponent(stringifyPrimitive(v));
|
|
}).join(sep);
|
|
} else {
|
|
return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
|
|
}
|
|
}).join(sep);
|
|
|
|
}
|
|
|
|
if (!name) return '';
|
|
return encodeURIComponent(stringifyPrimitive(name)) + eq +
|
|
encodeURIComponent(stringifyPrimitive(obj));
|
|
};
|
|
|
|
var isArray = Array.isArray || function (xs) {
|
|
return Object.prototype.toString.call(xs) === '[object Array]';
|
|
};
|
|
|
|
function map (xs, f) {
|
|
if (xs.map) return xs.map(f);
|
|
var res = [];
|
|
for (var i = 0; i < xs.length; i++) {
|
|
res.push(f(xs[i], i));
|
|
}
|
|
return res;
|
|
}
|
|
|
|
var objectKeys = Object.keys || function (obj) {
|
|
var res = [];
|
|
for (var key in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
|
|
}
|
|
return res;
|
|
};
|
|
|
|
},{}],284:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
exports.decode = exports.parse = require('./decode');
|
|
exports.encode = exports.stringify = require('./encode');
|
|
|
|
},{"./decode":282,"./encode":283}],285:[function(require,module,exports){
|
|
|
|
'use strict';
|
|
|
|
function hasOwnProperty(obj, prop) {
|
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
}
|
|
|
|
module.exports = function(qs, sep, eq, options) {
|
|
sep = sep || '&';
|
|
eq = eq || '=';
|
|
var obj = {};
|
|
|
|
if (typeof qs !== 'string' || qs.length === 0) {
|
|
return obj;
|
|
}
|
|
|
|
var regexp = /\+/g;
|
|
qs = qs.split(sep);
|
|
|
|
var maxKeys = 1000;
|
|
if (options && typeof options.maxKeys === 'number') {
|
|
maxKeys = options.maxKeys;
|
|
}
|
|
|
|
var len = qs.length;
|
|
if (maxKeys > 0 && len > maxKeys) {
|
|
len = maxKeys;
|
|
}
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
var x = qs[i].replace(regexp, '%20'),
|
|
idx = x.indexOf(eq),
|
|
kstr, vstr, k, v;
|
|
|
|
if (idx >= 0) {
|
|
kstr = x.substr(0, idx);
|
|
vstr = x.substr(idx + 1);
|
|
} else {
|
|
kstr = x;
|
|
vstr = '';
|
|
}
|
|
|
|
k = decodeURIComponent(kstr);
|
|
v = decodeURIComponent(vstr);
|
|
|
|
if (!hasOwnProperty(obj, k)) {
|
|
obj[k] = v;
|
|
} else if (Array.isArray(obj[k])) {
|
|
obj[k].push(v);
|
|
} else {
|
|
obj[k] = [obj[k], v];
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
};
|
|
|
|
},{}],286:[function(require,module,exports){
|
|
|
|
'use strict';
|
|
|
|
var stringifyPrimitive = function(v) {
|
|
switch (typeof v) {
|
|
case 'string':
|
|
return v;
|
|
|
|
case 'boolean':
|
|
return v ? 'true' : 'false';
|
|
|
|
case 'number':
|
|
return isFinite(v) ? v : '';
|
|
|
|
default:
|
|
return '';
|
|
}
|
|
};
|
|
|
|
module.exports = function(obj, sep, eq, name) {
|
|
sep = sep || '&';
|
|
eq = eq || '=';
|
|
if (obj === null) {
|
|
obj = undefined;
|
|
}
|
|
|
|
if (typeof obj === 'object') {
|
|
return Object.keys(obj).map(function(k) {
|
|
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
|
|
if (Array.isArray(obj[k])) {
|
|
return obj[k].map(function(v) {
|
|
return ks + encodeURIComponent(stringifyPrimitive(v));
|
|
}).join(sep);
|
|
} else {
|
|
return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
|
|
}
|
|
}).join(sep);
|
|
|
|
}
|
|
|
|
if (!name) return '';
|
|
return encodeURIComponent(stringifyPrimitive(name)) + eq +
|
|
encodeURIComponent(stringifyPrimitive(obj));
|
|
};
|
|
|
|
},{}],287:[function(require,module,exports){
|
|
arguments[4][284][0].apply(exports,arguments)
|
|
},{"./decode":285,"./encode":286,"dup":284}],288:[function(require,module,exports){
|
|
(function (process,global){
|
|
'use strict'
|
|
|
|
function oldBrowser () {
|
|
throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11')
|
|
}
|
|
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var crypto = global.crypto || global.msCrypto
|
|
|
|
if (crypto && crypto.getRandomValues) {
|
|
module.exports = randomBytes
|
|
} else {
|
|
module.exports = oldBrowser
|
|
}
|
|
|
|
function randomBytes (size, cb) {
|
|
if (size > 65536) throw new Error('requested too many random bytes')
|
|
var rawBytes = new global.Uint8Array(size)
|
|
|
|
if (size > 0) { // getRandomValues fails on IE if size == 0
|
|
crypto.getRandomValues(rawBytes)
|
|
}
|
|
|
|
var bytes = Buffer.from(rawBytes.buffer)
|
|
|
|
if (typeof cb === 'function') {
|
|
return process.nextTick(function () {
|
|
cb(null, bytes)
|
|
})
|
|
}
|
|
|
|
return bytes
|
|
}
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"_process":274,"safe-buffer":305}],289:[function(require,module,exports){
|
|
(function (process,global){
|
|
'use strict'
|
|
|
|
function oldBrowser () {
|
|
throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11')
|
|
}
|
|
var safeBuffer = require('safe-buffer')
|
|
var randombytes = require('randombytes')
|
|
var Buffer = safeBuffer.Buffer
|
|
var kBufferMaxLength = safeBuffer.kMaxLength
|
|
var crypto = global.crypto || global.msCrypto
|
|
var kMaxUint32 = Math.pow(2, 32) - 1
|
|
function assertOffset (offset, length) {
|
|
if (typeof offset !== 'number' || offset !== offset) { // eslint-disable-line no-self-compare
|
|
throw new TypeError('offset must be a number')
|
|
}
|
|
|
|
if (offset > kMaxUint32 || offset < 0) {
|
|
throw new TypeError('offset must be a uint32')
|
|
}
|
|
|
|
if (offset > kBufferMaxLength || offset > length) {
|
|
throw new RangeError('offset out of range')
|
|
}
|
|
}
|
|
|
|
function assertSize (size, offset, length) {
|
|
if (typeof size !== 'number' || size !== size) { // eslint-disable-line no-self-compare
|
|
throw new TypeError('size must be a number')
|
|
}
|
|
|
|
if (size > kMaxUint32 || size < 0) {
|
|
throw new TypeError('size must be a uint32')
|
|
}
|
|
|
|
if (size + offset > length || size > kBufferMaxLength) {
|
|
throw new RangeError('buffer too small')
|
|
}
|
|
}
|
|
if ((crypto && crypto.getRandomValues) || !process.browser) {
|
|
exports.randomFill = randomFill
|
|
exports.randomFillSync = randomFillSync
|
|
} else {
|
|
exports.randomFill = oldBrowser
|
|
exports.randomFillSync = oldBrowser
|
|
}
|
|
function randomFill (buf, offset, size, cb) {
|
|
if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
|
|
throw new TypeError('"buf" argument must be a Buffer or Uint8Array')
|
|
}
|
|
|
|
if (typeof offset === 'function') {
|
|
cb = offset
|
|
offset = 0
|
|
size = buf.length
|
|
} else if (typeof size === 'function') {
|
|
cb = size
|
|
size = buf.length - offset
|
|
} else if (typeof cb !== 'function') {
|
|
throw new TypeError('"cb" argument must be a function')
|
|
}
|
|
assertOffset(offset, buf.length)
|
|
assertSize(size, offset, buf.length)
|
|
return actualFill(buf, offset, size, cb)
|
|
}
|
|
|
|
function actualFill (buf, offset, size, cb) {
|
|
if (process.browser) {
|
|
var ourBuf = buf.buffer
|
|
var uint = new Uint8Array(ourBuf, offset, size)
|
|
crypto.getRandomValues(uint)
|
|
if (cb) {
|
|
process.nextTick(function () {
|
|
cb(null, buf)
|
|
})
|
|
return
|
|
}
|
|
return buf
|
|
}
|
|
if (cb) {
|
|
randombytes(size, function (err, bytes) {
|
|
if (err) {
|
|
return cb(err)
|
|
}
|
|
bytes.copy(buf, offset)
|
|
cb(null, buf)
|
|
})
|
|
return
|
|
}
|
|
var bytes = randombytes(size)
|
|
bytes.copy(buf, offset)
|
|
return buf
|
|
}
|
|
function randomFillSync (buf, offset, size) {
|
|
if (typeof offset === 'undefined') {
|
|
offset = 0
|
|
}
|
|
if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) {
|
|
throw new TypeError('"buf" argument must be a Buffer or Uint8Array')
|
|
}
|
|
|
|
assertOffset(offset, buf.length)
|
|
|
|
if (size === undefined) size = buf.length - offset
|
|
|
|
assertSize(size, offset, buf.length)
|
|
|
|
return actualFill(buf, offset, size)
|
|
}
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"_process":274,"randombytes":288,"safe-buffer":305}],290:[function(require,module,exports){
|
|
module.exports = require('./lib/_stream_duplex.js');
|
|
|
|
},{"./lib/_stream_duplex.js":291}],291:[function(require,module,exports){
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var processNextTick = require('process-nextick-args');
|
|
|
|
|
|
|
|
var objectKeys = Object.keys || function (obj) {
|
|
var keys = [];
|
|
for (var key in obj) {
|
|
keys.push(key);
|
|
}return keys;
|
|
};
|
|
|
|
|
|
module.exports = Duplex;
|
|
|
|
|
|
var util = require('core-util-is');
|
|
util.inherits = require('inherits');
|
|
|
|
|
|
var Readable = require('./_stream_readable');
|
|
var Writable = require('./_stream_writable');
|
|
|
|
util.inherits(Duplex, Readable);
|
|
|
|
var keys = objectKeys(Writable.prototype);
|
|
for (var v = 0; v < keys.length; v++) {
|
|
var method = keys[v];
|
|
if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
|
|
}
|
|
|
|
function Duplex(options) {
|
|
if (!(this instanceof Duplex)) return new Duplex(options);
|
|
|
|
Readable.call(this, options);
|
|
Writable.call(this, options);
|
|
|
|
if (options && options.readable === false) this.readable = false;
|
|
|
|
if (options && options.writable === false) this.writable = false;
|
|
|
|
this.allowHalfOpen = true;
|
|
if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
|
|
|
|
this.once('end', onend);
|
|
}
|
|
|
|
function onend() {
|
|
if (this.allowHalfOpen || this._writableState.ended) return;
|
|
|
|
processNextTick(onEndNT, this);
|
|
}
|
|
|
|
function onEndNT(self) {
|
|
self.end();
|
|
}
|
|
|
|
Object.defineProperty(Duplex.prototype, 'destroyed', {
|
|
get: function () {
|
|
if (this._readableState === undefined || this._writableState === undefined) {
|
|
return false;
|
|
}
|
|
return this._readableState.destroyed && this._writableState.destroyed;
|
|
},
|
|
set: function (value) {
|
|
if (this._readableState === undefined || this._writableState === undefined) {
|
|
return;
|
|
}
|
|
|
|
this._readableState.destroyed = value;
|
|
this._writableState.destroyed = value;
|
|
}
|
|
});
|
|
|
|
Duplex.prototype._destroy = function (err, cb) {
|
|
this.push(null);
|
|
this.end();
|
|
|
|
processNextTick(cb, err);
|
|
};
|
|
|
|
function forEach(xs, f) {
|
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|
f(xs[i], i);
|
|
}
|
|
}
|
|
},{"./_stream_readable":293,"./_stream_writable":295,"core-util-is":133,"inherits":190,"process-nextick-args":273}],292:[function(require,module,exports){
|
|
|
|
|
|
'use strict';
|
|
|
|
module.exports = PassThrough;
|
|
|
|
var Transform = require('./_stream_transform');
|
|
|
|
|
|
var util = require('core-util-is');
|
|
util.inherits = require('inherits');
|
|
|
|
|
|
util.inherits(PassThrough, Transform);
|
|
|
|
function PassThrough(options) {
|
|
if (!(this instanceof PassThrough)) return new PassThrough(options);
|
|
|
|
Transform.call(this, options);
|
|
}
|
|
|
|
PassThrough.prototype._transform = function (chunk, encoding, cb) {
|
|
cb(null, chunk);
|
|
};
|
|
},{"./_stream_transform":294,"core-util-is":133,"inherits":190}],293:[function(require,module,exports){
|
|
(function (process,global){
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var processNextTick = require('process-nextick-args');
|
|
|
|
|
|
module.exports = Readable;
|
|
|
|
|
|
var isArray = require('isarray');
|
|
|
|
|
|
|
|
var Duplex;
|
|
|
|
|
|
Readable.ReadableState = ReadableState;
|
|
|
|
|
|
var EE = require('events').EventEmitter;
|
|
|
|
var EElistenerCount = function (emitter, type) {
|
|
return emitter.listeners(type).length;
|
|
};
|
|
|
|
|
|
|
|
var Stream = require('./internal/streams/stream');
|
|
|
|
|
|
|
|
var Buffer = require('safe-buffer').Buffer;
|
|
var OurUint8Array = global.Uint8Array || function () {};
|
|
function _uint8ArrayToBuffer(chunk) {
|
|
return Buffer.from(chunk);
|
|
}
|
|
function _isUint8Array(obj) {
|
|
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
|
|
}
|
|
|
|
|
|
|
|
var util = require('core-util-is');
|
|
util.inherits = require('inherits');
|
|
|
|
|
|
|
|
var debugUtil = require('util');
|
|
var debug = void 0;
|
|
if (debugUtil && debugUtil.debuglog) {
|
|
debug = debugUtil.debuglog('stream');
|
|
} else {
|
|
debug = function () {};
|
|
}
|
|
|
|
|
|
var BufferList = require('./internal/streams/BufferList');
|
|
var destroyImpl = require('./internal/streams/destroy');
|
|
var StringDecoder;
|
|
|
|
util.inherits(Readable, Stream);
|
|
|
|
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
|
|
|
|
function prependListener(emitter, event, fn) {
|
|
if (typeof emitter.prependListener === 'function') {
|
|
return emitter.prependListener(event, fn);
|
|
} else {
|
|
if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
|
|
}
|
|
}
|
|
|
|
function ReadableState(options, stream) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
|
|
options = options || {};
|
|
|
|
this.objectMode = !!options.objectMode;
|
|
|
|
if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
|
|
|
|
var hwm = options.highWaterMark;
|
|
var defaultHwm = this.objectMode ? 16 : 16 * 1024;
|
|
this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
|
|
|
|
this.highWaterMark = Math.floor(this.highWaterMark);
|
|
|
|
this.buffer = new BufferList();
|
|
this.length = 0;
|
|
this.pipes = null;
|
|
this.pipesCount = 0;
|
|
this.flowing = null;
|
|
this.ended = false;
|
|
this.endEmitted = false;
|
|
this.reading = false;
|
|
|
|
this.sync = true;
|
|
|
|
this.needReadable = false;
|
|
this.emittedReadable = false;
|
|
this.readableListening = false;
|
|
this.resumeScheduled = false;
|
|
|
|
this.destroyed = false;
|
|
|
|
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
|
|
|
this.awaitDrain = 0;
|
|
|
|
this.readingMore = false;
|
|
|
|
this.decoder = null;
|
|
this.encoding = null;
|
|
if (options.encoding) {
|
|
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
|
|
this.decoder = new StringDecoder(options.encoding);
|
|
this.encoding = options.encoding;
|
|
}
|
|
}
|
|
|
|
function Readable(options) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
|
|
if (!(this instanceof Readable)) return new Readable(options);
|
|
|
|
this._readableState = new ReadableState(options, this);
|
|
|
|
this.readable = true;
|
|
|
|
if (options) {
|
|
if (typeof options.read === 'function') this._read = options.read;
|
|
|
|
if (typeof options.destroy === 'function') this._destroy = options.destroy;
|
|
}
|
|
|
|
Stream.call(this);
|
|
}
|
|
|
|
Object.defineProperty(Readable.prototype, 'destroyed', {
|
|
get: function () {
|
|
if (this._readableState === undefined) {
|
|
return false;
|
|
}
|
|
return this._readableState.destroyed;
|
|
},
|
|
set: function (value) {
|
|
if (!this._readableState) {
|
|
return;
|
|
}
|
|
|
|
this._readableState.destroyed = value;
|
|
}
|
|
});
|
|
|
|
Readable.prototype.destroy = destroyImpl.destroy;
|
|
Readable.prototype._undestroy = destroyImpl.undestroy;
|
|
Readable.prototype._destroy = function (err, cb) {
|
|
this.push(null);
|
|
cb(err);
|
|
};
|
|
|
|
Readable.prototype.push = function (chunk, encoding) {
|
|
var state = this._readableState;
|
|
var skipChunkCheck;
|
|
|
|
if (!state.objectMode) {
|
|
if (typeof chunk === 'string') {
|
|
encoding = encoding || state.defaultEncoding;
|
|
if (encoding !== state.encoding) {
|
|
chunk = Buffer.from(chunk, encoding);
|
|
encoding = '';
|
|
}
|
|
skipChunkCheck = true;
|
|
}
|
|
} else {
|
|
skipChunkCheck = true;
|
|
}
|
|
|
|
return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
|
|
};
|
|
|
|
Readable.prototype.unshift = function (chunk) {
|
|
return readableAddChunk(this, chunk, null, true, false);
|
|
};
|
|
|
|
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
|
|
var state = stream._readableState;
|
|
if (chunk === null) {
|
|
state.reading = false;
|
|
onEofChunk(stream, state);
|
|
} else {
|
|
var er;
|
|
if (!skipChunkCheck) er = chunkInvalid(state, chunk);
|
|
if (er) {
|
|
stream.emit('error', er);
|
|
} else if (state.objectMode || chunk && chunk.length > 0) {
|
|
if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
|
|
chunk = _uint8ArrayToBuffer(chunk);
|
|
}
|
|
|
|
if (addToFront) {
|
|
if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
|
|
} else if (state.ended) {
|
|
stream.emit('error', new Error('stream.push() after EOF'));
|
|
} else {
|
|
state.reading = false;
|
|
if (state.decoder && !encoding) {
|
|
chunk = state.decoder.write(chunk);
|
|
if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
|
|
} else {
|
|
addChunk(stream, state, chunk, false);
|
|
}
|
|
}
|
|
} else if (!addToFront) {
|
|
state.reading = false;
|
|
}
|
|
}
|
|
|
|
return needMoreData(state);
|
|
}
|
|
|
|
function addChunk(stream, state, chunk, addToFront) {
|
|
if (state.flowing && state.length === 0 && !state.sync) {
|
|
stream.emit('data', chunk);
|
|
stream.read(0);
|
|
} else {
|
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
|
|
|
|
if (state.needReadable) emitReadable(stream);
|
|
}
|
|
maybeReadMore(stream, state);
|
|
}
|
|
|
|
function chunkInvalid(state, chunk) {
|
|
var er;
|
|
if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
|
|
er = new TypeError('Invalid non-string/buffer chunk');
|
|
}
|
|
return er;
|
|
}
|
|
|
|
function needMoreData(state) {
|
|
return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
|
|
}
|
|
|
|
Readable.prototype.isPaused = function () {
|
|
return this._readableState.flowing === false;
|
|
};
|
|
|
|
Readable.prototype.setEncoding = function (enc) {
|
|
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
|
|
this._readableState.decoder = new StringDecoder(enc);
|
|
this._readableState.encoding = enc;
|
|
return this;
|
|
};
|
|
|
|
var MAX_HWM = 0x800000;
|
|
function computeNewHighWaterMark(n) {
|
|
if (n >= MAX_HWM) {
|
|
n = MAX_HWM;
|
|
} else {
|
|
n--;
|
|
n |= n >>> 1;
|
|
n |= n >>> 2;
|
|
n |= n >>> 4;
|
|
n |= n >>> 8;
|
|
n |= n >>> 16;
|
|
n++;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
function howMuchToRead(n, state) {
|
|
if (n <= 0 || state.length === 0 && state.ended) return 0;
|
|
if (state.objectMode) return 1;
|
|
if (n !== n) {
|
|
if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
|
|
}
|
|
if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
|
|
if (n <= state.length) return n;
|
|
if (!state.ended) {
|
|
state.needReadable = true;
|
|
return 0;
|
|
}
|
|
return state.length;
|
|
}
|
|
|
|
Readable.prototype.read = function (n) {
|
|
debug('read', n);
|
|
n = parseInt(n, 10);
|
|
var state = this._readableState;
|
|
var nOrig = n;
|
|
|
|
if (n !== 0) state.emittedReadable = false;
|
|
|
|
if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
|
|
debug('read: emitReadable', state.length, state.ended);
|
|
if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
|
|
return null;
|
|
}
|
|
|
|
n = howMuchToRead(n, state);
|
|
|
|
if (n === 0 && state.ended) {
|
|
if (state.length === 0) endReadable(this);
|
|
return null;
|
|
}
|
|
|
|
|
|
var doRead = state.needReadable;
|
|
debug('need readable', doRead);
|
|
|
|
if (state.length === 0 || state.length - n < state.highWaterMark) {
|
|
doRead = true;
|
|
debug('length less than watermark', doRead);
|
|
}
|
|
|
|
if (state.ended || state.reading) {
|
|
doRead = false;
|
|
debug('reading or ended', doRead);
|
|
} else if (doRead) {
|
|
debug('do read');
|
|
state.reading = true;
|
|
state.sync = true;
|
|
if (state.length === 0) state.needReadable = true;
|
|
this._read(state.highWaterMark);
|
|
state.sync = false;
|
|
if (!state.reading) n = howMuchToRead(nOrig, state);
|
|
}
|
|
|
|
var ret;
|
|
if (n > 0) ret = fromList(n, state);else ret = null;
|
|
|
|
if (ret === null) {
|
|
state.needReadable = true;
|
|
n = 0;
|
|
} else {
|
|
state.length -= n;
|
|
}
|
|
|
|
if (state.length === 0) {
|
|
if (!state.ended) state.needReadable = true;
|
|
|
|
if (nOrig !== n && state.ended) endReadable(this);
|
|
}
|
|
|
|
if (ret !== null) this.emit('data', ret);
|
|
|
|
return ret;
|
|
};
|
|
|
|
function onEofChunk(stream, state) {
|
|
if (state.ended) return;
|
|
if (state.decoder) {
|
|
var chunk = state.decoder.end();
|
|
if (chunk && chunk.length) {
|
|
state.buffer.push(chunk);
|
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
}
|
|
}
|
|
state.ended = true;
|
|
|
|
emitReadable(stream);
|
|
}
|
|
|
|
function emitReadable(stream) {
|
|
var state = stream._readableState;
|
|
state.needReadable = false;
|
|
if (!state.emittedReadable) {
|
|
debug('emitReadable', state.flowing);
|
|
state.emittedReadable = true;
|
|
if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
|
|
}
|
|
}
|
|
|
|
function emitReadable_(stream) {
|
|
debug('emit readable');
|
|
stream.emit('readable');
|
|
flow(stream);
|
|
}
|
|
|
|
function maybeReadMore(stream, state) {
|
|
if (!state.readingMore) {
|
|
state.readingMore = true;
|
|
processNextTick(maybeReadMore_, stream, state);
|
|
}
|
|
}
|
|
|
|
function maybeReadMore_(stream, state) {
|
|
var len = state.length;
|
|
while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
|
|
debug('maybeReadMore read 0');
|
|
stream.read(0);
|
|
if (len === state.length)
|
|
break;else len = state.length;
|
|
}
|
|
state.readingMore = false;
|
|
}
|
|
|
|
Readable.prototype._read = function (n) {
|
|
this.emit('error', new Error('_read() is not implemented'));
|
|
};
|
|
|
|
Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
var src = this;
|
|
var state = this._readableState;
|
|
|
|
switch (state.pipesCount) {
|
|
case 0:
|
|
state.pipes = dest;
|
|
break;
|
|
case 1:
|
|
state.pipes = [state.pipes, dest];
|
|
break;
|
|
default:
|
|
state.pipes.push(dest);
|
|
break;
|
|
}
|
|
state.pipesCount += 1;
|
|
debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
|
|
|
|
var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
|
|
|
|
var endFn = doEnd ? onend : unpipe;
|
|
if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
|
|
|
|
dest.on('unpipe', onunpipe);
|
|
function onunpipe(readable, unpipeInfo) {
|
|
debug('onunpipe');
|
|
if (readable === src) {
|
|
if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
|
|
unpipeInfo.hasUnpiped = true;
|
|
cleanup();
|
|
}
|
|
}
|
|
}
|
|
|
|
function onend() {
|
|
debug('onend');
|
|
dest.end();
|
|
}
|
|
|
|
var ondrain = pipeOnDrain(src);
|
|
dest.on('drain', ondrain);
|
|
|
|
var cleanedUp = false;
|
|
function cleanup() {
|
|
debug('cleanup');
|
|
dest.removeListener('close', onclose);
|
|
dest.removeListener('finish', onfinish);
|
|
dest.removeListener('drain', ondrain);
|
|
dest.removeListener('error', onerror);
|
|
dest.removeListener('unpipe', onunpipe);
|
|
src.removeListener('end', onend);
|
|
src.removeListener('end', unpipe);
|
|
src.removeListener('data', ondata);
|
|
|
|
cleanedUp = true;
|
|
|
|
if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
|
|
}
|
|
|
|
var increasedAwaitDrain = false;
|
|
src.on('data', ondata);
|
|
function ondata(chunk) {
|
|
debug('ondata');
|
|
increasedAwaitDrain = false;
|
|
var ret = dest.write(chunk);
|
|
if (false === ret && !increasedAwaitDrain) {
|
|
if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
|
|
debug('false write response, pause', src._readableState.awaitDrain);
|
|
src._readableState.awaitDrain++;
|
|
increasedAwaitDrain = true;
|
|
}
|
|
src.pause();
|
|
}
|
|
}
|
|
|
|
function onerror(er) {
|
|
debug('onerror', er);
|
|
unpipe();
|
|
dest.removeListener('error', onerror);
|
|
if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
|
|
}
|
|
|
|
prependListener(dest, 'error', onerror);
|
|
|
|
function onclose() {
|
|
dest.removeListener('finish', onfinish);
|
|
unpipe();
|
|
}
|
|
dest.once('close', onclose);
|
|
function onfinish() {
|
|
debug('onfinish');
|
|
dest.removeListener('close', onclose);
|
|
unpipe();
|
|
}
|
|
dest.once('finish', onfinish);
|
|
|
|
function unpipe() {
|
|
debug('unpipe');
|
|
src.unpipe(dest);
|
|
}
|
|
|
|
dest.emit('pipe', src);
|
|
|
|
if (!state.flowing) {
|
|
debug('pipe resume');
|
|
src.resume();
|
|
}
|
|
|
|
return dest;
|
|
};
|
|
|
|
function pipeOnDrain(src) {
|
|
return function () {
|
|
var state = src._readableState;
|
|
debug('pipeOnDrain', state.awaitDrain);
|
|
if (state.awaitDrain) state.awaitDrain--;
|
|
if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
|
|
state.flowing = true;
|
|
flow(src);
|
|
}
|
|
};
|
|
}
|
|
|
|
Readable.prototype.unpipe = function (dest) {
|
|
var state = this._readableState;
|
|
var unpipeInfo = { hasUnpiped: false };
|
|
|
|
if (state.pipesCount === 0) return this;
|
|
|
|
if (state.pipesCount === 1) {
|
|
if (dest && dest !== state.pipes) return this;
|
|
|
|
if (!dest) dest = state.pipes;
|
|
|
|
state.pipes = null;
|
|
state.pipesCount = 0;
|
|
state.flowing = false;
|
|
if (dest) dest.emit('unpipe', this, unpipeInfo);
|
|
return this;
|
|
}
|
|
|
|
|
|
if (!dest) {
|
|
var dests = state.pipes;
|
|
var len = state.pipesCount;
|
|
state.pipes = null;
|
|
state.pipesCount = 0;
|
|
state.flowing = false;
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
dests[i].emit('unpipe', this, unpipeInfo);
|
|
}return this;
|
|
}
|
|
|
|
var index = indexOf(state.pipes, dest);
|
|
if (index === -1) return this;
|
|
|
|
state.pipes.splice(index, 1);
|
|
state.pipesCount -= 1;
|
|
if (state.pipesCount === 1) state.pipes = state.pipes[0];
|
|
|
|
dest.emit('unpipe', this, unpipeInfo);
|
|
|
|
return this;
|
|
};
|
|
|
|
Readable.prototype.on = function (ev, fn) {
|
|
var res = Stream.prototype.on.call(this, ev, fn);
|
|
|
|
if (ev === 'data') {
|
|
if (this._readableState.flowing !== false) this.resume();
|
|
} else if (ev === 'readable') {
|
|
var state = this._readableState;
|
|
if (!state.endEmitted && !state.readableListening) {
|
|
state.readableListening = state.needReadable = true;
|
|
state.emittedReadable = false;
|
|
if (!state.reading) {
|
|
processNextTick(nReadingNextTick, this);
|
|
} else if (state.length) {
|
|
emitReadable(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
return res;
|
|
};
|
|
Readable.prototype.addListener = Readable.prototype.on;
|
|
|
|
function nReadingNextTick(self) {
|
|
debug('readable nexttick read 0');
|
|
self.read(0);
|
|
}
|
|
|
|
Readable.prototype.resume = function () {
|
|
var state = this._readableState;
|
|
if (!state.flowing) {
|
|
debug('resume');
|
|
state.flowing = true;
|
|
resume(this, state);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
function resume(stream, state) {
|
|
if (!state.resumeScheduled) {
|
|
state.resumeScheduled = true;
|
|
processNextTick(resume_, stream, state);
|
|
}
|
|
}
|
|
|
|
function resume_(stream, state) {
|
|
if (!state.reading) {
|
|
debug('resume read 0');
|
|
stream.read(0);
|
|
}
|
|
|
|
state.resumeScheduled = false;
|
|
state.awaitDrain = 0;
|
|
stream.emit('resume');
|
|
flow(stream);
|
|
if (state.flowing && !state.reading) stream.read(0);
|
|
}
|
|
|
|
Readable.prototype.pause = function () {
|
|
debug('call pause flowing=%j', this._readableState.flowing);
|
|
if (false !== this._readableState.flowing) {
|
|
debug('pause');
|
|
this._readableState.flowing = false;
|
|
this.emit('pause');
|
|
}
|
|
return this;
|
|
};
|
|
|
|
function flow(stream) {
|
|
var state = stream._readableState;
|
|
debug('flow', state.flowing);
|
|
while (state.flowing && stream.read() !== null) {}
|
|
}
|
|
|
|
Readable.prototype.wrap = function (stream) {
|
|
var state = this._readableState;
|
|
var paused = false;
|
|
|
|
var self = this;
|
|
stream.on('end', function () {
|
|
debug('wrapped end');
|
|
if (state.decoder && !state.ended) {
|
|
var chunk = state.decoder.end();
|
|
if (chunk && chunk.length) self.push(chunk);
|
|
}
|
|
|
|
self.push(null);
|
|
});
|
|
|
|
stream.on('data', function (chunk) {
|
|
debug('wrapped data');
|
|
if (state.decoder) chunk = state.decoder.write(chunk);
|
|
|
|
if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
|
|
|
|
var ret = self.push(chunk);
|
|
if (!ret) {
|
|
paused = true;
|
|
stream.pause();
|
|
}
|
|
});
|
|
|
|
for (var i in stream) {
|
|
if (this[i] === undefined && typeof stream[i] === 'function') {
|
|
this[i] = function (method) {
|
|
return function () {
|
|
return stream[method].apply(stream, arguments);
|
|
};
|
|
}(i);
|
|
}
|
|
}
|
|
|
|
for (var n = 0; n < kProxyEvents.length; n++) {
|
|
stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n]));
|
|
}
|
|
|
|
self._read = function (n) {
|
|
debug('wrapped _read', n);
|
|
if (paused) {
|
|
paused = false;
|
|
stream.resume();
|
|
}
|
|
};
|
|
|
|
return self;
|
|
};
|
|
|
|
Readable._fromList = fromList;
|
|
|
|
function fromList(n, state) {
|
|
if (state.length === 0) return null;
|
|
|
|
var ret;
|
|
if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
|
|
if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
|
|
state.buffer.clear();
|
|
} else {
|
|
ret = fromListPartial(n, state.buffer, state.decoder);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
function fromListPartial(n, list, hasStrings) {
|
|
var ret;
|
|
if (n < list.head.data.length) {
|
|
ret = list.head.data.slice(0, n);
|
|
list.head.data = list.head.data.slice(n);
|
|
} else if (n === list.head.data.length) {
|
|
ret = list.shift();
|
|
} else {
|
|
ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function copyFromBufferString(n, list) {
|
|
var p = list.head;
|
|
var c = 1;
|
|
var ret = p.data;
|
|
n -= ret.length;
|
|
while (p = p.next) {
|
|
var str = p.data;
|
|
var nb = n > str.length ? str.length : n;
|
|
if (nb === str.length) ret += str;else ret += str.slice(0, n);
|
|
n -= nb;
|
|
if (n === 0) {
|
|
if (nb === str.length) {
|
|
++c;
|
|
if (p.next) list.head = p.next;else list.head = list.tail = null;
|
|
} else {
|
|
list.head = p;
|
|
p.data = str.slice(nb);
|
|
}
|
|
break;
|
|
}
|
|
++c;
|
|
}
|
|
list.length -= c;
|
|
return ret;
|
|
}
|
|
|
|
function copyFromBuffer(n, list) {
|
|
var ret = Buffer.allocUnsafe(n);
|
|
var p = list.head;
|
|
var c = 1;
|
|
p.data.copy(ret);
|
|
n -= p.data.length;
|
|
while (p = p.next) {
|
|
var buf = p.data;
|
|
var nb = n > buf.length ? buf.length : n;
|
|
buf.copy(ret, ret.length - n, 0, nb);
|
|
n -= nb;
|
|
if (n === 0) {
|
|
if (nb === buf.length) {
|
|
++c;
|
|
if (p.next) list.head = p.next;else list.head = list.tail = null;
|
|
} else {
|
|
list.head = p;
|
|
p.data = buf.slice(nb);
|
|
}
|
|
break;
|
|
}
|
|
++c;
|
|
}
|
|
list.length -= c;
|
|
return ret;
|
|
}
|
|
|
|
function endReadable(stream) {
|
|
var state = stream._readableState;
|
|
|
|
if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
|
|
|
|
if (!state.endEmitted) {
|
|
state.ended = true;
|
|
processNextTick(endReadableNT, state, stream);
|
|
}
|
|
}
|
|
|
|
function endReadableNT(state, stream) {
|
|
if (!state.endEmitted && state.length === 0) {
|
|
state.endEmitted = true;
|
|
stream.readable = false;
|
|
stream.emit('end');
|
|
}
|
|
}
|
|
|
|
function forEach(xs, f) {
|
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|
f(xs[i], i);
|
|
}
|
|
}
|
|
|
|
function indexOf(xs, x) {
|
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|
if (xs[i] === x) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"./_stream_duplex":291,"./internal/streams/BufferList":296,"./internal/streams/destroy":297,"./internal/streams/stream":298,"_process":274,"core-util-is":133,"events":172,"inherits":190,"isarray":192,"process-nextick-args":273,"safe-buffer":305,"string_decoder/":299,"util":100}],294:[function(require,module,exports){
|
|
|
|
|
|
'use strict';
|
|
|
|
module.exports = Transform;
|
|
|
|
var Duplex = require('./_stream_duplex');
|
|
|
|
|
|
var util = require('core-util-is');
|
|
util.inherits = require('inherits');
|
|
|
|
|
|
util.inherits(Transform, Duplex);
|
|
|
|
function TransformState(stream) {
|
|
this.afterTransform = function (er, data) {
|
|
return afterTransform(stream, er, data);
|
|
};
|
|
|
|
this.needTransform = false;
|
|
this.transforming = false;
|
|
this.writecb = null;
|
|
this.writechunk = null;
|
|
this.writeencoding = null;
|
|
}
|
|
|
|
function afterTransform(stream, er, data) {
|
|
var ts = stream._transformState;
|
|
ts.transforming = false;
|
|
|
|
var cb = ts.writecb;
|
|
|
|
if (!cb) {
|
|
return stream.emit('error', new Error('write callback called multiple times'));
|
|
}
|
|
|
|
ts.writechunk = null;
|
|
ts.writecb = null;
|
|
|
|
if (data !== null && data !== undefined) stream.push(data);
|
|
|
|
cb(er);
|
|
|
|
var rs = stream._readableState;
|
|
rs.reading = false;
|
|
if (rs.needReadable || rs.length < rs.highWaterMark) {
|
|
stream._read(rs.highWaterMark);
|
|
}
|
|
}
|
|
|
|
function Transform(options) {
|
|
if (!(this instanceof Transform)) return new Transform(options);
|
|
|
|
Duplex.call(this, options);
|
|
|
|
this._transformState = new TransformState(this);
|
|
|
|
var stream = this;
|
|
|
|
this._readableState.needReadable = true;
|
|
|
|
this._readableState.sync = false;
|
|
|
|
if (options) {
|
|
if (typeof options.transform === 'function') this._transform = options.transform;
|
|
|
|
if (typeof options.flush === 'function') this._flush = options.flush;
|
|
}
|
|
|
|
this.once('prefinish', function () {
|
|
if (typeof this._flush === 'function') this._flush(function (er, data) {
|
|
done(stream, er, data);
|
|
});else done(stream);
|
|
});
|
|
}
|
|
|
|
Transform.prototype.push = function (chunk, encoding) {
|
|
this._transformState.needTransform = false;
|
|
return Duplex.prototype.push.call(this, chunk, encoding);
|
|
};
|
|
|
|
Transform.prototype._transform = function (chunk, encoding, cb) {
|
|
throw new Error('_transform() is not implemented');
|
|
};
|
|
|
|
Transform.prototype._write = function (chunk, encoding, cb) {
|
|
var ts = this._transformState;
|
|
ts.writecb = cb;
|
|
ts.writechunk = chunk;
|
|
ts.writeencoding = encoding;
|
|
if (!ts.transforming) {
|
|
var rs = this._readableState;
|
|
if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
|
|
}
|
|
};
|
|
|
|
Transform.prototype._read = function (n) {
|
|
var ts = this._transformState;
|
|
|
|
if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
|
|
ts.transforming = true;
|
|
this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
|
|
} else {
|
|
ts.needTransform = true;
|
|
}
|
|
};
|
|
|
|
Transform.prototype._destroy = function (err, cb) {
|
|
var _this = this;
|
|
|
|
Duplex.prototype._destroy.call(this, err, function (err2) {
|
|
cb(err2);
|
|
_this.emit('close');
|
|
});
|
|
};
|
|
|
|
function done(stream, er, data) {
|
|
if (er) return stream.emit('error', er);
|
|
|
|
if (data !== null && data !== undefined) stream.push(data);
|
|
|
|
var ws = stream._writableState;
|
|
var ts = stream._transformState;
|
|
|
|
if (ws.length) throw new Error('Calling transform done when ws.length != 0');
|
|
|
|
if (ts.transforming) throw new Error('Calling transform done when still transforming');
|
|
|
|
return stream.push(null);
|
|
}
|
|
},{"./_stream_duplex":291,"core-util-is":133,"inherits":190}],295:[function(require,module,exports){
|
|
(function (process,global){
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var processNextTick = require('process-nextick-args');
|
|
|
|
|
|
module.exports = Writable;
|
|
|
|
|
|
function WriteReq(chunk, encoding, cb) {
|
|
this.chunk = chunk;
|
|
this.encoding = encoding;
|
|
this.callback = cb;
|
|
this.next = null;
|
|
}
|
|
|
|
function CorkedRequest(state) {
|
|
var _this = this;
|
|
|
|
this.next = null;
|
|
this.entry = null;
|
|
this.finish = function () {
|
|
onCorkedFinish(_this, state);
|
|
};
|
|
}
|
|
|
|
|
|
|
|
var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
|
|
|
|
|
|
|
|
var Duplex;
|
|
|
|
|
|
Writable.WritableState = WritableState;
|
|
|
|
|
|
var util = require('core-util-is');
|
|
util.inherits = require('inherits');
|
|
|
|
|
|
|
|
var internalUtil = {
|
|
deprecate: require('util-deprecate')
|
|
};
|
|
|
|
|
|
|
|
var Stream = require('./internal/streams/stream');
|
|
|
|
|
|
|
|
var Buffer = require('safe-buffer').Buffer;
|
|
var OurUint8Array = global.Uint8Array || function () {};
|
|
function _uint8ArrayToBuffer(chunk) {
|
|
return Buffer.from(chunk);
|
|
}
|
|
function _isUint8Array(obj) {
|
|
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
|
|
}
|
|
|
|
|
|
var destroyImpl = require('./internal/streams/destroy');
|
|
|
|
util.inherits(Writable, Stream);
|
|
|
|
function nop() {}
|
|
|
|
function WritableState(options, stream) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
|
|
options = options || {};
|
|
|
|
this.objectMode = !!options.objectMode;
|
|
|
|
if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
|
|
|
|
var hwm = options.highWaterMark;
|
|
var defaultHwm = this.objectMode ? 16 : 16 * 1024;
|
|
this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
|
|
|
|
this.highWaterMark = Math.floor(this.highWaterMark);
|
|
|
|
this.finalCalled = false;
|
|
|
|
this.needDrain = false;
|
|
this.ending = false;
|
|
this.ended = false;
|
|
this.finished = false;
|
|
|
|
this.destroyed = false;
|
|
|
|
var noDecode = options.decodeStrings === false;
|
|
this.decodeStrings = !noDecode;
|
|
|
|
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
|
|
|
this.length = 0;
|
|
|
|
this.writing = false;
|
|
|
|
this.corked = 0;
|
|
|
|
this.sync = true;
|
|
|
|
this.bufferProcessing = false;
|
|
|
|
this.onwrite = function (er) {
|
|
onwrite(stream, er);
|
|
};
|
|
|
|
this.writecb = null;
|
|
|
|
this.writelen = 0;
|
|
|
|
this.bufferedRequest = null;
|
|
this.lastBufferedRequest = null;
|
|
|
|
this.pendingcb = 0;
|
|
|
|
this.prefinished = false;
|
|
|
|
this.errorEmitted = false;
|
|
|
|
this.bufferedRequestCount = 0;
|
|
|
|
this.corkedRequestsFree = new CorkedRequest(this);
|
|
}
|
|
|
|
WritableState.prototype.getBuffer = function getBuffer() {
|
|
var current = this.bufferedRequest;
|
|
var out = [];
|
|
while (current) {
|
|
out.push(current);
|
|
current = current.next;
|
|
}
|
|
return out;
|
|
};
|
|
|
|
(function () {
|
|
try {
|
|
Object.defineProperty(WritableState.prototype, 'buffer', {
|
|
get: internalUtil.deprecate(function () {
|
|
return this.getBuffer();
|
|
}, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
|
|
});
|
|
} catch (_) {}
|
|
})();
|
|
|
|
var realHasInstance;
|
|
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
|
|
realHasInstance = Function.prototype[Symbol.hasInstance];
|
|
Object.defineProperty(Writable, Symbol.hasInstance, {
|
|
value: function (object) {
|
|
if (realHasInstance.call(this, object)) return true;
|
|
|
|
return object && object._writableState instanceof WritableState;
|
|
}
|
|
});
|
|
} else {
|
|
realHasInstance = function (object) {
|
|
return object instanceof this;
|
|
};
|
|
}
|
|
|
|
function Writable(options) {
|
|
Duplex = Duplex || require('./_stream_duplex');
|
|
|
|
|
|
if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
|
|
return new Writable(options);
|
|
}
|
|
|
|
this._writableState = new WritableState(options, this);
|
|
|
|
this.writable = true;
|
|
|
|
if (options) {
|
|
if (typeof options.write === 'function') this._write = options.write;
|
|
|
|
if (typeof options.writev === 'function') this._writev = options.writev;
|
|
|
|
if (typeof options.destroy === 'function') this._destroy = options.destroy;
|
|
|
|
if (typeof options.final === 'function') this._final = options.final;
|
|
}
|
|
|
|
Stream.call(this);
|
|
}
|
|
|
|
Writable.prototype.pipe = function () {
|
|
this.emit('error', new Error('Cannot pipe, not readable'));
|
|
};
|
|
|
|
function writeAfterEnd(stream, cb) {
|
|
var er = new Error('write after end');
|
|
stream.emit('error', er);
|
|
processNextTick(cb, er);
|
|
}
|
|
|
|
function validChunk(stream, state, chunk, cb) {
|
|
var valid = true;
|
|
var er = false;
|
|
|
|
if (chunk === null) {
|
|
er = new TypeError('May not write null values to stream');
|
|
} else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
|
|
er = new TypeError('Invalid non-string/buffer chunk');
|
|
}
|
|
if (er) {
|
|
stream.emit('error', er);
|
|
processNextTick(cb, er);
|
|
valid = false;
|
|
}
|
|
return valid;
|
|
}
|
|
|
|
Writable.prototype.write = function (chunk, encoding, cb) {
|
|
var state = this._writableState;
|
|
var ret = false;
|
|
var isBuf = _isUint8Array(chunk) && !state.objectMode;
|
|
|
|
if (isBuf && !Buffer.isBuffer(chunk)) {
|
|
chunk = _uint8ArrayToBuffer(chunk);
|
|
}
|
|
|
|
if (typeof encoding === 'function') {
|
|
cb = encoding;
|
|
encoding = null;
|
|
}
|
|
|
|
if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
|
|
|
|
if (typeof cb !== 'function') cb = nop;
|
|
|
|
if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
|
|
state.pendingcb++;
|
|
ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
|
|
}
|
|
|
|
return ret;
|
|
};
|
|
|
|
Writable.prototype.cork = function () {
|
|
var state = this._writableState;
|
|
|
|
state.corked++;
|
|
};
|
|
|
|
Writable.prototype.uncork = function () {
|
|
var state = this._writableState;
|
|
|
|
if (state.corked) {
|
|
state.corked--;
|
|
|
|
if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
|
|
}
|
|
};
|
|
|
|
Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
|
|
if (typeof encoding === 'string') encoding = encoding.toLowerCase();
|
|
if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
|
|
this._writableState.defaultEncoding = encoding;
|
|
return this;
|
|
};
|
|
|
|
function decodeChunk(state, chunk, encoding) {
|
|
if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
|
|
chunk = Buffer.from(chunk, encoding);
|
|
}
|
|
return chunk;
|
|
}
|
|
|
|
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
|
|
if (!isBuf) {
|
|
var newChunk = decodeChunk(state, chunk, encoding);
|
|
if (chunk !== newChunk) {
|
|
isBuf = true;
|
|
encoding = 'buffer';
|
|
chunk = newChunk;
|
|
}
|
|
}
|
|
var len = state.objectMode ? 1 : chunk.length;
|
|
|
|
state.length += len;
|
|
|
|
var ret = state.length < state.highWaterMark;
|
|
if (!ret) state.needDrain = true;
|
|
|
|
if (state.writing || state.corked) {
|
|
var last = state.lastBufferedRequest;
|
|
state.lastBufferedRequest = {
|
|
chunk: chunk,
|
|
encoding: encoding,
|
|
isBuf: isBuf,
|
|
callback: cb,
|
|
next: null
|
|
};
|
|
if (last) {
|
|
last.next = state.lastBufferedRequest;
|
|
} else {
|
|
state.bufferedRequest = state.lastBufferedRequest;
|
|
}
|
|
state.bufferedRequestCount += 1;
|
|
} else {
|
|
doWrite(stream, state, false, len, chunk, encoding, cb);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
function doWrite(stream, state, writev, len, chunk, encoding, cb) {
|
|
state.writelen = len;
|
|
state.writecb = cb;
|
|
state.writing = true;
|
|
state.sync = true;
|
|
if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
|
|
state.sync = false;
|
|
}
|
|
|
|
function onwriteError(stream, state, sync, er, cb) {
|
|
--state.pendingcb;
|
|
|
|
if (sync) {
|
|
processNextTick(cb, er);
|
|
processNextTick(finishMaybe, stream, state);
|
|
stream._writableState.errorEmitted = true;
|
|
stream.emit('error', er);
|
|
} else {
|
|
cb(er);
|
|
stream._writableState.errorEmitted = true;
|
|
stream.emit('error', er);
|
|
finishMaybe(stream, state);
|
|
}
|
|
}
|
|
|
|
function onwriteStateUpdate(state) {
|
|
state.writing = false;
|
|
state.writecb = null;
|
|
state.length -= state.writelen;
|
|
state.writelen = 0;
|
|
}
|
|
|
|
function onwrite(stream, er) {
|
|
var state = stream._writableState;
|
|
var sync = state.sync;
|
|
var cb = state.writecb;
|
|
|
|
onwriteStateUpdate(state);
|
|
|
|
if (er) onwriteError(stream, state, sync, er, cb);else {
|
|
var finished = needFinish(state);
|
|
|
|
if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
|
|
clearBuffer(stream, state);
|
|
}
|
|
|
|
if (sync) {
|
|
|
|
asyncWrite(afterWrite, stream, state, finished, cb);
|
|
|
|
} else {
|
|
afterWrite(stream, state, finished, cb);
|
|
}
|
|
}
|
|
}
|
|
|
|
function afterWrite(stream, state, finished, cb) {
|
|
if (!finished) onwriteDrain(stream, state);
|
|
state.pendingcb--;
|
|
cb();
|
|
finishMaybe(stream, state);
|
|
}
|
|
|
|
function onwriteDrain(stream, state) {
|
|
if (state.length === 0 && state.needDrain) {
|
|
state.needDrain = false;
|
|
stream.emit('drain');
|
|
}
|
|
}
|
|
|
|
function clearBuffer(stream, state) {
|
|
state.bufferProcessing = true;
|
|
var entry = state.bufferedRequest;
|
|
|
|
if (stream._writev && entry && entry.next) {
|
|
var l = state.bufferedRequestCount;
|
|
var buffer = new Array(l);
|
|
var holder = state.corkedRequestsFree;
|
|
holder.entry = entry;
|
|
|
|
var count = 0;
|
|
var allBuffers = true;
|
|
while (entry) {
|
|
buffer[count] = entry;
|
|
if (!entry.isBuf) allBuffers = false;
|
|
entry = entry.next;
|
|
count += 1;
|
|
}
|
|
buffer.allBuffers = allBuffers;
|
|
|
|
doWrite(stream, state, true, state.length, buffer, '', holder.finish);
|
|
|
|
state.pendingcb++;
|
|
state.lastBufferedRequest = null;
|
|
if (holder.next) {
|
|
state.corkedRequestsFree = holder.next;
|
|
holder.next = null;
|
|
} else {
|
|
state.corkedRequestsFree = new CorkedRequest(state);
|
|
}
|
|
} else {
|
|
while (entry) {
|
|
var chunk = entry.chunk;
|
|
var encoding = entry.encoding;
|
|
var cb = entry.callback;
|
|
var len = state.objectMode ? 1 : chunk.length;
|
|
|
|
doWrite(stream, state, false, len, chunk, encoding, cb);
|
|
entry = entry.next;
|
|
if (state.writing) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (entry === null) state.lastBufferedRequest = null;
|
|
}
|
|
|
|
state.bufferedRequestCount = 0;
|
|
state.bufferedRequest = entry;
|
|
state.bufferProcessing = false;
|
|
}
|
|
|
|
Writable.prototype._write = function (chunk, encoding, cb) {
|
|
cb(new Error('_write() is not implemented'));
|
|
};
|
|
|
|
Writable.prototype._writev = null;
|
|
|
|
Writable.prototype.end = function (chunk, encoding, cb) {
|
|
var state = this._writableState;
|
|
|
|
if (typeof chunk === 'function') {
|
|
cb = chunk;
|
|
chunk = null;
|
|
encoding = null;
|
|
} else if (typeof encoding === 'function') {
|
|
cb = encoding;
|
|
encoding = null;
|
|
}
|
|
|
|
if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
|
|
|
|
if (state.corked) {
|
|
state.corked = 1;
|
|
this.uncork();
|
|
}
|
|
|
|
if (!state.ending && !state.finished) endWritable(this, state, cb);
|
|
};
|
|
|
|
function needFinish(state) {
|
|
return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
|
|
}
|
|
function callFinal(stream, state) {
|
|
stream._final(function (err) {
|
|
state.pendingcb--;
|
|
if (err) {
|
|
stream.emit('error', err);
|
|
}
|
|
state.prefinished = true;
|
|
stream.emit('prefinish');
|
|
finishMaybe(stream, state);
|
|
});
|
|
}
|
|
function prefinish(stream, state) {
|
|
if (!state.prefinished && !state.finalCalled) {
|
|
if (typeof stream._final === 'function') {
|
|
state.pendingcb++;
|
|
state.finalCalled = true;
|
|
processNextTick(callFinal, stream, state);
|
|
} else {
|
|
state.prefinished = true;
|
|
stream.emit('prefinish');
|
|
}
|
|
}
|
|
}
|
|
|
|
function finishMaybe(stream, state) {
|
|
var need = needFinish(state);
|
|
if (need) {
|
|
prefinish(stream, state);
|
|
if (state.pendingcb === 0) {
|
|
state.finished = true;
|
|
stream.emit('finish');
|
|
}
|
|
}
|
|
return need;
|
|
}
|
|
|
|
function endWritable(stream, state, cb) {
|
|
state.ending = true;
|
|
finishMaybe(stream, state);
|
|
if (cb) {
|
|
if (state.finished) processNextTick(cb);else stream.once('finish', cb);
|
|
}
|
|
state.ended = true;
|
|
stream.writable = false;
|
|
}
|
|
|
|
function onCorkedFinish(corkReq, state, err) {
|
|
var entry = corkReq.entry;
|
|
corkReq.entry = null;
|
|
while (entry) {
|
|
var cb = entry.callback;
|
|
state.pendingcb--;
|
|
cb(err);
|
|
entry = entry.next;
|
|
}
|
|
if (state.corkedRequestsFree) {
|
|
state.corkedRequestsFree.next = corkReq;
|
|
} else {
|
|
state.corkedRequestsFree = corkReq;
|
|
}
|
|
}
|
|
|
|
Object.defineProperty(Writable.prototype, 'destroyed', {
|
|
get: function () {
|
|
if (this._writableState === undefined) {
|
|
return false;
|
|
}
|
|
return this._writableState.destroyed;
|
|
},
|
|
set: function (value) {
|
|
if (!this._writableState) {
|
|
return;
|
|
}
|
|
|
|
this._writableState.destroyed = value;
|
|
}
|
|
});
|
|
|
|
Writable.prototype.destroy = destroyImpl.destroy;
|
|
Writable.prototype._undestroy = destroyImpl.undestroy;
|
|
Writable.prototype._destroy = function (err, cb) {
|
|
this.end();
|
|
cb(err);
|
|
};
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"./_stream_duplex":291,"./internal/streams/destroy":297,"./internal/streams/stream":298,"_process":274,"core-util-is":133,"inherits":190,"process-nextick-args":273,"safe-buffer":305,"util-deprecate":317}],296:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
var Buffer = require('safe-buffer').Buffer;
|
|
|
|
|
|
function copyBuffer(src, target, offset) {
|
|
src.copy(target, offset);
|
|
}
|
|
|
|
module.exports = function () {
|
|
function BufferList() {
|
|
_classCallCheck(this, BufferList);
|
|
|
|
this.head = null;
|
|
this.tail = null;
|
|
this.length = 0;
|
|
}
|
|
|
|
BufferList.prototype.push = function push(v) {
|
|
var entry = { data: v, next: null };
|
|
if (this.length > 0) this.tail.next = entry;else this.head = entry;
|
|
this.tail = entry;
|
|
++this.length;
|
|
};
|
|
|
|
BufferList.prototype.unshift = function unshift(v) {
|
|
var entry = { data: v, next: this.head };
|
|
if (this.length === 0) this.tail = entry;
|
|
this.head = entry;
|
|
++this.length;
|
|
};
|
|
|
|
BufferList.prototype.shift = function shift() {
|
|
if (this.length === 0) return;
|
|
var ret = this.head.data;
|
|
if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
|
|
--this.length;
|
|
return ret;
|
|
};
|
|
|
|
BufferList.prototype.clear = function clear() {
|
|
this.head = this.tail = null;
|
|
this.length = 0;
|
|
};
|
|
|
|
BufferList.prototype.join = function join(s) {
|
|
if (this.length === 0) return '';
|
|
var p = this.head;
|
|
var ret = '' + p.data;
|
|
while (p = p.next) {
|
|
ret += s + p.data;
|
|
}return ret;
|
|
};
|
|
|
|
BufferList.prototype.concat = function concat(n) {
|
|
if (this.length === 0) return Buffer.alloc(0);
|
|
if (this.length === 1) return this.head.data;
|
|
var ret = Buffer.allocUnsafe(n >>> 0);
|
|
var p = this.head;
|
|
var i = 0;
|
|
while (p) {
|
|
copyBuffer(p.data, ret, i);
|
|
i += p.data.length;
|
|
p = p.next;
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
return BufferList;
|
|
}();
|
|
},{"safe-buffer":305}],297:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
|
|
|
|
var processNextTick = require('process-nextick-args');
|
|
|
|
|
|
function destroy(err, cb) {
|
|
var _this = this;
|
|
|
|
var readableDestroyed = this._readableState && this._readableState.destroyed;
|
|
var writableDestroyed = this._writableState && this._writableState.destroyed;
|
|
|
|
if (readableDestroyed || writableDestroyed) {
|
|
if (cb) {
|
|
cb(err);
|
|
} else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
|
|
processNextTick(emitErrorNT, this, err);
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
if (this._readableState) {
|
|
this._readableState.destroyed = true;
|
|
}
|
|
|
|
if (this._writableState) {
|
|
this._writableState.destroyed = true;
|
|
}
|
|
|
|
this._destroy(err || null, function (err) {
|
|
if (!cb && err) {
|
|
processNextTick(emitErrorNT, _this, err);
|
|
if (_this._writableState) {
|
|
_this._writableState.errorEmitted = true;
|
|
}
|
|
} else if (cb) {
|
|
cb(err);
|
|
}
|
|
});
|
|
}
|
|
|
|
function undestroy() {
|
|
if (this._readableState) {
|
|
this._readableState.destroyed = false;
|
|
this._readableState.reading = false;
|
|
this._readableState.ended = false;
|
|
this._readableState.endEmitted = false;
|
|
}
|
|
|
|
if (this._writableState) {
|
|
this._writableState.destroyed = false;
|
|
this._writableState.ended = false;
|
|
this._writableState.ending = false;
|
|
this._writableState.finished = false;
|
|
this._writableState.errorEmitted = false;
|
|
}
|
|
}
|
|
|
|
function emitErrorNT(self, err) {
|
|
self.emit('error', err);
|
|
}
|
|
|
|
module.exports = {
|
|
destroy: destroy,
|
|
undestroy: undestroy
|
|
};
|
|
},{"process-nextick-args":273}],298:[function(require,module,exports){
|
|
module.exports = require('events').EventEmitter;
|
|
|
|
},{"events":172}],299:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var Buffer = require('safe-buffer').Buffer;
|
|
|
|
var isEncoding = Buffer.isEncoding || function (encoding) {
|
|
encoding = '' + encoding;
|
|
switch (encoding && encoding.toLowerCase()) {
|
|
case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
};
|
|
|
|
function _normalizeEncoding(enc) {
|
|
if (!enc) return 'utf8';
|
|
var retried;
|
|
while (true) {
|
|
switch (enc) {
|
|
case 'utf8':
|
|
case 'utf-8':
|
|
return 'utf8';
|
|
case 'ucs2':
|
|
case 'ucs-2':
|
|
case 'utf16le':
|
|
case 'utf-16le':
|
|
return 'utf16le';
|
|
case 'latin1':
|
|
case 'binary':
|
|
return 'latin1';
|
|
case 'base64':
|
|
case 'ascii':
|
|
case 'hex':
|
|
return enc;
|
|
default:
|
|
if (retried) return; // undefined
|
|
enc = ('' + enc).toLowerCase();
|
|
retried = true;
|
|
}
|
|
}
|
|
};
|
|
|
|
function normalizeEncoding(enc) {
|
|
var nenc = _normalizeEncoding(enc);
|
|
if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
|
|
return nenc || enc;
|
|
}
|
|
|
|
exports.StringDecoder = StringDecoder;
|
|
function StringDecoder(encoding) {
|
|
this.encoding = normalizeEncoding(encoding);
|
|
var nb;
|
|
switch (this.encoding) {
|
|
case 'utf16le':
|
|
this.text = utf16Text;
|
|
this.end = utf16End;
|
|
nb = 4;
|
|
break;
|
|
case 'utf8':
|
|
this.fillLast = utf8FillLast;
|
|
nb = 4;
|
|
break;
|
|
case 'base64':
|
|
this.text = base64Text;
|
|
this.end = base64End;
|
|
nb = 3;
|
|
break;
|
|
default:
|
|
this.write = simpleWrite;
|
|
this.end = simpleEnd;
|
|
return;
|
|
}
|
|
this.lastNeed = 0;
|
|
this.lastTotal = 0;
|
|
this.lastChar = Buffer.allocUnsafe(nb);
|
|
}
|
|
|
|
StringDecoder.prototype.write = function (buf) {
|
|
if (buf.length === 0) return '';
|
|
var r;
|
|
var i;
|
|
if (this.lastNeed) {
|
|
r = this.fillLast(buf);
|
|
if (r === undefined) return '';
|
|
i = this.lastNeed;
|
|
this.lastNeed = 0;
|
|
} else {
|
|
i = 0;
|
|
}
|
|
if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
|
|
return r || '';
|
|
};
|
|
|
|
StringDecoder.prototype.end = utf8End;
|
|
|
|
StringDecoder.prototype.text = utf8Text;
|
|
|
|
StringDecoder.prototype.fillLast = function (buf) {
|
|
if (this.lastNeed <= buf.length) {
|
|
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
|
|
return this.lastChar.toString(this.encoding, 0, this.lastTotal);
|
|
}
|
|
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
|
|
this.lastNeed -= buf.length;
|
|
};
|
|
|
|
function utf8CheckByte(byte) {
|
|
if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
|
|
return -1;
|
|
}
|
|
|
|
function utf8CheckIncomplete(self, buf, i) {
|
|
var j = buf.length - 1;
|
|
if (j < i) return 0;
|
|
var nb = utf8CheckByte(buf[j]);
|
|
if (nb >= 0) {
|
|
if (nb > 0) self.lastNeed = nb - 1;
|
|
return nb;
|
|
}
|
|
if (--j < i) return 0;
|
|
nb = utf8CheckByte(buf[j]);
|
|
if (nb >= 0) {
|
|
if (nb > 0) self.lastNeed = nb - 2;
|
|
return nb;
|
|
}
|
|
if (--j < i) return 0;
|
|
nb = utf8CheckByte(buf[j]);
|
|
if (nb >= 0) {
|
|
if (nb > 0) {
|
|
if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
|
|
}
|
|
return nb;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function utf8CheckExtraBytes(self, buf, p) {
|
|
if ((buf[0] & 0xC0) !== 0x80) {
|
|
self.lastNeed = 0;
|
|
return '\ufffd'.repeat(p);
|
|
}
|
|
if (self.lastNeed > 1 && buf.length > 1) {
|
|
if ((buf[1] & 0xC0) !== 0x80) {
|
|
self.lastNeed = 1;
|
|
return '\ufffd'.repeat(p + 1);
|
|
}
|
|
if (self.lastNeed > 2 && buf.length > 2) {
|
|
if ((buf[2] & 0xC0) !== 0x80) {
|
|
self.lastNeed = 2;
|
|
return '\ufffd'.repeat(p + 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function utf8FillLast(buf) {
|
|
var p = this.lastTotal - this.lastNeed;
|
|
var r = utf8CheckExtraBytes(this, buf, p);
|
|
if (r !== undefined) return r;
|
|
if (this.lastNeed <= buf.length) {
|
|
buf.copy(this.lastChar, p, 0, this.lastNeed);
|
|
return this.lastChar.toString(this.encoding, 0, this.lastTotal);
|
|
}
|
|
buf.copy(this.lastChar, p, 0, buf.length);
|
|
this.lastNeed -= buf.length;
|
|
}
|
|
|
|
function utf8Text(buf, i) {
|
|
var total = utf8CheckIncomplete(this, buf, i);
|
|
if (!this.lastNeed) return buf.toString('utf8', i);
|
|
this.lastTotal = total;
|
|
var end = buf.length - (total - this.lastNeed);
|
|
buf.copy(this.lastChar, 0, end);
|
|
return buf.toString('utf8', i, end);
|
|
}
|
|
|
|
function utf8End(buf) {
|
|
var r = buf && buf.length ? this.write(buf) : '';
|
|
if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
|
|
return r;
|
|
}
|
|
|
|
function utf16Text(buf, i) {
|
|
if ((buf.length - i) % 2 === 0) {
|
|
var r = buf.toString('utf16le', i);
|
|
if (r) {
|
|
var c = r.charCodeAt(r.length - 1);
|
|
if (c >= 0xD800 && c <= 0xDBFF) {
|
|
this.lastNeed = 2;
|
|
this.lastTotal = 4;
|
|
this.lastChar[0] = buf[buf.length - 2];
|
|
this.lastChar[1] = buf[buf.length - 1];
|
|
return r.slice(0, -1);
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
this.lastNeed = 1;
|
|
this.lastTotal = 2;
|
|
this.lastChar[0] = buf[buf.length - 1];
|
|
return buf.toString('utf16le', i, buf.length - 1);
|
|
}
|
|
|
|
function utf16End(buf) {
|
|
var r = buf && buf.length ? this.write(buf) : '';
|
|
if (this.lastNeed) {
|
|
var end = this.lastTotal - this.lastNeed;
|
|
return r + this.lastChar.toString('utf16le', 0, end);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function base64Text(buf, i) {
|
|
var n = (buf.length - i) % 3;
|
|
if (n === 0) return buf.toString('base64', i);
|
|
this.lastNeed = 3 - n;
|
|
this.lastTotal = 3;
|
|
if (n === 1) {
|
|
this.lastChar[0] = buf[buf.length - 1];
|
|
} else {
|
|
this.lastChar[0] = buf[buf.length - 2];
|
|
this.lastChar[1] = buf[buf.length - 1];
|
|
}
|
|
return buf.toString('base64', i, buf.length - n);
|
|
}
|
|
|
|
function base64End(buf) {
|
|
var r = buf && buf.length ? this.write(buf) : '';
|
|
if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
|
|
return r;
|
|
}
|
|
|
|
function simpleWrite(buf) {
|
|
return buf.toString(this.encoding);
|
|
}
|
|
|
|
function simpleEnd(buf) {
|
|
return buf && buf.length ? this.write(buf) : '';
|
|
}
|
|
},{"safe-buffer":305}],300:[function(require,module,exports){
|
|
module.exports = require('./readable').PassThrough
|
|
|
|
},{"./readable":301}],301:[function(require,module,exports){
|
|
exports = module.exports = require('./lib/_stream_readable.js');
|
|
exports.Stream = exports;
|
|
exports.Readable = exports;
|
|
exports.Writable = require('./lib/_stream_writable.js');
|
|
exports.Duplex = require('./lib/_stream_duplex.js');
|
|
exports.Transform = require('./lib/_stream_transform.js');
|
|
exports.PassThrough = require('./lib/_stream_passthrough.js');
|
|
|
|
},{"./lib/_stream_duplex.js":291,"./lib/_stream_passthrough.js":292,"./lib/_stream_readable.js":293,"./lib/_stream_transform.js":294,"./lib/_stream_writable.js":295}],302:[function(require,module,exports){
|
|
module.exports = require('./readable').Transform
|
|
|
|
},{"./readable":301}],303:[function(require,module,exports){
|
|
module.exports = require('./lib/_stream_writable.js');
|
|
|
|
},{"./lib/_stream_writable.js":295}],304:[function(require,module,exports){
|
|
(function (Buffer){
|
|
'use strict'
|
|
var inherits = require('inherits')
|
|
var HashBase = require('hash-base')
|
|
|
|
function RIPEMD160 () {
|
|
HashBase.call(this, 64)
|
|
|
|
this._a = 0x67452301
|
|
this._b = 0xefcdab89
|
|
this._c = 0x98badcfe
|
|
this._d = 0x10325476
|
|
this._e = 0xc3d2e1f0
|
|
}
|
|
|
|
inherits(RIPEMD160, HashBase)
|
|
|
|
RIPEMD160.prototype._update = function () {
|
|
var m = new Array(16)
|
|
for (var i = 0; i < 16; ++i) m[i] = this._block.readInt32LE(i * 4)
|
|
|
|
var al = this._a
|
|
var bl = this._b
|
|
var cl = this._c
|
|
var dl = this._d
|
|
var el = this._e
|
|
|
|
al = fn1(al, bl, cl, dl, el, m[0], 0x00000000, 11); cl = rotl(cl, 10)
|
|
el = fn1(el, al, bl, cl, dl, m[1], 0x00000000, 14); bl = rotl(bl, 10)
|
|
dl = fn1(dl, el, al, bl, cl, m[2], 0x00000000, 15); al = rotl(al, 10)
|
|
cl = fn1(cl, dl, el, al, bl, m[3], 0x00000000, 12); el = rotl(el, 10)
|
|
bl = fn1(bl, cl, dl, el, al, m[4], 0x00000000, 5); dl = rotl(dl, 10)
|
|
al = fn1(al, bl, cl, dl, el, m[5], 0x00000000, 8); cl = rotl(cl, 10)
|
|
el = fn1(el, al, bl, cl, dl, m[6], 0x00000000, 7); bl = rotl(bl, 10)
|
|
dl = fn1(dl, el, al, bl, cl, m[7], 0x00000000, 9); al = rotl(al, 10)
|
|
cl = fn1(cl, dl, el, al, bl, m[8], 0x00000000, 11); el = rotl(el, 10)
|
|
bl = fn1(bl, cl, dl, el, al, m[9], 0x00000000, 13); dl = rotl(dl, 10)
|
|
al = fn1(al, bl, cl, dl, el, m[10], 0x00000000, 14); cl = rotl(cl, 10)
|
|
el = fn1(el, al, bl, cl, dl, m[11], 0x00000000, 15); bl = rotl(bl, 10)
|
|
dl = fn1(dl, el, al, bl, cl, m[12], 0x00000000, 6); al = rotl(al, 10)
|
|
cl = fn1(cl, dl, el, al, bl, m[13], 0x00000000, 7); el = rotl(el, 10)
|
|
bl = fn1(bl, cl, dl, el, al, m[14], 0x00000000, 9); dl = rotl(dl, 10)
|
|
al = fn1(al, bl, cl, dl, el, m[15], 0x00000000, 8); cl = rotl(cl, 10)
|
|
|
|
el = fn2(el, al, bl, cl, dl, m[7], 0x5a827999, 7); bl = rotl(bl, 10)
|
|
dl = fn2(dl, el, al, bl, cl, m[4], 0x5a827999, 6); al = rotl(al, 10)
|
|
cl = fn2(cl, dl, el, al, bl, m[13], 0x5a827999, 8); el = rotl(el, 10)
|
|
bl = fn2(bl, cl, dl, el, al, m[1], 0x5a827999, 13); dl = rotl(dl, 10)
|
|
al = fn2(al, bl, cl, dl, el, m[10], 0x5a827999, 11); cl = rotl(cl, 10)
|
|
el = fn2(el, al, bl, cl, dl, m[6], 0x5a827999, 9); bl = rotl(bl, 10)
|
|
dl = fn2(dl, el, al, bl, cl, m[15], 0x5a827999, 7); al = rotl(al, 10)
|
|
cl = fn2(cl, dl, el, al, bl, m[3], 0x5a827999, 15); el = rotl(el, 10)
|
|
bl = fn2(bl, cl, dl, el, al, m[12], 0x5a827999, 7); dl = rotl(dl, 10)
|
|
al = fn2(al, bl, cl, dl, el, m[0], 0x5a827999, 12); cl = rotl(cl, 10)
|
|
el = fn2(el, al, bl, cl, dl, m[9], 0x5a827999, 15); bl = rotl(bl, 10)
|
|
dl = fn2(dl, el, al, bl, cl, m[5], 0x5a827999, 9); al = rotl(al, 10)
|
|
cl = fn2(cl, dl, el, al, bl, m[2], 0x5a827999, 11); el = rotl(el, 10)
|
|
bl = fn2(bl, cl, dl, el, al, m[14], 0x5a827999, 7); dl = rotl(dl, 10)
|
|
al = fn2(al, bl, cl, dl, el, m[11], 0x5a827999, 13); cl = rotl(cl, 10)
|
|
el = fn2(el, al, bl, cl, dl, m[8], 0x5a827999, 12); bl = rotl(bl, 10)
|
|
|
|
dl = fn3(dl, el, al, bl, cl, m[3], 0x6ed9eba1, 11); al = rotl(al, 10)
|
|
cl = fn3(cl, dl, el, al, bl, m[10], 0x6ed9eba1, 13); el = rotl(el, 10)
|
|
bl = fn3(bl, cl, dl, el, al, m[14], 0x6ed9eba1, 6); dl = rotl(dl, 10)
|
|
al = fn3(al, bl, cl, dl, el, m[4], 0x6ed9eba1, 7); cl = rotl(cl, 10)
|
|
el = fn3(el, al, bl, cl, dl, m[9], 0x6ed9eba1, 14); bl = rotl(bl, 10)
|
|
dl = fn3(dl, el, al, bl, cl, m[15], 0x6ed9eba1, 9); al = rotl(al, 10)
|
|
cl = fn3(cl, dl, el, al, bl, m[8], 0x6ed9eba1, 13); el = rotl(el, 10)
|
|
bl = fn3(bl, cl, dl, el, al, m[1], 0x6ed9eba1, 15); dl = rotl(dl, 10)
|
|
al = fn3(al, bl, cl, dl, el, m[2], 0x6ed9eba1, 14); cl = rotl(cl, 10)
|
|
el = fn3(el, al, bl, cl, dl, m[7], 0x6ed9eba1, 8); bl = rotl(bl, 10)
|
|
dl = fn3(dl, el, al, bl, cl, m[0], 0x6ed9eba1, 13); al = rotl(al, 10)
|
|
cl = fn3(cl, dl, el, al, bl, m[6], 0x6ed9eba1, 6); el = rotl(el, 10)
|
|
bl = fn3(bl, cl, dl, el, al, m[13], 0x6ed9eba1, 5); dl = rotl(dl, 10)
|
|
al = fn3(al, bl, cl, dl, el, m[11], 0x6ed9eba1, 12); cl = rotl(cl, 10)
|
|
el = fn3(el, al, bl, cl, dl, m[5], 0x6ed9eba1, 7); bl = rotl(bl, 10)
|
|
dl = fn3(dl, el, al, bl, cl, m[12], 0x6ed9eba1, 5); al = rotl(al, 10)
|
|
|
|
cl = fn4(cl, dl, el, al, bl, m[1], 0x8f1bbcdc, 11); el = rotl(el, 10)
|
|
bl = fn4(bl, cl, dl, el, al, m[9], 0x8f1bbcdc, 12); dl = rotl(dl, 10)
|
|
al = fn4(al, bl, cl, dl, el, m[11], 0x8f1bbcdc, 14); cl = rotl(cl, 10)
|
|
el = fn4(el, al, bl, cl, dl, m[10], 0x8f1bbcdc, 15); bl = rotl(bl, 10)
|
|
dl = fn4(dl, el, al, bl, cl, m[0], 0x8f1bbcdc, 14); al = rotl(al, 10)
|
|
cl = fn4(cl, dl, el, al, bl, m[8], 0x8f1bbcdc, 15); el = rotl(el, 10)
|
|
bl = fn4(bl, cl, dl, el, al, m[12], 0x8f1bbcdc, 9); dl = rotl(dl, 10)
|
|
al = fn4(al, bl, cl, dl, el, m[4], 0x8f1bbcdc, 8); cl = rotl(cl, 10)
|
|
el = fn4(el, al, bl, cl, dl, m[13], 0x8f1bbcdc, 9); bl = rotl(bl, 10)
|
|
dl = fn4(dl, el, al, bl, cl, m[3], 0x8f1bbcdc, 14); al = rotl(al, 10)
|
|
cl = fn4(cl, dl, el, al, bl, m[7], 0x8f1bbcdc, 5); el = rotl(el, 10)
|
|
bl = fn4(bl, cl, dl, el, al, m[15], 0x8f1bbcdc, 6); dl = rotl(dl, 10)
|
|
al = fn4(al, bl, cl, dl, el, m[14], 0x8f1bbcdc, 8); cl = rotl(cl, 10)
|
|
el = fn4(el, al, bl, cl, dl, m[5], 0x8f1bbcdc, 6); bl = rotl(bl, 10)
|
|
dl = fn4(dl, el, al, bl, cl, m[6], 0x8f1bbcdc, 5); al = rotl(al, 10)
|
|
cl = fn4(cl, dl, el, al, bl, m[2], 0x8f1bbcdc, 12); el = rotl(el, 10)
|
|
|
|
bl = fn5(bl, cl, dl, el, al, m[4], 0xa953fd4e, 9); dl = rotl(dl, 10)
|
|
al = fn5(al, bl, cl, dl, el, m[0], 0xa953fd4e, 15); cl = rotl(cl, 10)
|
|
el = fn5(el, al, bl, cl, dl, m[5], 0xa953fd4e, 5); bl = rotl(bl, 10)
|
|
dl = fn5(dl, el, al, bl, cl, m[9], 0xa953fd4e, 11); al = rotl(al, 10)
|
|
cl = fn5(cl, dl, el, al, bl, m[7], 0xa953fd4e, 6); el = rotl(el, 10)
|
|
bl = fn5(bl, cl, dl, el, al, m[12], 0xa953fd4e, 8); dl = rotl(dl, 10)
|
|
al = fn5(al, bl, cl, dl, el, m[2], 0xa953fd4e, 13); cl = rotl(cl, 10)
|
|
el = fn5(el, al, bl, cl, dl, m[10], 0xa953fd4e, 12); bl = rotl(bl, 10)
|
|
dl = fn5(dl, el, al, bl, cl, m[14], 0xa953fd4e, 5); al = rotl(al, 10)
|
|
cl = fn5(cl, dl, el, al, bl, m[1], 0xa953fd4e, 12); el = rotl(el, 10)
|
|
bl = fn5(bl, cl, dl, el, al, m[3], 0xa953fd4e, 13); dl = rotl(dl, 10)
|
|
al = fn5(al, bl, cl, dl, el, m[8], 0xa953fd4e, 14); cl = rotl(cl, 10)
|
|
el = fn5(el, al, bl, cl, dl, m[11], 0xa953fd4e, 11); bl = rotl(bl, 10)
|
|
dl = fn5(dl, el, al, bl, cl, m[6], 0xa953fd4e, 8); al = rotl(al, 10)
|
|
cl = fn5(cl, dl, el, al, bl, m[15], 0xa953fd4e, 5); el = rotl(el, 10)
|
|
bl = fn5(bl, cl, dl, el, al, m[13], 0xa953fd4e, 6); dl = rotl(dl, 10)
|
|
|
|
var ar = this._a
|
|
var br = this._b
|
|
var cr = this._c
|
|
var dr = this._d
|
|
var er = this._e
|
|
|
|
ar = fn5(ar, br, cr, dr, er, m[5], 0x50a28be6, 8); cr = rotl(cr, 10)
|
|
er = fn5(er, ar, br, cr, dr, m[14], 0x50a28be6, 9); br = rotl(br, 10)
|
|
dr = fn5(dr, er, ar, br, cr, m[7], 0x50a28be6, 9); ar = rotl(ar, 10)
|
|
cr = fn5(cr, dr, er, ar, br, m[0], 0x50a28be6, 11); er = rotl(er, 10)
|
|
br = fn5(br, cr, dr, er, ar, m[9], 0x50a28be6, 13); dr = rotl(dr, 10)
|
|
ar = fn5(ar, br, cr, dr, er, m[2], 0x50a28be6, 15); cr = rotl(cr, 10)
|
|
er = fn5(er, ar, br, cr, dr, m[11], 0x50a28be6, 15); br = rotl(br, 10)
|
|
dr = fn5(dr, er, ar, br, cr, m[4], 0x50a28be6, 5); ar = rotl(ar, 10)
|
|
cr = fn5(cr, dr, er, ar, br, m[13], 0x50a28be6, 7); er = rotl(er, 10)
|
|
br = fn5(br, cr, dr, er, ar, m[6], 0x50a28be6, 7); dr = rotl(dr, 10)
|
|
ar = fn5(ar, br, cr, dr, er, m[15], 0x50a28be6, 8); cr = rotl(cr, 10)
|
|
er = fn5(er, ar, br, cr, dr, m[8], 0x50a28be6, 11); br = rotl(br, 10)
|
|
dr = fn5(dr, er, ar, br, cr, m[1], 0x50a28be6, 14); ar = rotl(ar, 10)
|
|
cr = fn5(cr, dr, er, ar, br, m[10], 0x50a28be6, 14); er = rotl(er, 10)
|
|
br = fn5(br, cr, dr, er, ar, m[3], 0x50a28be6, 12); dr = rotl(dr, 10)
|
|
ar = fn5(ar, br, cr, dr, er, m[12], 0x50a28be6, 6); cr = rotl(cr, 10)
|
|
|
|
er = fn4(er, ar, br, cr, dr, m[6], 0x5c4dd124, 9); br = rotl(br, 10)
|
|
dr = fn4(dr, er, ar, br, cr, m[11], 0x5c4dd124, 13); ar = rotl(ar, 10)
|
|
cr = fn4(cr, dr, er, ar, br, m[3], 0x5c4dd124, 15); er = rotl(er, 10)
|
|
br = fn4(br, cr, dr, er, ar, m[7], 0x5c4dd124, 7); dr = rotl(dr, 10)
|
|
ar = fn4(ar, br, cr, dr, er, m[0], 0x5c4dd124, 12); cr = rotl(cr, 10)
|
|
er = fn4(er, ar, br, cr, dr, m[13], 0x5c4dd124, 8); br = rotl(br, 10)
|
|
dr = fn4(dr, er, ar, br, cr, m[5], 0x5c4dd124, 9); ar = rotl(ar, 10)
|
|
cr = fn4(cr, dr, er, ar, br, m[10], 0x5c4dd124, 11); er = rotl(er, 10)
|
|
br = fn4(br, cr, dr, er, ar, m[14], 0x5c4dd124, 7); dr = rotl(dr, 10)
|
|
ar = fn4(ar, br, cr, dr, er, m[15], 0x5c4dd124, 7); cr = rotl(cr, 10)
|
|
er = fn4(er, ar, br, cr, dr, m[8], 0x5c4dd124, 12); br = rotl(br, 10)
|
|
dr = fn4(dr, er, ar, br, cr, m[12], 0x5c4dd124, 7); ar = rotl(ar, 10)
|
|
cr = fn4(cr, dr, er, ar, br, m[4], 0x5c4dd124, 6); er = rotl(er, 10)
|
|
br = fn4(br, cr, dr, er, ar, m[9], 0x5c4dd124, 15); dr = rotl(dr, 10)
|
|
ar = fn4(ar, br, cr, dr, er, m[1], 0x5c4dd124, 13); cr = rotl(cr, 10)
|
|
er = fn4(er, ar, br, cr, dr, m[2], 0x5c4dd124, 11); br = rotl(br, 10)
|
|
|
|
dr = fn3(dr, er, ar, br, cr, m[15], 0x6d703ef3, 9); ar = rotl(ar, 10)
|
|
cr = fn3(cr, dr, er, ar, br, m[5], 0x6d703ef3, 7); er = rotl(er, 10)
|
|
br = fn3(br, cr, dr, er, ar, m[1], 0x6d703ef3, 15); dr = rotl(dr, 10)
|
|
ar = fn3(ar, br, cr, dr, er, m[3], 0x6d703ef3, 11); cr = rotl(cr, 10)
|
|
er = fn3(er, ar, br, cr, dr, m[7], 0x6d703ef3, 8); br = rotl(br, 10)
|
|
dr = fn3(dr, er, ar, br, cr, m[14], 0x6d703ef3, 6); ar = rotl(ar, 10)
|
|
cr = fn3(cr, dr, er, ar, br, m[6], 0x6d703ef3, 6); er = rotl(er, 10)
|
|
br = fn3(br, cr, dr, er, ar, m[9], 0x6d703ef3, 14); dr = rotl(dr, 10)
|
|
ar = fn3(ar, br, cr, dr, er, m[11], 0x6d703ef3, 12); cr = rotl(cr, 10)
|
|
er = fn3(er, ar, br, cr, dr, m[8], 0x6d703ef3, 13); br = rotl(br, 10)
|
|
dr = fn3(dr, er, ar, br, cr, m[12], 0x6d703ef3, 5); ar = rotl(ar, 10)
|
|
cr = fn3(cr, dr, er, ar, br, m[2], 0x6d703ef3, 14); er = rotl(er, 10)
|
|
br = fn3(br, cr, dr, er, ar, m[10], 0x6d703ef3, 13); dr = rotl(dr, 10)
|
|
ar = fn3(ar, br, cr, dr, er, m[0], 0x6d703ef3, 13); cr = rotl(cr, 10)
|
|
er = fn3(er, ar, br, cr, dr, m[4], 0x6d703ef3, 7); br = rotl(br, 10)
|
|
dr = fn3(dr, er, ar, br, cr, m[13], 0x6d703ef3, 5); ar = rotl(ar, 10)
|
|
|
|
cr = fn2(cr, dr, er, ar, br, m[8], 0x7a6d76e9, 15); er = rotl(er, 10)
|
|
br = fn2(br, cr, dr, er, ar, m[6], 0x7a6d76e9, 5); dr = rotl(dr, 10)
|
|
ar = fn2(ar, br, cr, dr, er, m[4], 0x7a6d76e9, 8); cr = rotl(cr, 10)
|
|
er = fn2(er, ar, br, cr, dr, m[1], 0x7a6d76e9, 11); br = rotl(br, 10)
|
|
dr = fn2(dr, er, ar, br, cr, m[3], 0x7a6d76e9, 14); ar = rotl(ar, 10)
|
|
cr = fn2(cr, dr, er, ar, br, m[11], 0x7a6d76e9, 14); er = rotl(er, 10)
|
|
br = fn2(br, cr, dr, er, ar, m[15], 0x7a6d76e9, 6); dr = rotl(dr, 10)
|
|
ar = fn2(ar, br, cr, dr, er, m[0], 0x7a6d76e9, 14); cr = rotl(cr, 10)
|
|
er = fn2(er, ar, br, cr, dr, m[5], 0x7a6d76e9, 6); br = rotl(br, 10)
|
|
dr = fn2(dr, er, ar, br, cr, m[12], 0x7a6d76e9, 9); ar = rotl(ar, 10)
|
|
cr = fn2(cr, dr, er, ar, br, m[2], 0x7a6d76e9, 12); er = rotl(er, 10)
|
|
br = fn2(br, cr, dr, er, ar, m[13], 0x7a6d76e9, 9); dr = rotl(dr, 10)
|
|
ar = fn2(ar, br, cr, dr, er, m[9], 0x7a6d76e9, 12); cr = rotl(cr, 10)
|
|
er = fn2(er, ar, br, cr, dr, m[7], 0x7a6d76e9, 5); br = rotl(br, 10)
|
|
dr = fn2(dr, er, ar, br, cr, m[10], 0x7a6d76e9, 15); ar = rotl(ar, 10)
|
|
cr = fn2(cr, dr, er, ar, br, m[14], 0x7a6d76e9, 8); er = rotl(er, 10)
|
|
|
|
br = fn1(br, cr, dr, er, ar, m[12], 0x00000000, 8); dr = rotl(dr, 10)
|
|
ar = fn1(ar, br, cr, dr, er, m[15], 0x00000000, 5); cr = rotl(cr, 10)
|
|
er = fn1(er, ar, br, cr, dr, m[10], 0x00000000, 12); br = rotl(br, 10)
|
|
dr = fn1(dr, er, ar, br, cr, m[4], 0x00000000, 9); ar = rotl(ar, 10)
|
|
cr = fn1(cr, dr, er, ar, br, m[1], 0x00000000, 12); er = rotl(er, 10)
|
|
br = fn1(br, cr, dr, er, ar, m[5], 0x00000000, 5); dr = rotl(dr, 10)
|
|
ar = fn1(ar, br, cr, dr, er, m[8], 0x00000000, 14); cr = rotl(cr, 10)
|
|
er = fn1(er, ar, br, cr, dr, m[7], 0x00000000, 6); br = rotl(br, 10)
|
|
dr = fn1(dr, er, ar, br, cr, m[6], 0x00000000, 8); ar = rotl(ar, 10)
|
|
cr = fn1(cr, dr, er, ar, br, m[2], 0x00000000, 13); er = rotl(er, 10)
|
|
br = fn1(br, cr, dr, er, ar, m[13], 0x00000000, 6); dr = rotl(dr, 10)
|
|
ar = fn1(ar, br, cr, dr, er, m[14], 0x00000000, 5); cr = rotl(cr, 10)
|
|
er = fn1(er, ar, br, cr, dr, m[0], 0x00000000, 15); br = rotl(br, 10)
|
|
dr = fn1(dr, er, ar, br, cr, m[3], 0x00000000, 13); ar = rotl(ar, 10)
|
|
cr = fn1(cr, dr, er, ar, br, m[9], 0x00000000, 11); er = rotl(er, 10)
|
|
br = fn1(br, cr, dr, er, ar, m[11], 0x00000000, 11); dr = rotl(dr, 10)
|
|
|
|
var t = (this._b + cl + dr) | 0
|
|
this._b = (this._c + dl + er) | 0
|
|
this._c = (this._d + el + ar) | 0
|
|
this._d = (this._e + al + br) | 0
|
|
this._e = (this._a + bl + cr) | 0
|
|
this._a = t
|
|
}
|
|
|
|
RIPEMD160.prototype._digest = function () {
|
|
this._block[this._blockOffset++] = 0x80
|
|
if (this._blockOffset > 56) {
|
|
this._block.fill(0, this._blockOffset, 64)
|
|
this._update()
|
|
this._blockOffset = 0
|
|
}
|
|
|
|
this._block.fill(0, this._blockOffset, 56)
|
|
this._block.writeUInt32LE(this._length[0], 56)
|
|
this._block.writeUInt32LE(this._length[1], 60)
|
|
this._update()
|
|
|
|
var buffer = new Buffer(20)
|
|
buffer.writeInt32LE(this._a, 0)
|
|
buffer.writeInt32LE(this._b, 4)
|
|
buffer.writeInt32LE(this._c, 8)
|
|
buffer.writeInt32LE(this._d, 12)
|
|
buffer.writeInt32LE(this._e, 16)
|
|
return buffer
|
|
}
|
|
|
|
function rotl (x, n) {
|
|
return (x << n) | (x >>> (32 - n))
|
|
}
|
|
|
|
function fn1 (a, b, c, d, e, m, k, s) {
|
|
return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0
|
|
}
|
|
|
|
function fn2 (a, b, c, d, e, m, k, s) {
|
|
return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0
|
|
}
|
|
|
|
function fn3 (a, b, c, d, e, m, k, s) {
|
|
return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0
|
|
}
|
|
|
|
function fn4 (a, b, c, d, e, m, k, s) {
|
|
return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0
|
|
}
|
|
|
|
function fn5 (a, b, c, d, e, m, k, s) {
|
|
return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0
|
|
}
|
|
|
|
module.exports = RIPEMD160
|
|
|
|
}).call(this,require("buffer").Buffer)
|
|
},{"buffer":130,"hash-base":174,"inherits":190}],305:[function(require,module,exports){
|
|
|
|
var buffer = require('buffer')
|
|
var Buffer = buffer.Buffer
|
|
|
|
function copyProps (src, dst) {
|
|
for (var key in src) {
|
|
dst[key] = src[key]
|
|
}
|
|
}
|
|
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
|
|
module.exports = buffer
|
|
} else {
|
|
copyProps(buffer, exports)
|
|
exports.Buffer = SafeBuffer
|
|
}
|
|
|
|
function SafeBuffer (arg, encodingOrOffset, length) {
|
|
return Buffer(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
copyProps(Buffer, SafeBuffer)
|
|
|
|
SafeBuffer.from = function (arg, encodingOrOffset, length) {
|
|
if (typeof arg === 'number') {
|
|
throw new TypeError('Argument must not be a number')
|
|
}
|
|
return Buffer(arg, encodingOrOffset, length)
|
|
}
|
|
|
|
SafeBuffer.alloc = function (size, fill, encoding) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('Argument must be a number')
|
|
}
|
|
var buf = Buffer(size)
|
|
if (fill !== undefined) {
|
|
if (typeof encoding === 'string') {
|
|
buf.fill(fill, encoding)
|
|
} else {
|
|
buf.fill(fill)
|
|
}
|
|
} else {
|
|
buf.fill(0)
|
|
}
|
|
return buf
|
|
}
|
|
|
|
SafeBuffer.allocUnsafe = function (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('Argument must be a number')
|
|
}
|
|
return Buffer(size)
|
|
}
|
|
|
|
SafeBuffer.allocUnsafeSlow = function (size) {
|
|
if (typeof size !== 'number') {
|
|
throw new TypeError('Argument must be a number')
|
|
}
|
|
return buffer.SlowBuffer(size)
|
|
}
|
|
|
|
},{"buffer":130}],306:[function(require,module,exports){
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
function Hash (blockSize, finalSize) {
|
|
this._block = Buffer.alloc(blockSize)
|
|
this._finalSize = finalSize
|
|
this._blockSize = blockSize
|
|
this._len = 0
|
|
}
|
|
|
|
Hash.prototype.update = function (data, enc) {
|
|
if (typeof data === 'string') {
|
|
enc = enc || 'utf8'
|
|
data = Buffer.from(data, enc)
|
|
}
|
|
|
|
var block = this._block
|
|
var blockSize = this._blockSize
|
|
var length = data.length
|
|
var accum = this._len
|
|
|
|
for (var offset = 0; offset < length;) {
|
|
var assigned = accum % blockSize
|
|
var remainder = Math.min(length - offset, blockSize - assigned)
|
|
|
|
for (var i = 0; i < remainder; i++) {
|
|
block[assigned + i] = data[offset + i]
|
|
}
|
|
|
|
accum += remainder
|
|
offset += remainder
|
|
|
|
if ((accum % blockSize) === 0) {
|
|
this._update(block)
|
|
}
|
|
}
|
|
|
|
this._len += length
|
|
return this
|
|
}
|
|
|
|
Hash.prototype.digest = function (enc) {
|
|
var rem = this._len % this._blockSize
|
|
|
|
this._block[rem] = 0x80
|
|
|
|
this._block.fill(0, rem + 1)
|
|
|
|
if (rem >= this._finalSize) {
|
|
this._update(this._block)
|
|
this._block.fill(0)
|
|
}
|
|
|
|
var bits = this._len * 8
|
|
|
|
if (bits <= 0xffffffff) {
|
|
this._block.writeUInt32BE(bits, this._blockSize - 4)
|
|
|
|
} else {
|
|
var lowBits = bits & 0xffffffff
|
|
var highBits = (bits - lowBits) / 0x100000000
|
|
|
|
this._block.writeUInt32BE(highBits, this._blockSize - 8)
|
|
this._block.writeUInt32BE(lowBits, this._blockSize - 4)
|
|
}
|
|
|
|
this._update(this._block)
|
|
var hash = this._hash()
|
|
|
|
return enc ? hash.toString(enc) : hash
|
|
}
|
|
|
|
Hash.prototype._update = function () {
|
|
throw new Error('_update must be implemented by subclass')
|
|
}
|
|
|
|
module.exports = Hash
|
|
|
|
},{"safe-buffer":305}],307:[function(require,module,exports){
|
|
var exports = module.exports = function SHA (algorithm) {
|
|
algorithm = algorithm.toLowerCase()
|
|
|
|
var Algorithm = exports[algorithm]
|
|
if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)')
|
|
|
|
return new Algorithm()
|
|
}
|
|
|
|
exports.sha = require('./sha')
|
|
exports.sha1 = require('./sha1')
|
|
exports.sha224 = require('./sha224')
|
|
exports.sha256 = require('./sha256')
|
|
exports.sha384 = require('./sha384')
|
|
exports.sha512 = require('./sha512')
|
|
|
|
},{"./sha":308,"./sha1":309,"./sha224":310,"./sha256":311,"./sha384":312,"./sha512":313}],308:[function(require,module,exports){
|
|
|
|
|
|
var inherits = require('inherits')
|
|
var Hash = require('./hash')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var K = [
|
|
0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0
|
|
]
|
|
|
|
var W = new Array(80)
|
|
|
|
function Sha () {
|
|
this.init()
|
|
this._w = W
|
|
|
|
Hash.call(this, 64, 56)
|
|
}
|
|
|
|
inherits(Sha, Hash)
|
|
|
|
Sha.prototype.init = function () {
|
|
this._a = 0x67452301
|
|
this._b = 0xefcdab89
|
|
this._c = 0x98badcfe
|
|
this._d = 0x10325476
|
|
this._e = 0xc3d2e1f0
|
|
|
|
return this
|
|
}
|
|
|
|
function rotl5 (num) {
|
|
return (num << 5) | (num >>> 27)
|
|
}
|
|
|
|
function rotl30 (num) {
|
|
return (num << 30) | (num >>> 2)
|
|
}
|
|
|
|
function ft (s, b, c, d) {
|
|
if (s === 0) return (b & c) | ((~b) & d)
|
|
if (s === 2) return (b & c) | (b & d) | (c & d)
|
|
return b ^ c ^ d
|
|
}
|
|
|
|
Sha.prototype._update = function (M) {
|
|
var W = this._w
|
|
|
|
var a = this._a | 0
|
|
var b = this._b | 0
|
|
var c = this._c | 0
|
|
var d = this._d | 0
|
|
var e = this._e | 0
|
|
|
|
for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4)
|
|
for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]
|
|
|
|
for (var j = 0; j < 80; ++j) {
|
|
var s = ~~(j / 20)
|
|
var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0
|
|
|
|
e = d
|
|
d = c
|
|
c = rotl30(b)
|
|
b = a
|
|
a = t
|
|
}
|
|
|
|
this._a = (a + this._a) | 0
|
|
this._b = (b + this._b) | 0
|
|
this._c = (c + this._c) | 0
|
|
this._d = (d + this._d) | 0
|
|
this._e = (e + this._e) | 0
|
|
}
|
|
|
|
Sha.prototype._hash = function () {
|
|
var H = Buffer.allocUnsafe(20)
|
|
|
|
H.writeInt32BE(this._a | 0, 0)
|
|
H.writeInt32BE(this._b | 0, 4)
|
|
H.writeInt32BE(this._c | 0, 8)
|
|
H.writeInt32BE(this._d | 0, 12)
|
|
H.writeInt32BE(this._e | 0, 16)
|
|
|
|
return H
|
|
}
|
|
|
|
module.exports = Sha
|
|
|
|
},{"./hash":306,"inherits":190,"safe-buffer":305}],309:[function(require,module,exports){
|
|
|
|
|
|
var inherits = require('inherits')
|
|
var Hash = require('./hash')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var K = [
|
|
0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0
|
|
]
|
|
|
|
var W = new Array(80)
|
|
|
|
function Sha1 () {
|
|
this.init()
|
|
this._w = W
|
|
|
|
Hash.call(this, 64, 56)
|
|
}
|
|
|
|
inherits(Sha1, Hash)
|
|
|
|
Sha1.prototype.init = function () {
|
|
this._a = 0x67452301
|
|
this._b = 0xefcdab89
|
|
this._c = 0x98badcfe
|
|
this._d = 0x10325476
|
|
this._e = 0xc3d2e1f0
|
|
|
|
return this
|
|
}
|
|
|
|
function rotl1 (num) {
|
|
return (num << 1) | (num >>> 31)
|
|
}
|
|
|
|
function rotl5 (num) {
|
|
return (num << 5) | (num >>> 27)
|
|
}
|
|
|
|
function rotl30 (num) {
|
|
return (num << 30) | (num >>> 2)
|
|
}
|
|
|
|
function ft (s, b, c, d) {
|
|
if (s === 0) return (b & c) | ((~b) & d)
|
|
if (s === 2) return (b & c) | (b & d) | (c & d)
|
|
return b ^ c ^ d
|
|
}
|
|
|
|
Sha1.prototype._update = function (M) {
|
|
var W = this._w
|
|
|
|
var a = this._a | 0
|
|
var b = this._b | 0
|
|
var c = this._c | 0
|
|
var d = this._d | 0
|
|
var e = this._e | 0
|
|
|
|
for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4)
|
|
for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16])
|
|
|
|
for (var j = 0; j < 80; ++j) {
|
|
var s = ~~(j / 20)
|
|
var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0
|
|
|
|
e = d
|
|
d = c
|
|
c = rotl30(b)
|
|
b = a
|
|
a = t
|
|
}
|
|
|
|
this._a = (a + this._a) | 0
|
|
this._b = (b + this._b) | 0
|
|
this._c = (c + this._c) | 0
|
|
this._d = (d + this._d) | 0
|
|
this._e = (e + this._e) | 0
|
|
}
|
|
|
|
Sha1.prototype._hash = function () {
|
|
var H = Buffer.allocUnsafe(20)
|
|
|
|
H.writeInt32BE(this._a | 0, 0)
|
|
H.writeInt32BE(this._b | 0, 4)
|
|
H.writeInt32BE(this._c | 0, 8)
|
|
H.writeInt32BE(this._d | 0, 12)
|
|
H.writeInt32BE(this._e | 0, 16)
|
|
|
|
return H
|
|
}
|
|
|
|
module.exports = Sha1
|
|
|
|
},{"./hash":306,"inherits":190,"safe-buffer":305}],310:[function(require,module,exports){
|
|
|
|
|
|
var inherits = require('inherits')
|
|
var Sha256 = require('./sha256')
|
|
var Hash = require('./hash')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var W = new Array(64)
|
|
|
|
function Sha224 () {
|
|
this.init()
|
|
|
|
this._w = W // new Array(64)
|
|
|
|
Hash.call(this, 64, 56)
|
|
}
|
|
|
|
inherits(Sha224, Sha256)
|
|
|
|
Sha224.prototype.init = function () {
|
|
this._a = 0xc1059ed8
|
|
this._b = 0x367cd507
|
|
this._c = 0x3070dd17
|
|
this._d = 0xf70e5939
|
|
this._e = 0xffc00b31
|
|
this._f = 0x68581511
|
|
this._g = 0x64f98fa7
|
|
this._h = 0xbefa4fa4
|
|
|
|
return this
|
|
}
|
|
|
|
Sha224.prototype._hash = function () {
|
|
var H = Buffer.allocUnsafe(28)
|
|
|
|
H.writeInt32BE(this._a, 0)
|
|
H.writeInt32BE(this._b, 4)
|
|
H.writeInt32BE(this._c, 8)
|
|
H.writeInt32BE(this._d, 12)
|
|
H.writeInt32BE(this._e, 16)
|
|
H.writeInt32BE(this._f, 20)
|
|
H.writeInt32BE(this._g, 24)
|
|
|
|
return H
|
|
}
|
|
|
|
module.exports = Sha224
|
|
|
|
},{"./hash":306,"./sha256":311,"inherits":190,"safe-buffer":305}],311:[function(require,module,exports){
|
|
|
|
|
|
var inherits = require('inherits')
|
|
var Hash = require('./hash')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var K = [
|
|
0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
|
|
0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
|
|
0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
|
|
0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
|
|
0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
|
|
0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
|
|
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
|
|
0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
|
|
0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
|
|
0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
|
|
0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
|
|
0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
|
|
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
|
|
0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
|
|
0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
|
|
0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2
|
|
]
|
|
|
|
var W = new Array(64)
|
|
|
|
function Sha256 () {
|
|
this.init()
|
|
|
|
this._w = W // new Array(64)
|
|
|
|
Hash.call(this, 64, 56)
|
|
}
|
|
|
|
inherits(Sha256, Hash)
|
|
|
|
Sha256.prototype.init = function () {
|
|
this._a = 0x6a09e667
|
|
this._b = 0xbb67ae85
|
|
this._c = 0x3c6ef372
|
|
this._d = 0xa54ff53a
|
|
this._e = 0x510e527f
|
|
this._f = 0x9b05688c
|
|
this._g = 0x1f83d9ab
|
|
this._h = 0x5be0cd19
|
|
|
|
return this
|
|
}
|
|
|
|
function ch (x, y, z) {
|
|
return z ^ (x & (y ^ z))
|
|
}
|
|
|
|
function maj (x, y, z) {
|
|
return (x & y) | (z & (x | y))
|
|
}
|
|
|
|
function sigma0 (x) {
|
|
return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10)
|
|
}
|
|
|
|
function sigma1 (x) {
|
|
return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7)
|
|
}
|
|
|
|
function gamma0 (x) {
|
|
return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3)
|
|
}
|
|
|
|
function gamma1 (x) {
|
|
return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10)
|
|
}
|
|
|
|
Sha256.prototype._update = function (M) {
|
|
var W = this._w
|
|
|
|
var a = this._a | 0
|
|
var b = this._b | 0
|
|
var c = this._c | 0
|
|
var d = this._d | 0
|
|
var e = this._e | 0
|
|
var f = this._f | 0
|
|
var g = this._g | 0
|
|
var h = this._h | 0
|
|
|
|
for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4)
|
|
for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0
|
|
|
|
for (var j = 0; j < 64; ++j) {
|
|
var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0
|
|
var T2 = (sigma0(a) + maj(a, b, c)) | 0
|
|
|
|
h = g
|
|
g = f
|
|
f = e
|
|
e = (d + T1) | 0
|
|
d = c
|
|
c = b
|
|
b = a
|
|
a = (T1 + T2) | 0
|
|
}
|
|
|
|
this._a = (a + this._a) | 0
|
|
this._b = (b + this._b) | 0
|
|
this._c = (c + this._c) | 0
|
|
this._d = (d + this._d) | 0
|
|
this._e = (e + this._e) | 0
|
|
this._f = (f + this._f) | 0
|
|
this._g = (g + this._g) | 0
|
|
this._h = (h + this._h) | 0
|
|
}
|
|
|
|
Sha256.prototype._hash = function () {
|
|
var H = Buffer.allocUnsafe(32)
|
|
|
|
H.writeInt32BE(this._a, 0)
|
|
H.writeInt32BE(this._b, 4)
|
|
H.writeInt32BE(this._c, 8)
|
|
H.writeInt32BE(this._d, 12)
|
|
H.writeInt32BE(this._e, 16)
|
|
H.writeInt32BE(this._f, 20)
|
|
H.writeInt32BE(this._g, 24)
|
|
H.writeInt32BE(this._h, 28)
|
|
|
|
return H
|
|
}
|
|
|
|
module.exports = Sha256
|
|
|
|
},{"./hash":306,"inherits":190,"safe-buffer":305}],312:[function(require,module,exports){
|
|
var inherits = require('inherits')
|
|
var SHA512 = require('./sha512')
|
|
var Hash = require('./hash')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var W = new Array(160)
|
|
|
|
function Sha384 () {
|
|
this.init()
|
|
this._w = W
|
|
|
|
Hash.call(this, 128, 112)
|
|
}
|
|
|
|
inherits(Sha384, SHA512)
|
|
|
|
Sha384.prototype.init = function () {
|
|
this._ah = 0xcbbb9d5d
|
|
this._bh = 0x629a292a
|
|
this._ch = 0x9159015a
|
|
this._dh = 0x152fecd8
|
|
this._eh = 0x67332667
|
|
this._fh = 0x8eb44a87
|
|
this._gh = 0xdb0c2e0d
|
|
this._hh = 0x47b5481d
|
|
|
|
this._al = 0xc1059ed8
|
|
this._bl = 0x367cd507
|
|
this._cl = 0x3070dd17
|
|
this._dl = 0xf70e5939
|
|
this._el = 0xffc00b31
|
|
this._fl = 0x68581511
|
|
this._gl = 0x64f98fa7
|
|
this._hl = 0xbefa4fa4
|
|
|
|
return this
|
|
}
|
|
|
|
Sha384.prototype._hash = function () {
|
|
var H = Buffer.allocUnsafe(48)
|
|
|
|
function writeInt64BE (h, l, offset) {
|
|
H.writeInt32BE(h, offset)
|
|
H.writeInt32BE(l, offset + 4)
|
|
}
|
|
|
|
writeInt64BE(this._ah, this._al, 0)
|
|
writeInt64BE(this._bh, this._bl, 8)
|
|
writeInt64BE(this._ch, this._cl, 16)
|
|
writeInt64BE(this._dh, this._dl, 24)
|
|
writeInt64BE(this._eh, this._el, 32)
|
|
writeInt64BE(this._fh, this._fl, 40)
|
|
|
|
return H
|
|
}
|
|
|
|
module.exports = Sha384
|
|
|
|
},{"./hash":306,"./sha512":313,"inherits":190,"safe-buffer":305}],313:[function(require,module,exports){
|
|
var inherits = require('inherits')
|
|
var Hash = require('./hash')
|
|
var Buffer = require('safe-buffer').Buffer
|
|
|
|
var K = [
|
|
0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
|
|
0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
|
|
0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
|
|
0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
|
|
0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
|
|
0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
|
|
0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
|
|
0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
|
|
0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
|
|
0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
|
|
0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
|
|
0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
|
|
0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
|
|
0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
|
|
0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
|
|
0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
|
|
0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
|
|
0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
|
|
0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
|
|
0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
|
|
0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
|
|
0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
|
|
0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
|
|
0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
|
|
0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
|
|
0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
|
|
0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
|
|
0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
|
|
0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
|
|
0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
|
|
0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
|
|
0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
|
|
0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
|
|
0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
|
|
0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
|
|
0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
|
|
0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
|
|
0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
|
|
0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
|
|
0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
|
|
]
|
|
|
|
var W = new Array(160)
|
|
|
|
function Sha512 () {
|
|
this.init()
|
|
this._w = W
|
|
|
|
Hash.call(this, 128, 112)
|
|
}
|
|
|
|
inherits(Sha512, Hash)
|
|
|
|
Sha512.prototype.init = function () {
|
|
this._ah = 0x6a09e667
|
|
this._bh = 0xbb67ae85
|
|
this._ch = 0x3c6ef372
|
|
this._dh = 0xa54ff53a
|
|
this._eh = 0x510e527f
|
|
this._fh = 0x9b05688c
|
|
this._gh = 0x1f83d9ab
|
|
this._hh = 0x5be0cd19
|
|
|
|
this._al = 0xf3bcc908
|
|
this._bl = 0x84caa73b
|
|
this._cl = 0xfe94f82b
|
|
this._dl = 0x5f1d36f1
|
|
this._el = 0xade682d1
|
|
this._fl = 0x2b3e6c1f
|
|
this._gl = 0xfb41bd6b
|
|
this._hl = 0x137e2179
|
|
|
|
return this
|
|
}
|
|
|
|
function Ch (x, y, z) {
|
|
return z ^ (x & (y ^ z))
|
|
}
|
|
|
|
function maj (x, y, z) {
|
|
return (x & y) | (z & (x | y))
|
|
}
|
|
|
|
function sigma0 (x, xl) {
|
|
return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25)
|
|
}
|
|
|
|
function sigma1 (x, xl) {
|
|
return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23)
|
|
}
|
|
|
|
function Gamma0 (x, xl) {
|
|
return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7)
|
|
}
|
|
|
|
function Gamma0l (x, xl) {
|
|
return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25)
|
|
}
|
|
|
|
function Gamma1 (x, xl) {
|
|
return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6)
|
|
}
|
|
|
|
function Gamma1l (x, xl) {
|
|
return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26)
|
|
}
|
|
|
|
function getCarry (a, b) {
|
|
return (a >>> 0) < (b >>> 0) ? 1 : 0
|
|
}
|
|
|
|
Sha512.prototype._update = function (M) {
|
|
var W = this._w
|
|
|
|
var ah = this._ah | 0
|
|
var bh = this._bh | 0
|
|
var ch = this._ch | 0
|
|
var dh = this._dh | 0
|
|
var eh = this._eh | 0
|
|
var fh = this._fh | 0
|
|
var gh = this._gh | 0
|
|
var hh = this._hh | 0
|
|
|
|
var al = this._al | 0
|
|
var bl = this._bl | 0
|
|
var cl = this._cl | 0
|
|
var dl = this._dl | 0
|
|
var el = this._el | 0
|
|
var fl = this._fl | 0
|
|
var gl = this._gl | 0
|
|
var hl = this._hl | 0
|
|
|
|
for (var i = 0; i < 32; i += 2) {
|
|
W[i] = M.readInt32BE(i * 4)
|
|
W[i + 1] = M.readInt32BE(i * 4 + 4)
|
|
}
|
|
for (; i < 160; i += 2) {
|
|
var xh = W[i - 15 * 2]
|
|
var xl = W[i - 15 * 2 + 1]
|
|
var gamma0 = Gamma0(xh, xl)
|
|
var gamma0l = Gamma0l(xl, xh)
|
|
|
|
xh = W[i - 2 * 2]
|
|
xl = W[i - 2 * 2 + 1]
|
|
var gamma1 = Gamma1(xh, xl)
|
|
var gamma1l = Gamma1l(xl, xh)
|
|
|
|
var Wi7h = W[i - 7 * 2]
|
|
var Wi7l = W[i - 7 * 2 + 1]
|
|
|
|
var Wi16h = W[i - 16 * 2]
|
|
var Wi16l = W[i - 16 * 2 + 1]
|
|
|
|
var Wil = (gamma0l + Wi7l) | 0
|
|
var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0
|
|
Wil = (Wil + gamma1l) | 0
|
|
Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0
|
|
Wil = (Wil + Wi16l) | 0
|
|
Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0
|
|
|
|
W[i] = Wih
|
|
W[i + 1] = Wil
|
|
}
|
|
|
|
for (var j = 0; j < 160; j += 2) {
|
|
Wih = W[j]
|
|
Wil = W[j + 1]
|
|
|
|
var majh = maj(ah, bh, ch)
|
|
var majl = maj(al, bl, cl)
|
|
|
|
var sigma0h = sigma0(ah, al)
|
|
var sigma0l = sigma0(al, ah)
|
|
var sigma1h = sigma1(eh, el)
|
|
var sigma1l = sigma1(el, eh)
|
|
|
|
var Kih = K[j]
|
|
var Kil = K[j + 1]
|
|
|
|
var chh = Ch(eh, fh, gh)
|
|
var chl = Ch(el, fl, gl)
|
|
|
|
var t1l = (hl + sigma1l) | 0
|
|
var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0
|
|
t1l = (t1l + chl) | 0
|
|
t1h = (t1h + chh + getCarry(t1l, chl)) | 0
|
|
t1l = (t1l + Kil) | 0
|
|
t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0
|
|
t1l = (t1l + Wil) | 0
|
|
t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0
|
|
|
|
var t2l = (sigma0l + majl) | 0
|
|
var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0
|
|
|
|
hh = gh
|
|
hl = gl
|
|
gh = fh
|
|
gl = fl
|
|
fh = eh
|
|
fl = el
|
|
el = (dl + t1l) | 0
|
|
eh = (dh + t1h + getCarry(el, dl)) | 0
|
|
dh = ch
|
|
dl = cl
|
|
ch = bh
|
|
cl = bl
|
|
bh = ah
|
|
bl = al
|
|
al = (t1l + t2l) | 0
|
|
ah = (t1h + t2h + getCarry(al, t1l)) | 0
|
|
}
|
|
|
|
this._al = (this._al + al) | 0
|
|
this._bl = (this._bl + bl) | 0
|
|
this._cl = (this._cl + cl) | 0
|
|
this._dl = (this._dl + dl) | 0
|
|
this._el = (this._el + el) | 0
|
|
this._fl = (this._fl + fl) | 0
|
|
this._gl = (this._gl + gl) | 0
|
|
this._hl = (this._hl + hl) | 0
|
|
|
|
this._ah = (this._ah + ah + getCarry(this._al, al)) | 0
|
|
this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0
|
|
this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0
|
|
this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0
|
|
this._eh = (this._eh + eh + getCarry(this._el, el)) | 0
|
|
this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0
|
|
this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0
|
|
this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0
|
|
}
|
|
|
|
Sha512.prototype._hash = function () {
|
|
var H = Buffer.allocUnsafe(64)
|
|
|
|
function writeInt64BE (h, l, offset) {
|
|
H.writeInt32BE(h, offset)
|
|
H.writeInt32BE(l, offset + 4)
|
|
}
|
|
|
|
writeInt64BE(this._ah, this._al, 0)
|
|
writeInt64BE(this._bh, this._bl, 8)
|
|
writeInt64BE(this._ch, this._cl, 16)
|
|
writeInt64BE(this._dh, this._dl, 24)
|
|
writeInt64BE(this._eh, this._el, 32)
|
|
writeInt64BE(this._fh, this._fl, 40)
|
|
writeInt64BE(this._gh, this._gl, 48)
|
|
writeInt64BE(this._hh, this._hl, 56)
|
|
|
|
return H
|
|
}
|
|
|
|
module.exports = Sha512
|
|
|
|
},{"./hash":306,"inherits":190,"safe-buffer":305}],314:[function(require,module,exports){
|
|
|
|
module.exports = Stream;
|
|
|
|
var EE = require('events').EventEmitter;
|
|
var inherits = require('inherits');
|
|
|
|
inherits(Stream, EE);
|
|
Stream.Readable = require('readable-stream/readable.js');
|
|
Stream.Writable = require('readable-stream/writable.js');
|
|
Stream.Duplex = require('readable-stream/duplex.js');
|
|
Stream.Transform = require('readable-stream/transform.js');
|
|
Stream.PassThrough = require('readable-stream/passthrough.js');
|
|
|
|
Stream.Stream = Stream;
|
|
|
|
|
|
|
|
|
|
function Stream() {
|
|
EE.call(this);
|
|
}
|
|
|
|
Stream.prototype.pipe = function(dest, options) {
|
|
var source = this;
|
|
|
|
function ondata(chunk) {
|
|
if (dest.writable) {
|
|
if (false === dest.write(chunk) && source.pause) {
|
|
source.pause();
|
|
}
|
|
}
|
|
}
|
|
|
|
source.on('data', ondata);
|
|
|
|
function ondrain() {
|
|
if (source.readable && source.resume) {
|
|
source.resume();
|
|
}
|
|
}
|
|
|
|
dest.on('drain', ondrain);
|
|
|
|
if (!dest._isStdio && (!options || options.end !== false)) {
|
|
source.on('end', onend);
|
|
source.on('close', onclose);
|
|
}
|
|
|
|
var didOnEnd = false;
|
|
function onend() {
|
|
if (didOnEnd) return;
|
|
didOnEnd = true;
|
|
|
|
dest.end();
|
|
}
|
|
|
|
|
|
function onclose() {
|
|
if (didOnEnd) return;
|
|
didOnEnd = true;
|
|
|
|
if (typeof dest.destroy === 'function') dest.destroy();
|
|
}
|
|
|
|
function onerror(er) {
|
|
cleanup();
|
|
if (EE.listenerCount(this, 'error') === 0) {
|
|
throw er; // Unhandled stream error in pipe.
|
|
}
|
|
}
|
|
|
|
source.on('error', onerror);
|
|
dest.on('error', onerror);
|
|
|
|
function cleanup() {
|
|
source.removeListener('data', ondata);
|
|
dest.removeListener('drain', ondrain);
|
|
|
|
source.removeListener('end', onend);
|
|
source.removeListener('close', onclose);
|
|
|
|
source.removeListener('error', onerror);
|
|
dest.removeListener('error', onerror);
|
|
|
|
source.removeListener('end', cleanup);
|
|
source.removeListener('close', cleanup);
|
|
|
|
dest.removeListener('close', cleanup);
|
|
}
|
|
|
|
source.on('end', cleanup);
|
|
source.on('close', cleanup);
|
|
|
|
dest.on('close', cleanup);
|
|
|
|
dest.emit('pipe', source);
|
|
|
|
return dest;
|
|
};
|
|
|
|
},{"events":172,"inherits":190,"readable-stream/duplex.js":290,"readable-stream/passthrough.js":300,"readable-stream/readable.js":301,"readable-stream/transform.js":302,"readable-stream/writable.js":303}],315:[function(require,module,exports){
|
|
|
|
var Buffer = require('buffer').Buffer;
|
|
|
|
var isBufferEncoding = Buffer.isEncoding
|
|
|| function(encoding) {
|
|
switch (encoding && encoding.toLowerCase()) {
|
|
case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
|
|
default: return false;
|
|
}
|
|
}
|
|
|
|
|
|
function assertEncoding(encoding) {
|
|
if (encoding && !isBufferEncoding(encoding)) {
|
|
throw new Error('Unknown encoding: ' + encoding);
|
|
}
|
|
}
|
|
|
|
var StringDecoder = exports.StringDecoder = function(encoding) {
|
|
this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
|
|
assertEncoding(encoding);
|
|
switch (this.encoding) {
|
|
case 'utf8':
|
|
this.surrogateSize = 3;
|
|
break;
|
|
case 'ucs2':
|
|
case 'utf16le':
|
|
this.surrogateSize = 2;
|
|
this.detectIncompleteChar = utf16DetectIncompleteChar;
|
|
break;
|
|
case 'base64':
|
|
this.surrogateSize = 3;
|
|
this.detectIncompleteChar = base64DetectIncompleteChar;
|
|
break;
|
|
default:
|
|
this.write = passThroughWrite;
|
|
return;
|
|
}
|
|
|
|
this.charBuffer = new Buffer(6);
|
|
this.charReceived = 0;
|
|
this.charLength = 0;
|
|
};
|
|
|
|
|
|
StringDecoder.prototype.write = function(buffer) {
|
|
var charStr = '';
|
|
while (this.charLength) {
|
|
var available = (buffer.length >= this.charLength - this.charReceived) ?
|
|
this.charLength - this.charReceived :
|
|
buffer.length;
|
|
|
|
buffer.copy(this.charBuffer, this.charReceived, 0, available);
|
|
this.charReceived += available;
|
|
|
|
if (this.charReceived < this.charLength) {
|
|
return '';
|
|
}
|
|
|
|
buffer = buffer.slice(available, buffer.length);
|
|
|
|
charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
|
|
|
|
var charCode = charStr.charCodeAt(charStr.length - 1);
|
|
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
|
this.charLength += this.surrogateSize;
|
|
charStr = '';
|
|
continue;
|
|
}
|
|
this.charReceived = this.charLength = 0;
|
|
|
|
if (buffer.length === 0) {
|
|
return charStr;
|
|
}
|
|
break;
|
|
}
|
|
|
|
this.detectIncompleteChar(buffer);
|
|
|
|
var end = buffer.length;
|
|
if (this.charLength) {
|
|
buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
|
|
end -= this.charReceived;
|
|
}
|
|
|
|
charStr += buffer.toString(this.encoding, 0, end);
|
|
|
|
var end = charStr.length - 1;
|
|
var charCode = charStr.charCodeAt(end);
|
|
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
|
var size = this.surrogateSize;
|
|
this.charLength += size;
|
|
this.charReceived += size;
|
|
this.charBuffer.copy(this.charBuffer, size, 0, size);
|
|
buffer.copy(this.charBuffer, 0, 0, size);
|
|
return charStr.substring(0, end);
|
|
}
|
|
|
|
return charStr;
|
|
};
|
|
|
|
StringDecoder.prototype.detectIncompleteChar = function(buffer) {
|
|
var i = (buffer.length >= 3) ? 3 : buffer.length;
|
|
|
|
for (; i > 0; i--) {
|
|
var c = buffer[buffer.length - i];
|
|
|
|
|
|
if (i == 1 && c >> 5 == 0x06) {
|
|
this.charLength = 2;
|
|
break;
|
|
}
|
|
|
|
if (i <= 2 && c >> 4 == 0x0E) {
|
|
this.charLength = 3;
|
|
break;
|
|
}
|
|
|
|
if (i <= 3 && c >> 3 == 0x1E) {
|
|
this.charLength = 4;
|
|
break;
|
|
}
|
|
}
|
|
this.charReceived = i;
|
|
};
|
|
|
|
StringDecoder.prototype.end = function(buffer) {
|
|
var res = '';
|
|
if (buffer && buffer.length)
|
|
res = this.write(buffer);
|
|
|
|
if (this.charReceived) {
|
|
var cr = this.charReceived;
|
|
var buf = this.charBuffer;
|
|
var enc = this.encoding;
|
|
res += buf.slice(0, cr).toString(enc);
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
function passThroughWrite(buffer) {
|
|
return buffer.toString(this.encoding);
|
|
}
|
|
|
|
function utf16DetectIncompleteChar(buffer) {
|
|
this.charReceived = buffer.length % 2;
|
|
this.charLength = this.charReceived ? 2 : 0;
|
|
}
|
|
|
|
function base64DetectIncompleteChar(buffer) {
|
|
this.charReceived = buffer.length % 3;
|
|
this.charLength = this.charReceived ? 3 : 0;
|
|
}
|
|
|
|
},{"buffer":130}],316:[function(require,module,exports){
|
|
|
|
var punycode = require('punycode');
|
|
|
|
exports.parse = urlParse;
|
|
exports.resolve = urlResolve;
|
|
exports.resolveObject = urlResolveObject;
|
|
exports.format = urlFormat;
|
|
|
|
exports.Url = Url;
|
|
|
|
function Url() {
|
|
this.protocol = null;
|
|
this.slashes = null;
|
|
this.auth = null;
|
|
this.host = null;
|
|
this.port = null;
|
|
this.hostname = null;
|
|
this.hash = null;
|
|
this.search = null;
|
|
this.query = null;
|
|
this.pathname = null;
|
|
this.path = null;
|
|
this.href = null;
|
|
}
|
|
|
|
|
|
var protocolPattern = /^([a-z0-9.+-]+:)/i,
|
|
portPattern = /:[0-9]*$/,
|
|
|
|
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
|
|
|
|
unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
|
|
|
|
autoEscape = ['\''].concat(unwise),
|
|
nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
|
|
hostEndingChars = ['/', '?', '#'],
|
|
hostnameMaxLen = 255,
|
|
hostnamePartPattern = /^[a-z0-9A-Z_-]{0,63}$/,
|
|
hostnamePartStart = /^([a-z0-9A-Z_-]{0,63})(.*)$/,
|
|
unsafeProtocol = {
|
|
'javascript': true,
|
|
'javascript:': true
|
|
},
|
|
hostlessProtocol = {
|
|
'javascript': true,
|
|
'javascript:': true
|
|
},
|
|
slashedProtocol = {
|
|
'http': true,
|
|
'https': true,
|
|
'ftp': true,
|
|
'gopher': true,
|
|
'file': true,
|
|
'http:': true,
|
|
'https:': true,
|
|
'ftp:': true,
|
|
'gopher:': true,
|
|
'file:': true
|
|
},
|
|
querystring = require('querystring');
|
|
|
|
function urlParse(url, parseQueryString, slashesDenoteHost) {
|
|
if (url && isObject(url) && url instanceof Url) return url;
|
|
|
|
var u = new Url;
|
|
u.parse(url, parseQueryString, slashesDenoteHost);
|
|
return u;
|
|
}
|
|
|
|
Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
|
|
if (!isString(url)) {
|
|
throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
|
|
}
|
|
|
|
var rest = url;
|
|
|
|
rest = rest.trim();
|
|
|
|
var proto = protocolPattern.exec(rest);
|
|
if (proto) {
|
|
proto = proto[0];
|
|
var lowerProto = proto.toLowerCase();
|
|
this.protocol = lowerProto;
|
|
rest = rest.substr(proto.length);
|
|
}
|
|
|
|
if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
|
|
var slashes = rest.substr(0, 2) === '//';
|
|
if (slashes && !(proto && hostlessProtocol[proto])) {
|
|
rest = rest.substr(2);
|
|
this.slashes = true;
|
|
}
|
|
}
|
|
|
|
if (!hostlessProtocol[proto] &&
|
|
(slashes || (proto && !slashedProtocol[proto]))) {
|
|
|
|
|
|
|
|
var hostEnd = -1;
|
|
for (var i = 0; i < hostEndingChars.length; i++) {
|
|
var hec = rest.indexOf(hostEndingChars[i]);
|
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
|
|
hostEnd = hec;
|
|
}
|
|
|
|
var auth, atSign;
|
|
if (hostEnd === -1) {
|
|
atSign = rest.lastIndexOf('@');
|
|
} else {
|
|
atSign = rest.lastIndexOf('@', hostEnd);
|
|
}
|
|
|
|
if (atSign !== -1) {
|
|
auth = rest.slice(0, atSign);
|
|
rest = rest.slice(atSign + 1);
|
|
this.auth = decodeURIComponent(auth);
|
|
}
|
|
|
|
hostEnd = -1;
|
|
for (var i = 0; i < nonHostChars.length; i++) {
|
|
var hec = rest.indexOf(nonHostChars[i]);
|
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
|
|
hostEnd = hec;
|
|
}
|
|
if (hostEnd === -1)
|
|
hostEnd = rest.length;
|
|
|
|
this.host = rest.slice(0, hostEnd);
|
|
rest = rest.slice(hostEnd);
|
|
|
|
this.parseHost();
|
|
|
|
this.hostname = this.hostname || '';
|
|
|
|
var ipv6Hostname = this.hostname[0] === '[' &&
|
|
this.hostname[this.hostname.length - 1] === ']';
|
|
|
|
if (!ipv6Hostname) {
|
|
var hostparts = this.hostname.split(/\./);
|
|
for (var i = 0, l = hostparts.length; i < l; i++) {
|
|
var part = hostparts[i];
|
|
if (!part) continue;
|
|
if (!part.match(hostnamePartPattern)) {
|
|
var newpart = '';
|
|
for (var j = 0, k = part.length; j < k; j++) {
|
|
if (part.charCodeAt(j) > 127) {
|
|
newpart += 'x';
|
|
} else {
|
|
newpart += part[j];
|
|
}
|
|
}
|
|
if (!newpart.match(hostnamePartPattern)) {
|
|
var validParts = hostparts.slice(0, i);
|
|
var notHost = hostparts.slice(i + 1);
|
|
var bit = part.match(hostnamePartStart);
|
|
if (bit) {
|
|
validParts.push(bit[1]);
|
|
notHost.unshift(bit[2]);
|
|
}
|
|
if (notHost.length) {
|
|
rest = '/' + notHost.join('.') + rest;
|
|
}
|
|
this.hostname = validParts.join('.');
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.hostname.length > hostnameMaxLen) {
|
|
this.hostname = '';
|
|
} else {
|
|
this.hostname = this.hostname.toLowerCase();
|
|
}
|
|
|
|
if (!ipv6Hostname) {
|
|
var domainArray = this.hostname.split('.');
|
|
var newOut = [];
|
|
for (var i = 0; i < domainArray.length; ++i) {
|
|
var s = domainArray[i];
|
|
newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
|
|
'xn--' + punycode.encode(s) : s);
|
|
}
|
|
this.hostname = newOut.join('.');
|
|
}
|
|
|
|
var p = this.port ? ':' + this.port : '';
|
|
var h = this.hostname || '';
|
|
this.host = h + p;
|
|
this.href += this.host;
|
|
|
|
if (ipv6Hostname) {
|
|
this.hostname = this.hostname.substr(1, this.hostname.length - 2);
|
|
if (rest[0] !== '/') {
|
|
rest = '/' + rest;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!unsafeProtocol[lowerProto]) {
|
|
|
|
for (var i = 0, l = autoEscape.length; i < l; i++) {
|
|
var ae = autoEscape[i];
|
|
var esc = encodeURIComponent(ae);
|
|
if (esc === ae) {
|
|
esc = escape(ae);
|
|
}
|
|
rest = rest.split(ae).join(esc);
|
|
}
|
|
}
|
|
|
|
|
|
var hash = rest.indexOf('#');
|
|
if (hash !== -1) {
|
|
this.hash = rest.substr(hash);
|
|
rest = rest.slice(0, hash);
|
|
}
|
|
var qm = rest.indexOf('?');
|
|
if (qm !== -1) {
|
|
this.search = rest.substr(qm);
|
|
this.query = rest.substr(qm + 1);
|
|
if (parseQueryString) {
|
|
this.query = querystring.parse(this.query);
|
|
}
|
|
rest = rest.slice(0, qm);
|
|
} else if (parseQueryString) {
|
|
this.search = '';
|
|
this.query = {};
|
|
}
|
|
if (rest) this.pathname = rest;
|
|
if (slashedProtocol[lowerProto] &&
|
|
this.hostname && !this.pathname) {
|
|
this.pathname = '/';
|
|
}
|
|
|
|
if (this.pathname || this.search) {
|
|
var p = this.pathname || '';
|
|
var s = this.search || '';
|
|
this.path = p + s;
|
|
}
|
|
|
|
this.href = this.format();
|
|
return this;
|
|
};
|
|
|
|
function urlFormat(obj) {
|
|
if (isString(obj)) obj = urlParse(obj);
|
|
if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
|
|
return obj.format();
|
|
}
|
|
|
|
Url.prototype.format = function() {
|
|
var auth = this.auth || '';
|
|
if (auth) {
|
|
auth = encodeURIComponent(auth);
|
|
auth = auth.replace(/%3A/i, ':');
|
|
auth += '@';
|
|
}
|
|
|
|
var protocol = this.protocol || '',
|
|
pathname = this.pathname || '',
|
|
hash = this.hash || '',
|
|
host = false,
|
|
query = '';
|
|
|
|
if (this.host) {
|
|
host = auth + this.host;
|
|
} else if (this.hostname) {
|
|
host = auth + (this.hostname.indexOf(':') === -1 ?
|
|
this.hostname :
|
|
'[' + this.hostname + ']');
|
|
if (this.port) {
|
|
host += ':' + this.port;
|
|
}
|
|
}
|
|
|
|
if (this.query &&
|
|
isObject(this.query) &&
|
|
Object.keys(this.query).length) {
|
|
query = querystring.stringify(this.query);
|
|
}
|
|
|
|
var search = this.search || (query && ('?' + query)) || '';
|
|
|
|
if (protocol && protocol.substr(-1) !== ':') protocol += ':';
|
|
|
|
if (this.slashes ||
|
|
(!protocol || slashedProtocol[protocol]) && host !== false) {
|
|
host = '//' + (host || '');
|
|
if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
|
|
} else if (!host) {
|
|
host = '';
|
|
}
|
|
|
|
if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
|
|
if (search && search.charAt(0) !== '?') search = '?' + search;
|
|
|
|
pathname = pathname.replace(/[?#]/g, function(match) {
|
|
return encodeURIComponent(match);
|
|
});
|
|
search = search.replace('#', '%23');
|
|
|
|
return protocol + host + pathname + search + hash;
|
|
};
|
|
|
|
function urlResolve(source, relative) {
|
|
return urlParse(source, false, true).resolve(relative);
|
|
}
|
|
|
|
Url.prototype.resolve = function(relative) {
|
|
return this.resolveObject(urlParse(relative, false, true)).format();
|
|
};
|
|
|
|
function urlResolveObject(source, relative) {
|
|
if (!source) return relative;
|
|
return urlParse(source, false, true).resolveObject(relative);
|
|
}
|
|
|
|
Url.prototype.resolveObject = function(relative) {
|
|
if (isString(relative)) {
|
|
var rel = new Url();
|
|
rel.parse(relative, false, true);
|
|
relative = rel;
|
|
}
|
|
|
|
var result = new Url();
|
|
Object.keys(this).forEach(function(k) {
|
|
result[k] = this[k];
|
|
}, this);
|
|
|
|
result.hash = relative.hash;
|
|
|
|
if (relative.href === '') {
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
if (relative.slashes && !relative.protocol) {
|
|
Object.keys(relative).forEach(function(k) {
|
|
if (k !== 'protocol')
|
|
result[k] = relative[k];
|
|
});
|
|
|
|
if (slashedProtocol[result.protocol] &&
|
|
result.hostname && !result.pathname) {
|
|
result.path = result.pathname = '/';
|
|
}
|
|
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
if (relative.protocol && relative.protocol !== result.protocol) {
|
|
if (!slashedProtocol[relative.protocol]) {
|
|
Object.keys(relative).forEach(function(k) {
|
|
result[k] = relative[k];
|
|
});
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
result.protocol = relative.protocol;
|
|
if (!relative.host && !hostlessProtocol[relative.protocol]) {
|
|
var relPath = (relative.pathname || '').split('/');
|
|
while (relPath.length && !(relative.host = relPath.shift()));
|
|
if (!relative.host) relative.host = '';
|
|
if (!relative.hostname) relative.hostname = '';
|
|
if (relPath[0] !== '') relPath.unshift('');
|
|
if (relPath.length < 2) relPath.unshift('');
|
|
result.pathname = relPath.join('/');
|
|
} else {
|
|
result.pathname = relative.pathname;
|
|
}
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
result.host = relative.host || '';
|
|
result.auth = relative.auth;
|
|
result.hostname = relative.hostname || relative.host;
|
|
result.port = relative.port;
|
|
if (result.pathname || result.search) {
|
|
var p = result.pathname || '';
|
|
var s = result.search || '';
|
|
result.path = p + s;
|
|
}
|
|
result.slashes = result.slashes || relative.slashes;
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
|
|
isRelAbs = (
|
|
relative.host ||
|
|
relative.pathname && relative.pathname.charAt(0) === '/'
|
|
),
|
|
mustEndAbs = (isRelAbs || isSourceAbs ||
|
|
(result.host && relative.pathname)),
|
|
removeAllDots = mustEndAbs,
|
|
srcPath = result.pathname && result.pathname.split('/') || [],
|
|
relPath = relative.pathname && relative.pathname.split('/') || [],
|
|
psychotic = result.protocol && !slashedProtocol[result.protocol];
|
|
|
|
if (psychotic) {
|
|
result.hostname = '';
|
|
result.port = null;
|
|
if (result.host) {
|
|
if (srcPath[0] === '') srcPath[0] = result.host;
|
|
else srcPath.unshift(result.host);
|
|
}
|
|
result.host = '';
|
|
if (relative.protocol) {
|
|
relative.hostname = null;
|
|
relative.port = null;
|
|
if (relative.host) {
|
|
if (relPath[0] === '') relPath[0] = relative.host;
|
|
else relPath.unshift(relative.host);
|
|
}
|
|
relative.host = null;
|
|
}
|
|
mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
|
|
}
|
|
|
|
if (isRelAbs) {
|
|
result.host = (relative.host || relative.host === '') ?
|
|
relative.host : result.host;
|
|
result.hostname = (relative.hostname || relative.hostname === '') ?
|
|
relative.hostname : result.hostname;
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
srcPath = relPath;
|
|
} else if (relPath.length) {
|
|
if (!srcPath) srcPath = [];
|
|
srcPath.pop();
|
|
srcPath = srcPath.concat(relPath);
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
} else if (!isNullOrUndefined(relative.search)) {
|
|
if (psychotic) {
|
|
result.hostname = result.host = srcPath.shift();
|
|
var authInHost = result.host && result.host.indexOf('@') > 0 ?
|
|
result.host.split('@') : false;
|
|
if (authInHost) {
|
|
result.auth = authInHost.shift();
|
|
result.host = result.hostname = authInHost.shift();
|
|
}
|
|
}
|
|
result.search = relative.search;
|
|
result.query = relative.query;
|
|
if (!isNull(result.pathname) || !isNull(result.search)) {
|
|
result.path = (result.pathname ? result.pathname : '') +
|
|
(result.search ? result.search : '');
|
|
}
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
if (!srcPath.length) {
|
|
result.pathname = null;
|
|
if (result.search) {
|
|
result.path = '/' + result.search;
|
|
} else {
|
|
result.path = null;
|
|
}
|
|
result.href = result.format();
|
|
return result;
|
|
}
|
|
|
|
var last = srcPath.slice(-1)[0];
|
|
var hasTrailingSlash = (
|
|
(result.host || relative.host) && (last === '.' || last === '..') ||
|
|
last === '');
|
|
|
|
var up = 0;
|
|
for (var i = srcPath.length; i >= 0; i--) {
|
|
last = srcPath[i];
|
|
if (last == '.') {
|
|
srcPath.splice(i, 1);
|
|
} else if (last === '..') {
|
|
srcPath.splice(i, 1);
|
|
up++;
|
|
} else if (up) {
|
|
srcPath.splice(i, 1);
|
|
up--;
|
|
}
|
|
}
|
|
|
|
if (!mustEndAbs && !removeAllDots) {
|
|
for (; up--; up) {
|
|
srcPath.unshift('..');
|
|
}
|
|
}
|
|
|
|
if (mustEndAbs && srcPath[0] !== '' &&
|
|
(!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
|
|
srcPath.unshift('');
|
|
}
|
|
|
|
if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
|
|
srcPath.push('');
|
|
}
|
|
|
|
var isAbsolute = srcPath[0] === '' ||
|
|
(srcPath[0] && srcPath[0].charAt(0) === '/');
|
|
|
|
if (psychotic) {
|
|
result.hostname = result.host = isAbsolute ? '' :
|
|
srcPath.length ? srcPath.shift() : '';
|
|
var authInHost = result.host && result.host.indexOf('@') > 0 ?
|
|
result.host.split('@') : false;
|
|
if (authInHost) {
|
|
result.auth = authInHost.shift();
|
|
result.host = result.hostname = authInHost.shift();
|
|
}
|
|
}
|
|
|
|
mustEndAbs = mustEndAbs || (result.host && srcPath.length);
|
|
|
|
if (mustEndAbs && !isAbsolute) {
|
|
srcPath.unshift('');
|
|
}
|
|
|
|
if (!srcPath.length) {
|
|
result.pathname = null;
|
|
result.path = null;
|
|
} else {
|
|
result.pathname = srcPath.join('/');
|
|
}
|
|
|
|
if (!isNull(result.pathname) || !isNull(result.search)) {
|
|
result.path = (result.pathname ? result.pathname : '') +
|
|
(result.search ? result.search : '');
|
|
}
|
|
result.auth = relative.auth || result.auth;
|
|
result.slashes = result.slashes || relative.slashes;
|
|
result.href = result.format();
|
|
return result;
|
|
};
|
|
|
|
Url.prototype.parseHost = function() {
|
|
var host = this.host;
|
|
var port = portPattern.exec(host);
|
|
if (port) {
|
|
port = port[0];
|
|
if (port !== ':') {
|
|
this.port = port.substr(1);
|
|
}
|
|
host = host.substr(0, host.length - port.length);
|
|
}
|
|
if (host) this.hostname = host;
|
|
};
|
|
|
|
function isString(arg) {
|
|
return typeof arg === "string";
|
|
}
|
|
|
|
function isObject(arg) {
|
|
return typeof arg === 'object' && arg !== null;
|
|
}
|
|
|
|
function isNull(arg) {
|
|
return arg === null;
|
|
}
|
|
function isNullOrUndefined(arg) {
|
|
return arg == null;
|
|
}
|
|
|
|
},{"punycode":281,"querystring":284}],317:[function(require,module,exports){
|
|
(function (global){
|
|
|
|
|
|
|
|
module.exports = deprecate;
|
|
|
|
|
|
|
|
function deprecate (fn, msg) {
|
|
if (config('noDeprecation')) {
|
|
return fn;
|
|
}
|
|
|
|
var warned = false;
|
|
function deprecated() {
|
|
if (!warned) {
|
|
if (config('throwDeprecation')) {
|
|
throw new Error(msg);
|
|
} else if (config('traceDeprecation')) {
|
|
console.trace(msg);
|
|
} else {
|
|
console.warn(msg);
|
|
}
|
|
warned = true;
|
|
}
|
|
return fn.apply(this, arguments);
|
|
}
|
|
|
|
return deprecated;
|
|
}
|
|
|
|
|
|
|
|
function config (name) {
|
|
try {
|
|
if (!global.localStorage) return false;
|
|
} catch (_) {
|
|
return false;
|
|
}
|
|
var val = global.localStorage[name];
|
|
if (null == val) return false;
|
|
return String(val).toLowerCase() === 'true';
|
|
}
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],318:[function(require,module,exports){
|
|
arguments[4][190][0].apply(exports,arguments)
|
|
},{"dup":190}],319:[function(require,module,exports){
|
|
module.exports = function isBuffer(arg) {
|
|
return arg && typeof arg === 'object'
|
|
&& typeof arg.copy === 'function'
|
|
&& typeof arg.fill === 'function'
|
|
&& typeof arg.readUInt8 === 'function';
|
|
}
|
|
},{}],320:[function(require,module,exports){
|
|
(function (process,global){
|
|
|
|
var formatRegExp = /%[sdj%]/g;
|
|
exports.format = function(f) {
|
|
if (!isString(f)) {
|
|
var objects = [];
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
objects.push(inspect(arguments[i]));
|
|
}
|
|
return objects.join(' ');
|
|
}
|
|
|
|
var i = 1;
|
|
var args = arguments;
|
|
var len = args.length;
|
|
var str = String(f).replace(formatRegExp, function(x) {
|
|
if (x === '%%') return '%';
|
|
if (i >= len) return x;
|
|
switch (x) {
|
|
case '%s': return String(args[i++]);
|
|
case '%d': return Number(args[i++]);
|
|
case '%j':
|
|
try {
|
|
return JSON.stringify(args[i++]);
|
|
} catch (_) {
|
|
return '[Circular]';
|
|
}
|
|
default:
|
|
return x;
|
|
}
|
|
});
|
|
for (var x = args[i]; i < len; x = args[++i]) {
|
|
if (isNull(x) || !isObject(x)) {
|
|
str += ' ' + x;
|
|
} else {
|
|
str += ' ' + inspect(x);
|
|
}
|
|
}
|
|
return str;
|
|
};
|
|
|
|
|
|
exports.deprecate = function(fn, msg) {
|
|
if (isUndefined(global.process)) {
|
|
return function() {
|
|
return exports.deprecate(fn, msg).apply(this, arguments);
|
|
};
|
|
}
|
|
|
|
if (process.noDeprecation === true) {
|
|
return fn;
|
|
}
|
|
|
|
var warned = false;
|
|
function deprecated() {
|
|
if (!warned) {
|
|
if (process.throwDeprecation) {
|
|
throw new Error(msg);
|
|
} else if (process.traceDeprecation) {
|
|
console.trace(msg);
|
|
} else {
|
|
console.error(msg);
|
|
}
|
|
warned = true;
|
|
}
|
|
return fn.apply(this, arguments);
|
|
}
|
|
|
|
return deprecated;
|
|
};
|
|
|
|
|
|
var debugs = {};
|
|
var debugEnviron;
|
|
exports.debuglog = function(set) {
|
|
if (isUndefined(debugEnviron))
|
|
debugEnviron = process.env.NODE_DEBUG || '';
|
|
set = set.toUpperCase();
|
|
if (!debugs[set]) {
|
|
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
|
var pid = process.pid;
|
|
debugs[set] = function() {
|
|
var msg = exports.format.apply(exports, arguments);
|
|
console.error('%s %d: %s', set, pid, msg);
|
|
};
|
|
} else {
|
|
debugs[set] = function() {};
|
|
}
|
|
}
|
|
return debugs[set];
|
|
};
|
|
|
|
|
|
|
|
|
|
function inspect(obj, opts) {
|
|
var ctx = {
|
|
seen: [],
|
|
stylize: stylizeNoColor
|
|
};
|
|
if (arguments.length >= 3) ctx.depth = arguments[2];
|
|
if (arguments.length >= 4) ctx.colors = arguments[3];
|
|
if (isBoolean(opts)) {
|
|
ctx.showHidden = opts;
|
|
} else if (opts) {
|
|
exports._extend(ctx, opts);
|
|
}
|
|
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
|
if (isUndefined(ctx.depth)) ctx.depth = 2;
|
|
if (isUndefined(ctx.colors)) ctx.colors = false;
|
|
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
|
if (ctx.colors) ctx.stylize = stylizeWithColor;
|
|
return formatValue(ctx, obj, ctx.depth);
|
|
}
|
|
exports.inspect = inspect;
|
|
|
|
|
|
inspect.colors = {
|
|
'bold' : [1, 22],
|
|
'italic' : [3, 23],
|
|
'underline' : [4, 24],
|
|
'inverse' : [7, 27],
|
|
'white' : [37, 39],
|
|
'grey' : [90, 39],
|
|
'black' : [30, 39],
|
|
'blue' : [34, 39],
|
|
'cyan' : [36, 39],
|
|
'green' : [32, 39],
|
|
'magenta' : [35, 39],
|
|
'red' : [31, 39],
|
|
'yellow' : [33, 39]
|
|
};
|
|
|
|
inspect.styles = {
|
|
'special': 'cyan',
|
|
'number': 'yellow',
|
|
'boolean': 'yellow',
|
|
'undefined': 'grey',
|
|
'null': 'bold',
|
|
'string': 'green',
|
|
'date': 'magenta',
|
|
'regexp': 'red'
|
|
};
|
|
|
|
|
|
function stylizeWithColor(str, styleType) {
|
|
var style = inspect.styles[styleType];
|
|
|
|
if (style) {
|
|
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
|
'\u001b[' + inspect.colors[style][1] + 'm';
|
|
} else {
|
|
return str;
|
|
}
|
|
}
|
|
|
|
|
|
function stylizeNoColor(str, styleType) {
|
|
return str;
|
|
}
|
|
|
|
|
|
function arrayToHash(array) {
|
|
var hash = {};
|
|
|
|
array.forEach(function(val, idx) {
|
|
hash[val] = true;
|
|
});
|
|
|
|
return hash;
|
|
}
|
|
|
|
|
|
function formatValue(ctx, value, recurseTimes) {
|
|
if (ctx.customInspect &&
|
|
value &&
|
|
isFunction(value.inspect) &&
|
|
value.inspect !== exports.inspect &&
|
|
!(value.constructor && value.constructor.prototype === value)) {
|
|
var ret = value.inspect(recurseTimes, ctx);
|
|
if (!isString(ret)) {
|
|
ret = formatValue(ctx, ret, recurseTimes);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
var primitive = formatPrimitive(ctx, value);
|
|
if (primitive) {
|
|
return primitive;
|
|
}
|
|
|
|
var keys = Object.keys(value);
|
|
var visibleKeys = arrayToHash(keys);
|
|
|
|
if (ctx.showHidden) {
|
|
keys = Object.getOwnPropertyNames(value);
|
|
}
|
|
|
|
if (isError(value)
|
|
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
|
return formatError(value);
|
|
}
|
|
|
|
if (keys.length === 0) {
|
|
if (isFunction(value)) {
|
|
var name = value.name ? ': ' + value.name : '';
|
|
return ctx.stylize('[Function' + name + ']', 'special');
|
|
}
|
|
if (isRegExp(value)) {
|
|
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
|
}
|
|
if (isDate(value)) {
|
|
return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
|
}
|
|
if (isError(value)) {
|
|
return formatError(value);
|
|
}
|
|
}
|
|
|
|
var base = '', array = false, braces = ['{', '}'];
|
|
|
|
if (isArray(value)) {
|
|
array = true;
|
|
braces = ['[', ']'];
|
|
}
|
|
|
|
if (isFunction(value)) {
|
|
var n = value.name ? ': ' + value.name : '';
|
|
base = ' [Function' + n + ']';
|
|
}
|
|
|
|
if (isRegExp(value)) {
|
|
base = ' ' + RegExp.prototype.toString.call(value);
|
|
}
|
|
|
|
if (isDate(value)) {
|
|
base = ' ' + Date.prototype.toUTCString.call(value);
|
|
}
|
|
|
|
if (isError(value)) {
|
|
base = ' ' + formatError(value);
|
|
}
|
|
|
|
if (keys.length === 0 && (!array || value.length == 0)) {
|
|
return braces[0] + base + braces[1];
|
|
}
|
|
|
|
if (recurseTimes < 0) {
|
|
if (isRegExp(value)) {
|
|
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
|
} else {
|
|
return ctx.stylize('[Object]', 'special');
|
|
}
|
|
}
|
|
|
|
ctx.seen.push(value);
|
|
|
|
var output;
|
|
if (array) {
|
|
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
|
} else {
|
|
output = keys.map(function(key) {
|
|
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
|
});
|
|
}
|
|
|
|
ctx.seen.pop();
|
|
|
|
return reduceToSingleString(output, base, braces);
|
|
}
|
|
|
|
|
|
function formatPrimitive(ctx, value) {
|
|
if (isUndefined(value))
|
|
return ctx.stylize('undefined', 'undefined');
|
|
if (isString(value)) {
|
|
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
|
.replace(/'/g, "\\'")
|
|
.replace(/\\"/g, '"') + '\'';
|
|
return ctx.stylize(simple, 'string');
|
|
}
|
|
if (isNumber(value))
|
|
return ctx.stylize('' + value, 'number');
|
|
if (isBoolean(value))
|
|
return ctx.stylize('' + value, 'boolean');
|
|
if (isNull(value))
|
|
return ctx.stylize('null', 'null');
|
|
}
|
|
|
|
|
|
function formatError(value) {
|
|
return '[' + Error.prototype.toString.call(value) + ']';
|
|
}
|
|
|
|
|
|
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
|
var output = [];
|
|
for (var i = 0, l = value.length; i < l; ++i) {
|
|
if (hasOwnProperty(value, String(i))) {
|
|
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
|
String(i), true));
|
|
} else {
|
|
output.push('');
|
|
}
|
|
}
|
|
keys.forEach(function(key) {
|
|
if (!key.match(/^\d+$/)) {
|
|
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
|
key, true));
|
|
}
|
|
});
|
|
return output;
|
|
}
|
|
|
|
|
|
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
|
var name, str, desc;
|
|
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
|
if (desc.get) {
|
|
if (desc.set) {
|
|
str = ctx.stylize('[Getter/Setter]', 'special');
|
|
} else {
|
|
str = ctx.stylize('[Getter]', 'special');
|
|
}
|
|
} else {
|
|
if (desc.set) {
|
|
str = ctx.stylize('[Setter]', 'special');
|
|
}
|
|
}
|
|
if (!hasOwnProperty(visibleKeys, key)) {
|
|
name = '[' + key + ']';
|
|
}
|
|
if (!str) {
|
|
if (ctx.seen.indexOf(desc.value) < 0) {
|
|
if (isNull(recurseTimes)) {
|
|
str = formatValue(ctx, desc.value, null);
|
|
} else {
|
|
str = formatValue(ctx, desc.value, recurseTimes - 1);
|
|
}
|
|
if (str.indexOf('\n') > -1) {
|
|
if (array) {
|
|
str = str.split('\n').map(function(line) {
|
|
return ' ' + line;
|
|
}).join('\n').substr(2);
|
|
} else {
|
|
str = '\n' + str.split('\n').map(function(line) {
|
|
return ' ' + line;
|
|
}).join('\n');
|
|
}
|
|
}
|
|
} else {
|
|
str = ctx.stylize('[Circular]', 'special');
|
|
}
|
|
}
|
|
if (isUndefined(name)) {
|
|
if (array && key.match(/^\d+$/)) {
|
|
return str;
|
|
}
|
|
name = JSON.stringify('' + key);
|
|
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
|
name = name.substr(1, name.length - 2);
|
|
name = ctx.stylize(name, 'name');
|
|
} else {
|
|
name = name.replace(/'/g, "\\'")
|
|
.replace(/\\"/g, '"')
|
|
.replace(/(^"|"$)/g, "'");
|
|
name = ctx.stylize(name, 'string');
|
|
}
|
|
}
|
|
|
|
return name + ': ' + str;
|
|
}
|
|
|
|
|
|
function reduceToSingleString(output, base, braces) {
|
|
var numLinesEst = 0;
|
|
var length = output.reduce(function(prev, cur) {
|
|
numLinesEst++;
|
|
if (cur.indexOf('\n') >= 0) numLinesEst++;
|
|
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
|
}, 0);
|
|
|
|
if (length > 60) {
|
|
return braces[0] +
|
|
(base === '' ? '' : base + '\n ') +
|
|
' ' +
|
|
output.join(',\n ') +
|
|
' ' +
|
|
braces[1];
|
|
}
|
|
|
|
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
|
}
|
|
|
|
|
|
function isArray(ar) {
|
|
return Array.isArray(ar);
|
|
}
|
|
exports.isArray = isArray;
|
|
|
|
function isBoolean(arg) {
|
|
return typeof arg === 'boolean';
|
|
}
|
|
exports.isBoolean = isBoolean;
|
|
|
|
function isNull(arg) {
|
|
return arg === null;
|
|
}
|
|
exports.isNull = isNull;
|
|
|
|
function isNullOrUndefined(arg) {
|
|
return arg == null;
|
|
}
|
|
exports.isNullOrUndefined = isNullOrUndefined;
|
|
|
|
function isNumber(arg) {
|
|
return typeof arg === 'number';
|
|
}
|
|
exports.isNumber = isNumber;
|
|
|
|
function isString(arg) {
|
|
return typeof arg === 'string';
|
|
}
|
|
exports.isString = isString;
|
|
|
|
function isSymbol(arg) {
|
|
return typeof arg === 'symbol';
|
|
}
|
|
exports.isSymbol = isSymbol;
|
|
|
|
function isUndefined(arg) {
|
|
return arg === void 0;
|
|
}
|
|
exports.isUndefined = isUndefined;
|
|
|
|
function isRegExp(re) {
|
|
return isObject(re) && objectToString(re) === '[object RegExp]';
|
|
}
|
|
exports.isRegExp = isRegExp;
|
|
|
|
function isObject(arg) {
|
|
return typeof arg === 'object' && arg !== null;
|
|
}
|
|
exports.isObject = isObject;
|
|
|
|
function isDate(d) {
|
|
return isObject(d) && objectToString(d) === '[object Date]';
|
|
}
|
|
exports.isDate = isDate;
|
|
|
|
function isError(e) {
|
|
return isObject(e) &&
|
|
(objectToString(e) === '[object Error]' || e instanceof Error);
|
|
}
|
|
exports.isError = isError;
|
|
|
|
function isFunction(arg) {
|
|
return typeof arg === 'function';
|
|
}
|
|
exports.isFunction = isFunction;
|
|
|
|
function isPrimitive(arg) {
|
|
return arg === null ||
|
|
typeof arg === 'boolean' ||
|
|
typeof arg === 'number' ||
|
|
typeof arg === 'string' ||
|
|
typeof arg === 'symbol' || // ES6 symbol
|
|
typeof arg === 'undefined';
|
|
}
|
|
exports.isPrimitive = isPrimitive;
|
|
|
|
exports.isBuffer = require('./support/isBuffer');
|
|
|
|
function objectToString(o) {
|
|
return Object.prototype.toString.call(o);
|
|
}
|
|
|
|
|
|
function pad(n) {
|
|
return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
|
}
|
|
|
|
|
|
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
|
'Oct', 'Nov', 'Dec'];
|
|
|
|
function timestamp() {
|
|
var d = new Date();
|
|
var time = [pad(d.getHours()),
|
|
pad(d.getMinutes()),
|
|
pad(d.getSeconds())].join(':');
|
|
return [d.getDate(), months[d.getMonth()], time].join(' ');
|
|
}
|
|
|
|
|
|
exports.log = function() {
|
|
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
|
};
|
|
|
|
|
|
|
|
exports.inherits = require('inherits');
|
|
|
|
exports._extend = function(origin, add) {
|
|
if (!add || !isObject(add)) return origin;
|
|
|
|
var keys = Object.keys(add);
|
|
var i = keys.length;
|
|
while (i--) {
|
|
origin[keys[i]] = add[keys[i]];
|
|
}
|
|
return origin;
|
|
};
|
|
|
|
function hasOwnProperty(obj, prop) {
|
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
}
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{"./support/isBuffer":319,"_process":274,"inherits":318}],321:[function(require,module,exports){
|
|
(function (global){
|
|
|
|
var rng;
|
|
|
|
var crypto = global.crypto || global.msCrypto; // for IE 11
|
|
if (crypto && crypto.getRandomValues) {
|
|
var _rnds8 = new Uint8Array(16);
|
|
rng = function whatwgRNG() {
|
|
crypto.getRandomValues(_rnds8);
|
|
return _rnds8;
|
|
};
|
|
}
|
|
|
|
if (!rng) {
|
|
var _rnds = new Array(16);
|
|
rng = function() {
|
|
for (var i = 0, r; i < 16; i++) {
|
|
if ((i & 0x03) === 0) r = Math.random() * 0x100000000;
|
|
_rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
|
|
}
|
|
|
|
return _rnds;
|
|
};
|
|
}
|
|
|
|
module.exports = rng;
|
|
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
},{}],322:[function(require,module,exports){
|
|
var _rng = require('./lib/rng');
|
|
|
|
var _byteToHex = [];
|
|
var _hexToByte = {};
|
|
for (var i = 0; i < 256; ++i) {
|
|
_byteToHex[i] = (i + 0x100).toString(16).substr(1);
|
|
_hexToByte[_byteToHex[i]] = i;
|
|
}
|
|
|
|
function buff_to_string(buf, offset) {
|
|
var i = offset || 0;
|
|
var bth = _byteToHex;
|
|
return bth[buf[i++]] + bth[buf[i++]] +
|
|
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
|
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
|
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
|
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
|
bth[buf[i++]] + bth[buf[i++]] +
|
|
bth[buf[i++]] + bth[buf[i++]] +
|
|
bth[buf[i++]] + bth[buf[i++]];
|
|
}
|
|
|
|
|
|
var _seedBytes = _rng();
|
|
|
|
var _nodeId = [
|
|
_seedBytes[0] | 0x01,
|
|
_seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]
|
|
];
|
|
|
|
var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
|
|
|
|
var _lastMSecs = 0, _lastNSecs = 0;
|
|
|
|
function v1(options, buf, offset) {
|
|
var i = buf && offset || 0;
|
|
var b = buf || [];
|
|
|
|
options = options || {};
|
|
|
|
var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;
|
|
|
|
var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();
|
|
|
|
var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;
|
|
|
|
var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
|
|
|
|
if (dt < 0 && options.clockseq === undefined) {
|
|
clockseq = clockseq + 1 & 0x3fff;
|
|
}
|
|
|
|
if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
|
|
nsecs = 0;
|
|
}
|
|
|
|
if (nsecs >= 10000) {
|
|
throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
|
|
}
|
|
|
|
_lastMSecs = msecs;
|
|
_lastNSecs = nsecs;
|
|
_clockseq = clockseq;
|
|
|
|
msecs += 12219292800000;
|
|
|
|
var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
|
|
b[i++] = tl >>> 24 & 0xff;
|
|
b[i++] = tl >>> 16 & 0xff;
|
|
b[i++] = tl >>> 8 & 0xff;
|
|
b[i++] = tl & 0xff;
|
|
|
|
var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
|
|
b[i++] = tmh >>> 8 & 0xff;
|
|
b[i++] = tmh & 0xff;
|
|
|
|
b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
|
|
b[i++] = tmh >>> 16 & 0xff;
|
|
|
|
b[i++] = clockseq >>> 8 | 0x80;
|
|
|
|
b[i++] = clockseq & 0xff;
|
|
|
|
var node = options.node || _nodeId;
|
|
for (var n = 0; n < 6; ++n) {
|
|
b[i + n] = node[n];
|
|
}
|
|
|
|
return buf ? buf : buff_to_string(b);
|
|
}
|
|
|
|
|
|
function v4(options, buf, offset) {
|
|
var i = buf && offset || 0;
|
|
|
|
if (typeof(options) == 'string') {
|
|
buf = options == 'binary' ? new Array(16) : null;
|
|
options = null;
|
|
}
|
|
options = options || {};
|
|
|
|
var rnds = options.random || (options.rng || _rng)();
|
|
|
|
rnds[6] = (rnds[6] & 0x0f) | 0x40;
|
|
rnds[8] = (rnds[8] & 0x3f) | 0x80;
|
|
|
|
if (buf) {
|
|
for (var ii = 0; ii < 16; ++ii) {
|
|
buf[i + ii] = rnds[ii];
|
|
}
|
|
}
|
|
|
|
return buf || buff_to_string(rnds);
|
|
}
|
|
|
|
var uuid = v4;
|
|
uuid.v1 = v1;
|
|
uuid.v4 = v4;
|
|
|
|
module.exports = uuid;
|
|
|
|
},{"./lib/rng":321}],323:[function(require,module,exports){
|
|
var indexOf = require('indexof');
|
|
|
|
var Object_keys = function (obj) {
|
|
if (Object.keys) return Object.keys(obj)
|
|
else {
|
|
var res = [];
|
|
for (var key in obj) res.push(key)
|
|
return res;
|
|
}
|
|
};
|
|
|
|
var forEach = function (xs, fn) {
|
|
if (xs.forEach) return xs.forEach(fn)
|
|
else for (var i = 0; i < xs.length; i++) {
|
|
fn(xs[i], i, xs);
|
|
}
|
|
};
|
|
|
|
var defineProp = (function() {
|
|
try {
|
|
Object.defineProperty({}, '_', {});
|
|
return function(obj, name, value) {
|
|
Object.defineProperty(obj, name, {
|
|
writable: true,
|
|
enumerable: false,
|
|
configurable: true,
|
|
value: value
|
|
})
|
|
};
|
|
} catch(e) {
|
|
return function(obj, name, value) {
|
|
obj[name] = value;
|
|
};
|
|
}
|
|
}());
|
|
|
|
var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function',
|
|
'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError',
|
|
'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError',
|
|
'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape',
|
|
'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape'];
|
|
|
|
function Context() {}
|
|
Context.prototype = {};
|
|
|
|
var Script = exports.Script = function NodeScript (code) {
|
|
if (!(this instanceof Script)) return new Script(code);
|
|
this.code = code;
|
|
};
|
|
|
|
Script.prototype.runInContext = function (context) {
|
|
if (!(context instanceof Context)) {
|
|
throw new TypeError("needs a 'context' argument.");
|
|
}
|
|
|
|
var iframe = document.createElement('iframe');
|
|
if (!iframe.style) iframe.style = {};
|
|
iframe.style.display = 'none';
|
|
|
|
document.body.appendChild(iframe);
|
|
|
|
var win = iframe.contentWindow;
|
|
var wEval = win.eval, wExecScript = win.execScript;
|
|
|
|
if (!wEval && wExecScript) {
|
|
wExecScript.call(win, 'null');
|
|
wEval = win.eval;
|
|
}
|
|
|
|
forEach(Object_keys(context), function (key) {
|
|
win[key] = context[key];
|
|
});
|
|
forEach(globals, function (key) {
|
|
if (context[key]) {
|
|
win[key] = context[key];
|
|
}
|
|
});
|
|
|
|
var winKeys = Object_keys(win);
|
|
|
|
var res = wEval.call(win, this.code);
|
|
|
|
forEach(Object_keys(win), function (key) {
|
|
if (key in context || indexOf(winKeys, key) === -1) {
|
|
context[key] = win[key];
|
|
}
|
|
});
|
|
|
|
forEach(globals, function (key) {
|
|
if (!(key in context)) {
|
|
defineProp(context, key, win[key]);
|
|
}
|
|
});
|
|
|
|
document.body.removeChild(iframe);
|
|
|
|
return res;
|
|
};
|
|
|
|
Script.prototype.runInThisContext = function () {
|
|
return eval(this.code); // maybe...
|
|
};
|
|
|
|
Script.prototype.runInNewContext = function (context) {
|
|
var ctx = Script.createContext(context);
|
|
var res = this.runInContext(ctx);
|
|
|
|
forEach(Object_keys(ctx), function (key) {
|
|
context[key] = ctx[key];
|
|
});
|
|
|
|
return res;
|
|
};
|
|
|
|
forEach(Object_keys(Script.prototype), function (name) {
|
|
exports[name] = Script[name] = function (code) {
|
|
var s = Script(code);
|
|
return s[name].apply(s, [].slice.call(arguments, 1));
|
|
};
|
|
});
|
|
|
|
exports.createScript = function (code) {
|
|
return exports.Script(code);
|
|
};
|
|
|
|
exports.createContext = Script.createContext = function (context) {
|
|
var copy = new Context();
|
|
if(typeof context === 'object') {
|
|
forEach(Object_keys(context), function (key) {
|
|
copy[key] = context[key];
|
|
});
|
|
}
|
|
return copy;
|
|
};
|
|
|
|
},{"indexof":189}],324:[function(require,module,exports){
|
|
(function() {
|
|
var XMLAttribute, create;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
module.exports = XMLAttribute = (function() {
|
|
function XMLAttribute(parent, name, value) {
|
|
this.stringify = parent.stringify;
|
|
if (name == null) {
|
|
throw new Error("Missing attribute name of element " + parent.name);
|
|
}
|
|
if (value == null) {
|
|
throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
|
|
}
|
|
this.name = this.stringify.attName(name);
|
|
this.value = this.stringify.attValue(value);
|
|
}
|
|
|
|
XMLAttribute.prototype.clone = function() {
|
|
return create(XMLAttribute.prototype, this);
|
|
};
|
|
|
|
XMLAttribute.prototype.toString = function(options, level) {
|
|
return ' ' + this.name + '="' + this.value + '"';
|
|
};
|
|
|
|
return XMLAttribute;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"lodash/object/create":236}],325:[function(require,module,exports){
|
|
(function() {
|
|
var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier;
|
|
|
|
XMLStringifier = require('./XMLStringifier');
|
|
|
|
XMLDeclaration = require('./XMLDeclaration');
|
|
|
|
XMLDocType = require('./XMLDocType');
|
|
|
|
XMLElement = require('./XMLElement');
|
|
|
|
module.exports = XMLBuilder = (function() {
|
|
function XMLBuilder(name, options) {
|
|
var root, temp;
|
|
if (name == null) {
|
|
throw new Error("Root element needs a name");
|
|
}
|
|
if (options == null) {
|
|
options = {};
|
|
}
|
|
this.options = options;
|
|
this.stringify = new XMLStringifier(options);
|
|
temp = new XMLElement(this, 'doc');
|
|
root = temp.element(name);
|
|
root.isRoot = true;
|
|
root.documentObject = this;
|
|
this.rootObject = root;
|
|
if (!options.headless) {
|
|
root.declaration(options);
|
|
if ((options.pubID != null) || (options.sysID != null)) {
|
|
root.doctype(options);
|
|
}
|
|
}
|
|
}
|
|
|
|
XMLBuilder.prototype.root = function() {
|
|
return this.rootObject;
|
|
};
|
|
|
|
XMLBuilder.prototype.end = function(options) {
|
|
return this.toString(options);
|
|
};
|
|
|
|
XMLBuilder.prototype.toString = function(options) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
r = '';
|
|
if (this.xmldec != null) {
|
|
r += this.xmldec.toString(options);
|
|
}
|
|
if (this.doctype != null) {
|
|
r += this.doctype.toString(options);
|
|
}
|
|
r += this.rootObject.toString(options);
|
|
if (pretty && r.slice(-newline.length) === newline) {
|
|
r = r.slice(0, -newline.length);
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLBuilder;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLDeclaration":332,"./XMLDocType":333,"./XMLElement":334,"./XMLStringifier":338}],326:[function(require,module,exports){
|
|
(function() {
|
|
var XMLCData, XMLNode, create,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
XMLNode = require('./XMLNode');
|
|
|
|
module.exports = XMLCData = (function(superClass) {
|
|
extend(XMLCData, superClass);
|
|
|
|
function XMLCData(parent, text) {
|
|
XMLCData.__super__.constructor.call(this, parent);
|
|
if (text == null) {
|
|
throw new Error("Missing CDATA text");
|
|
}
|
|
this.text = this.stringify.cdata(text);
|
|
}
|
|
|
|
XMLCData.prototype.clone = function() {
|
|
return create(XMLCData.prototype, this);
|
|
};
|
|
|
|
XMLCData.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<![CDATA[' + this.text + ']]>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLCData;
|
|
|
|
})(XMLNode);
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLNode":335,"lodash/object/create":236}],327:[function(require,module,exports){
|
|
(function() {
|
|
var XMLComment, XMLNode, create,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
XMLNode = require('./XMLNode');
|
|
|
|
module.exports = XMLComment = (function(superClass) {
|
|
extend(XMLComment, superClass);
|
|
|
|
function XMLComment(parent, text) {
|
|
XMLComment.__super__.constructor.call(this, parent);
|
|
if (text == null) {
|
|
throw new Error("Missing comment text");
|
|
}
|
|
this.text = this.stringify.comment(text);
|
|
}
|
|
|
|
XMLComment.prototype.clone = function() {
|
|
return create(XMLComment.prototype, this);
|
|
};
|
|
|
|
XMLComment.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<!-- ' + this.text + ' -->';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLComment;
|
|
|
|
})(XMLNode);
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLNode":335,"lodash/object/create":236}],328:[function(require,module,exports){
|
|
(function() {
|
|
var XMLDTDAttList, create;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
module.exports = XMLDTDAttList = (function() {
|
|
function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
|
|
this.stringify = parent.stringify;
|
|
if (elementName == null) {
|
|
throw new Error("Missing DTD element name");
|
|
}
|
|
if (attributeName == null) {
|
|
throw new Error("Missing DTD attribute name");
|
|
}
|
|
if (!attributeType) {
|
|
throw new Error("Missing DTD attribute type");
|
|
}
|
|
if (!defaultValueType) {
|
|
throw new Error("Missing DTD attribute default");
|
|
}
|
|
if (defaultValueType.indexOf('#') !== 0) {
|
|
defaultValueType = '#' + defaultValueType;
|
|
}
|
|
if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
|
|
throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
|
|
}
|
|
if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
|
|
throw new Error("Default value only applies to #FIXED or #DEFAULT");
|
|
}
|
|
this.elementName = this.stringify.eleName(elementName);
|
|
this.attributeName = this.stringify.attName(attributeName);
|
|
this.attributeType = this.stringify.dtdAttType(attributeType);
|
|
this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
|
|
this.defaultValueType = defaultValueType;
|
|
}
|
|
|
|
XMLDTDAttList.prototype.clone = function() {
|
|
return create(XMLDTDAttList.prototype, this);
|
|
};
|
|
|
|
XMLDTDAttList.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<!ATTLIST ' + this.elementName + ' ' + this.attributeName + ' ' + this.attributeType;
|
|
if (this.defaultValueType !== '#DEFAULT') {
|
|
r += ' ' + this.defaultValueType;
|
|
}
|
|
if (this.defaultValue) {
|
|
r += ' "' + this.defaultValue + '"';
|
|
}
|
|
r += '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLDTDAttList;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"lodash/object/create":236}],329:[function(require,module,exports){
|
|
(function() {
|
|
var XMLDTDElement, create, isArray;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
isArray = require('lodash/lang/isArray');
|
|
|
|
module.exports = XMLDTDElement = (function() {
|
|
function XMLDTDElement(parent, name, value) {
|
|
this.stringify = parent.stringify;
|
|
if (name == null) {
|
|
throw new Error("Missing DTD element name");
|
|
}
|
|
if (!value) {
|
|
value = '(#PCDATA)';
|
|
}
|
|
if (isArray(value)) {
|
|
value = '(' + value.join(',') + ')';
|
|
}
|
|
this.name = this.stringify.eleName(name);
|
|
this.value = this.stringify.dtdElementValue(value);
|
|
}
|
|
|
|
XMLDTDElement.prototype.clone = function() {
|
|
return create(XMLDTDElement.prototype, this);
|
|
};
|
|
|
|
XMLDTDElement.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<!ELEMENT ' + this.name + ' ' + this.value + '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLDTDElement;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"lodash/lang/isArray":228,"lodash/object/create":236}],330:[function(require,module,exports){
|
|
(function() {
|
|
var XMLDTDEntity, create, isObject;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
isObject = require('lodash/lang/isObject');
|
|
|
|
module.exports = XMLDTDEntity = (function() {
|
|
function XMLDTDEntity(parent, pe, name, value) {
|
|
this.stringify = parent.stringify;
|
|
if (name == null) {
|
|
throw new Error("Missing entity name");
|
|
}
|
|
if (value == null) {
|
|
throw new Error("Missing entity value");
|
|
}
|
|
this.pe = !!pe;
|
|
this.name = this.stringify.eleName(name);
|
|
if (!isObject(value)) {
|
|
this.value = this.stringify.dtdEntityValue(value);
|
|
} else {
|
|
if (!value.pubID && !value.sysID) {
|
|
throw new Error("Public and/or system identifiers are required for an external entity");
|
|
}
|
|
if (value.pubID && !value.sysID) {
|
|
throw new Error("System identifier is required for a public external entity");
|
|
}
|
|
if (value.pubID != null) {
|
|
this.pubID = this.stringify.dtdPubID(value.pubID);
|
|
}
|
|
if (value.sysID != null) {
|
|
this.sysID = this.stringify.dtdSysID(value.sysID);
|
|
}
|
|
if (value.nData != null) {
|
|
this.nData = this.stringify.dtdNData(value.nData);
|
|
}
|
|
if (this.pe && this.nData) {
|
|
throw new Error("Notation declaration is not allowed in a parameter entity");
|
|
}
|
|
}
|
|
}
|
|
|
|
XMLDTDEntity.prototype.clone = function() {
|
|
return create(XMLDTDEntity.prototype, this);
|
|
};
|
|
|
|
XMLDTDEntity.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<!ENTITY';
|
|
if (this.pe) {
|
|
r += ' %';
|
|
}
|
|
r += ' ' + this.name;
|
|
if (this.value) {
|
|
r += ' "' + this.value + '"';
|
|
} else {
|
|
if (this.pubID && this.sysID) {
|
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
|
|
} else if (this.sysID) {
|
|
r += ' SYSTEM "' + this.sysID + '"';
|
|
}
|
|
if (this.nData) {
|
|
r += ' NDATA ' + this.nData;
|
|
}
|
|
}
|
|
r += '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLDTDEntity;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"lodash/lang/isObject":232,"lodash/object/create":236}],331:[function(require,module,exports){
|
|
(function() {
|
|
var XMLDTDNotation, create;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
module.exports = XMLDTDNotation = (function() {
|
|
function XMLDTDNotation(parent, name, value) {
|
|
this.stringify = parent.stringify;
|
|
if (name == null) {
|
|
throw new Error("Missing notation name");
|
|
}
|
|
if (!value.pubID && !value.sysID) {
|
|
throw new Error("Public or system identifiers are required for an external entity");
|
|
}
|
|
this.name = this.stringify.eleName(name);
|
|
if (value.pubID != null) {
|
|
this.pubID = this.stringify.dtdPubID(value.pubID);
|
|
}
|
|
if (value.sysID != null) {
|
|
this.sysID = this.stringify.dtdSysID(value.sysID);
|
|
}
|
|
}
|
|
|
|
XMLDTDNotation.prototype.clone = function() {
|
|
return create(XMLDTDNotation.prototype, this);
|
|
};
|
|
|
|
XMLDTDNotation.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<!NOTATION ' + this.name;
|
|
if (this.pubID && this.sysID) {
|
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
|
|
} else if (this.pubID) {
|
|
r += ' PUBLIC "' + this.pubID + '"';
|
|
} else if (this.sysID) {
|
|
r += ' SYSTEM "' + this.sysID + '"';
|
|
}
|
|
r += '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLDTDNotation;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"lodash/object/create":236}],332:[function(require,module,exports){
|
|
(function() {
|
|
var XMLDeclaration, XMLNode, create, isObject,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
isObject = require('lodash/lang/isObject');
|
|
|
|
XMLNode = require('./XMLNode');
|
|
|
|
module.exports = XMLDeclaration = (function(superClass) {
|
|
extend(XMLDeclaration, superClass);
|
|
|
|
function XMLDeclaration(parent, version, encoding, standalone) {
|
|
var ref;
|
|
XMLDeclaration.__super__.constructor.call(this, parent);
|
|
if (isObject(version)) {
|
|
ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
|
|
}
|
|
if (!version) {
|
|
version = '1.0';
|
|
}
|
|
if (version != null) {
|
|
this.version = this.stringify.xmlVersion(version);
|
|
}
|
|
if (encoding != null) {
|
|
this.encoding = this.stringify.xmlEncoding(encoding);
|
|
}
|
|
if (standalone != null) {
|
|
this.standalone = this.stringify.xmlStandalone(standalone);
|
|
}
|
|
}
|
|
|
|
XMLDeclaration.prototype.clone = function() {
|
|
return create(XMLDeclaration.prototype, this);
|
|
};
|
|
|
|
XMLDeclaration.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<?xml';
|
|
if (this.version != null) {
|
|
r += ' version="' + this.version + '"';
|
|
}
|
|
if (this.encoding != null) {
|
|
r += ' encoding="' + this.encoding + '"';
|
|
}
|
|
if (this.standalone != null) {
|
|
r += ' standalone="' + this.standalone + '"';
|
|
}
|
|
r += '?>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLDeclaration;
|
|
|
|
})(XMLNode);
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLNode":335,"lodash/lang/isObject":232,"lodash/object/create":236}],333:[function(require,module,exports){
|
|
(function() {
|
|
var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
isObject = require('lodash/lang/isObject');
|
|
|
|
XMLCData = require('./XMLCData');
|
|
|
|
XMLComment = require('./XMLComment');
|
|
|
|
XMLDTDAttList = require('./XMLDTDAttList');
|
|
|
|
XMLDTDEntity = require('./XMLDTDEntity');
|
|
|
|
XMLDTDElement = require('./XMLDTDElement');
|
|
|
|
XMLDTDNotation = require('./XMLDTDNotation');
|
|
|
|
XMLProcessingInstruction = require('./XMLProcessingInstruction');
|
|
|
|
module.exports = XMLDocType = (function() {
|
|
function XMLDocType(parent, pubID, sysID) {
|
|
var ref, ref1;
|
|
this.documentObject = parent;
|
|
this.stringify = this.documentObject.stringify;
|
|
this.children = [];
|
|
if (isObject(pubID)) {
|
|
ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
|
|
}
|
|
if (sysID == null) {
|
|
ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
|
|
}
|
|
if (pubID != null) {
|
|
this.pubID = this.stringify.dtdPubID(pubID);
|
|
}
|
|
if (sysID != null) {
|
|
this.sysID = this.stringify.dtdSysID(sysID);
|
|
}
|
|
}
|
|
|
|
XMLDocType.prototype.clone = function() {
|
|
return create(XMLDocType.prototype, this);
|
|
};
|
|
|
|
XMLDocType.prototype.element = function(name, value) {
|
|
var child;
|
|
child = new XMLDTDElement(this, name, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
|
|
var child;
|
|
child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.entity = function(name, value) {
|
|
var child;
|
|
child = new XMLDTDEntity(this, false, name, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.pEntity = function(name, value) {
|
|
var child;
|
|
child = new XMLDTDEntity(this, true, name, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.notation = function(name, value) {
|
|
var child;
|
|
child = new XMLDTDNotation(this, name, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.cdata = function(value) {
|
|
var child;
|
|
child = new XMLCData(this, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.comment = function(value) {
|
|
var child;
|
|
child = new XMLComment(this, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.instruction = function(target, value) {
|
|
var child;
|
|
child = new XMLProcessingInstruction(this, target, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLDocType.prototype.root = function() {
|
|
return this.documentObject.root();
|
|
};
|
|
|
|
XMLDocType.prototype.document = function() {
|
|
return this.documentObject;
|
|
};
|
|
|
|
XMLDocType.prototype.toString = function(options, level) {
|
|
var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<!DOCTYPE ' + this.root().name;
|
|
if (this.pubID && this.sysID) {
|
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
|
|
} else if (this.sysID) {
|
|
r += ' SYSTEM "' + this.sysID + '"';
|
|
}
|
|
if (this.children.length > 0) {
|
|
r += ' [';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
ref3 = this.children;
|
|
for (i = 0, len = ref3.length; i < len; i++) {
|
|
child = ref3[i];
|
|
r += child.toString(options, level + 1);
|
|
}
|
|
r += ']';
|
|
}
|
|
r += '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
XMLDocType.prototype.ele = function(name, value) {
|
|
return this.element(name, value);
|
|
};
|
|
|
|
XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
|
|
return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
|
|
};
|
|
|
|
XMLDocType.prototype.ent = function(name, value) {
|
|
return this.entity(name, value);
|
|
};
|
|
|
|
XMLDocType.prototype.pent = function(name, value) {
|
|
return this.pEntity(name, value);
|
|
};
|
|
|
|
XMLDocType.prototype.not = function(name, value) {
|
|
return this.notation(name, value);
|
|
};
|
|
|
|
XMLDocType.prototype.dat = function(value) {
|
|
return this.cdata(value);
|
|
};
|
|
|
|
XMLDocType.prototype.com = function(value) {
|
|
return this.comment(value);
|
|
};
|
|
|
|
XMLDocType.prototype.ins = function(target, value) {
|
|
return this.instruction(target, value);
|
|
};
|
|
|
|
XMLDocType.prototype.up = function() {
|
|
return this.root();
|
|
};
|
|
|
|
XMLDocType.prototype.doc = function() {
|
|
return this.document();
|
|
};
|
|
|
|
return XMLDocType;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLCData":326,"./XMLComment":327,"./XMLDTDAttList":328,"./XMLDTDElement":329,"./XMLDTDEntity":330,"./XMLDTDNotation":331,"./XMLProcessingInstruction":336,"lodash/lang/isObject":232,"lodash/object/create":236}],334:[function(require,module,exports){
|
|
(function() {
|
|
var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isArray, isFunction, isObject,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
isObject = require('lodash/lang/isObject');
|
|
|
|
isArray = require('lodash/lang/isArray');
|
|
|
|
isFunction = require('lodash/lang/isFunction');
|
|
|
|
every = require('lodash/collection/every');
|
|
|
|
XMLNode = require('./XMLNode');
|
|
|
|
XMLAttribute = require('./XMLAttribute');
|
|
|
|
XMLProcessingInstruction = require('./XMLProcessingInstruction');
|
|
|
|
module.exports = XMLElement = (function(superClass) {
|
|
extend(XMLElement, superClass);
|
|
|
|
function XMLElement(parent, name, attributes) {
|
|
XMLElement.__super__.constructor.call(this, parent);
|
|
if (name == null) {
|
|
throw new Error("Missing element name");
|
|
}
|
|
this.name = this.stringify.eleName(name);
|
|
this.children = [];
|
|
this.instructions = [];
|
|
this.attributes = {};
|
|
if (attributes != null) {
|
|
this.attribute(attributes);
|
|
}
|
|
}
|
|
|
|
XMLElement.prototype.clone = function() {
|
|
var att, attName, clonedSelf, i, len, pi, ref, ref1;
|
|
clonedSelf = create(XMLElement.prototype, this);
|
|
if (clonedSelf.isRoot) {
|
|
clonedSelf.documentObject = null;
|
|
}
|
|
clonedSelf.attributes = {};
|
|
ref = this.attributes;
|
|
for (attName in ref) {
|
|
if (!hasProp.call(ref, attName)) continue;
|
|
att = ref[attName];
|
|
clonedSelf.attributes[attName] = att.clone();
|
|
}
|
|
clonedSelf.instructions = [];
|
|
ref1 = this.instructions;
|
|
for (i = 0, len = ref1.length; i < len; i++) {
|
|
pi = ref1[i];
|
|
clonedSelf.instructions.push(pi.clone());
|
|
}
|
|
clonedSelf.children = [];
|
|
this.children.forEach(function(child) {
|
|
var clonedChild;
|
|
clonedChild = child.clone();
|
|
clonedChild.parent = clonedSelf;
|
|
return clonedSelf.children.push(clonedChild);
|
|
});
|
|
return clonedSelf;
|
|
};
|
|
|
|
XMLElement.prototype.attribute = function(name, value) {
|
|
var attName, attValue;
|
|
if (name != null) {
|
|
name = name.valueOf();
|
|
}
|
|
if (isObject(name)) {
|
|
for (attName in name) {
|
|
if (!hasProp.call(name, attName)) continue;
|
|
attValue = name[attName];
|
|
this.attribute(attName, attValue);
|
|
}
|
|
} else {
|
|
if (isFunction(value)) {
|
|
value = value.apply();
|
|
}
|
|
if (!this.options.skipNullAttributes || (value != null)) {
|
|
this.attributes[name] = new XMLAttribute(this, name, value);
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
|
|
XMLElement.prototype.removeAttribute = function(name) {
|
|
var attName, i, len;
|
|
if (name == null) {
|
|
throw new Error("Missing attribute name");
|
|
}
|
|
name = name.valueOf();
|
|
if (isArray(name)) {
|
|
for (i = 0, len = name.length; i < len; i++) {
|
|
attName = name[i];
|
|
delete this.attributes[attName];
|
|
}
|
|
} else {
|
|
delete this.attributes[name];
|
|
}
|
|
return this;
|
|
};
|
|
|
|
XMLElement.prototype.instruction = function(target, value) {
|
|
var i, insTarget, insValue, instruction, len;
|
|
if (target != null) {
|
|
target = target.valueOf();
|
|
}
|
|
if (value != null) {
|
|
value = value.valueOf();
|
|
}
|
|
if (isArray(target)) {
|
|
for (i = 0, len = target.length; i < len; i++) {
|
|
insTarget = target[i];
|
|
this.instruction(insTarget);
|
|
}
|
|
} else if (isObject(target)) {
|
|
for (insTarget in target) {
|
|
if (!hasProp.call(target, insTarget)) continue;
|
|
insValue = target[insTarget];
|
|
this.instruction(insTarget, insValue);
|
|
}
|
|
} else {
|
|
if (isFunction(value)) {
|
|
value = value.apply();
|
|
}
|
|
instruction = new XMLProcessingInstruction(this, target, value);
|
|
this.instructions.push(instruction);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
XMLElement.prototype.toString = function(options, level) {
|
|
var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
ref3 = this.instructions;
|
|
for (i = 0, len = ref3.length; i < len; i++) {
|
|
instruction = ref3[i];
|
|
r += instruction.toString(options, level + 1);
|
|
}
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<' + this.name;
|
|
ref4 = this.attributes;
|
|
for (name in ref4) {
|
|
if (!hasProp.call(ref4, name)) continue;
|
|
att = ref4[name];
|
|
r += att.toString(options);
|
|
}
|
|
if (this.children.length === 0 || every(this.children, function(e) {
|
|
return e.value === '';
|
|
})) {
|
|
r += '/>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
} else if (pretty && this.children.length === 1 && (this.children[0].value != null)) {
|
|
r += '>';
|
|
r += this.children[0].value;
|
|
r += '</' + this.name + '>';
|
|
r += newline;
|
|
} else {
|
|
r += '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
ref5 = this.children;
|
|
for (j = 0, len1 = ref5.length; j < len1; j++) {
|
|
child = ref5[j];
|
|
r += child.toString(options, level + 1);
|
|
}
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '</' + this.name + '>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
}
|
|
return r;
|
|
};
|
|
|
|
XMLElement.prototype.att = function(name, value) {
|
|
return this.attribute(name, value);
|
|
};
|
|
|
|
XMLElement.prototype.ins = function(target, value) {
|
|
return this.instruction(target, value);
|
|
};
|
|
|
|
XMLElement.prototype.a = function(name, value) {
|
|
return this.attribute(name, value);
|
|
};
|
|
|
|
XMLElement.prototype.i = function(target, value) {
|
|
return this.instruction(target, value);
|
|
};
|
|
|
|
return XMLElement;
|
|
|
|
})(XMLNode);
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLAttribute":324,"./XMLNode":335,"./XMLProcessingInstruction":336,"lodash/collection/every":194,"lodash/lang/isArray":228,"lodash/lang/isFunction":230,"lodash/lang/isObject":232,"lodash/object/create":236}],335:[function(require,module,exports){
|
|
(function() {
|
|
var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isArray, isEmpty, isFunction, isObject,
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
isObject = require('lodash/lang/isObject');
|
|
|
|
isArray = require('lodash/lang/isArray');
|
|
|
|
isFunction = require('lodash/lang/isFunction');
|
|
|
|
isEmpty = require('lodash/lang/isEmpty');
|
|
|
|
XMLElement = null;
|
|
|
|
XMLCData = null;
|
|
|
|
XMLComment = null;
|
|
|
|
XMLDeclaration = null;
|
|
|
|
XMLDocType = null;
|
|
|
|
XMLRaw = null;
|
|
|
|
XMLText = null;
|
|
|
|
module.exports = XMLNode = (function() {
|
|
function XMLNode(parent) {
|
|
this.parent = parent;
|
|
this.options = this.parent.options;
|
|
this.stringify = this.parent.stringify;
|
|
if (XMLElement === null) {
|
|
XMLElement = require('./XMLElement');
|
|
XMLCData = require('./XMLCData');
|
|
XMLComment = require('./XMLComment');
|
|
XMLDeclaration = require('./XMLDeclaration');
|
|
XMLDocType = require('./XMLDocType');
|
|
XMLRaw = require('./XMLRaw');
|
|
XMLText = require('./XMLText');
|
|
}
|
|
}
|
|
|
|
XMLNode.prototype.clone = function() {
|
|
throw new Error("Cannot clone generic XMLNode");
|
|
};
|
|
|
|
XMLNode.prototype.element = function(name, attributes, text) {
|
|
var item, j, key, lastChild, len, ref, val;
|
|
lastChild = null;
|
|
if (attributes == null) {
|
|
attributes = {};
|
|
}
|
|
attributes = attributes.valueOf();
|
|
if (!isObject(attributes)) {
|
|
ref = [attributes, text], text = ref[0], attributes = ref[1];
|
|
}
|
|
if (name != null) {
|
|
name = name.valueOf();
|
|
}
|
|
if (isArray(name)) {
|
|
for (j = 0, len = name.length; j < len; j++) {
|
|
item = name[j];
|
|
lastChild = this.element(item);
|
|
}
|
|
} else if (isFunction(name)) {
|
|
lastChild = this.element(name.apply());
|
|
} else if (isObject(name)) {
|
|
for (key in name) {
|
|
if (!hasProp.call(name, key)) continue;
|
|
val = name[key];
|
|
if (isFunction(val)) {
|
|
val = val.apply();
|
|
}
|
|
if ((isObject(val)) && (isEmpty(val))) {
|
|
val = null;
|
|
}
|
|
if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
|
|
lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
|
|
} else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) {
|
|
lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val);
|
|
} else if (isObject(val)) {
|
|
if (!this.options.ignoreDecorators && this.stringify.convertListKey && key.indexOf(this.stringify.convertListKey) === 0 && isArray(val)) {
|
|
lastChild = this.element(val);
|
|
} else {
|
|
lastChild = this.element(key);
|
|
lastChild.element(val);
|
|
}
|
|
} else {
|
|
lastChild = this.element(key, val);
|
|
}
|
|
}
|
|
} else {
|
|
if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
|
|
lastChild = this.text(text);
|
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
|
|
lastChild = this.cdata(text);
|
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
|
|
lastChild = this.comment(text);
|
|
} else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
|
|
lastChild = this.raw(text);
|
|
} else {
|
|
lastChild = this.node(name, attributes, text);
|
|
}
|
|
}
|
|
if (lastChild == null) {
|
|
throw new Error("Could not create any elements with: " + name);
|
|
}
|
|
return lastChild;
|
|
};
|
|
|
|
XMLNode.prototype.insertBefore = function(name, attributes, text) {
|
|
var child, i, removed;
|
|
if (this.isRoot) {
|
|
throw new Error("Cannot insert elements at root level");
|
|
}
|
|
i = this.parent.children.indexOf(this);
|
|
removed = this.parent.children.splice(i);
|
|
child = this.parent.element(name, attributes, text);
|
|
Array.prototype.push.apply(this.parent.children, removed);
|
|
return child;
|
|
};
|
|
|
|
XMLNode.prototype.insertAfter = function(name, attributes, text) {
|
|
var child, i, removed;
|
|
if (this.isRoot) {
|
|
throw new Error("Cannot insert elements at root level");
|
|
}
|
|
i = this.parent.children.indexOf(this);
|
|
removed = this.parent.children.splice(i + 1);
|
|
child = this.parent.element(name, attributes, text);
|
|
Array.prototype.push.apply(this.parent.children, removed);
|
|
return child;
|
|
};
|
|
|
|
XMLNode.prototype.remove = function() {
|
|
var i, ref;
|
|
if (this.isRoot) {
|
|
throw new Error("Cannot remove the root element");
|
|
}
|
|
i = this.parent.children.indexOf(this);
|
|
[].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref;
|
|
return this.parent;
|
|
};
|
|
|
|
XMLNode.prototype.node = function(name, attributes, text) {
|
|
var child, ref;
|
|
if (name != null) {
|
|
name = name.valueOf();
|
|
}
|
|
if (attributes == null) {
|
|
attributes = {};
|
|
}
|
|
attributes = attributes.valueOf();
|
|
if (!isObject(attributes)) {
|
|
ref = [attributes, text], text = ref[0], attributes = ref[1];
|
|
}
|
|
child = new XMLElement(this, name, attributes);
|
|
if (text != null) {
|
|
child.text(text);
|
|
}
|
|
this.children.push(child);
|
|
return child;
|
|
};
|
|
|
|
XMLNode.prototype.text = function(value) {
|
|
var child;
|
|
child = new XMLText(this, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLNode.prototype.cdata = function(value) {
|
|
var child;
|
|
child = new XMLCData(this, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLNode.prototype.comment = function(value) {
|
|
var child;
|
|
child = new XMLComment(this, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLNode.prototype.raw = function(value) {
|
|
var child;
|
|
child = new XMLRaw(this, value);
|
|
this.children.push(child);
|
|
return this;
|
|
};
|
|
|
|
XMLNode.prototype.declaration = function(version, encoding, standalone) {
|
|
var doc, xmldec;
|
|
doc = this.document();
|
|
xmldec = new XMLDeclaration(doc, version, encoding, standalone);
|
|
doc.xmldec = xmldec;
|
|
return doc.root();
|
|
};
|
|
|
|
XMLNode.prototype.doctype = function(pubID, sysID) {
|
|
var doc, doctype;
|
|
doc = this.document();
|
|
doctype = new XMLDocType(doc, pubID, sysID);
|
|
doc.doctype = doctype;
|
|
return doctype;
|
|
};
|
|
|
|
XMLNode.prototype.up = function() {
|
|
if (this.isRoot) {
|
|
throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
|
|
}
|
|
return this.parent;
|
|
};
|
|
|
|
XMLNode.prototype.root = function() {
|
|
var child;
|
|
if (this.isRoot) {
|
|
return this;
|
|
}
|
|
child = this.parent;
|
|
while (!child.isRoot) {
|
|
child = child.parent;
|
|
}
|
|
return child;
|
|
};
|
|
|
|
XMLNode.prototype.document = function() {
|
|
return this.root().documentObject;
|
|
};
|
|
|
|
XMLNode.prototype.end = function(options) {
|
|
return this.document().toString(options);
|
|
};
|
|
|
|
XMLNode.prototype.prev = function() {
|
|
var i;
|
|
if (this.isRoot) {
|
|
throw new Error("Root node has no siblings");
|
|
}
|
|
i = this.parent.children.indexOf(this);
|
|
if (i < 1) {
|
|
throw new Error("Already at the first node");
|
|
}
|
|
return this.parent.children[i - 1];
|
|
};
|
|
|
|
XMLNode.prototype.next = function() {
|
|
var i;
|
|
if (this.isRoot) {
|
|
throw new Error("Root node has no siblings");
|
|
}
|
|
i = this.parent.children.indexOf(this);
|
|
if (i === -1 || i === this.parent.children.length - 1) {
|
|
throw new Error("Already at the last node");
|
|
}
|
|
return this.parent.children[i + 1];
|
|
};
|
|
|
|
XMLNode.prototype.importXMLBuilder = function(xmlbuilder) {
|
|
var clonedRoot;
|
|
clonedRoot = xmlbuilder.root().clone();
|
|
clonedRoot.parent = this;
|
|
clonedRoot.isRoot = false;
|
|
this.children.push(clonedRoot);
|
|
return this;
|
|
};
|
|
|
|
XMLNode.prototype.ele = function(name, attributes, text) {
|
|
return this.element(name, attributes, text);
|
|
};
|
|
|
|
XMLNode.prototype.nod = function(name, attributes, text) {
|
|
return this.node(name, attributes, text);
|
|
};
|
|
|
|
XMLNode.prototype.txt = function(value) {
|
|
return this.text(value);
|
|
};
|
|
|
|
XMLNode.prototype.dat = function(value) {
|
|
return this.cdata(value);
|
|
};
|
|
|
|
XMLNode.prototype.com = function(value) {
|
|
return this.comment(value);
|
|
};
|
|
|
|
XMLNode.prototype.doc = function() {
|
|
return this.document();
|
|
};
|
|
|
|
XMLNode.prototype.dec = function(version, encoding, standalone) {
|
|
return this.declaration(version, encoding, standalone);
|
|
};
|
|
|
|
XMLNode.prototype.dtd = function(pubID, sysID) {
|
|
return this.doctype(pubID, sysID);
|
|
};
|
|
|
|
XMLNode.prototype.e = function(name, attributes, text) {
|
|
return this.element(name, attributes, text);
|
|
};
|
|
|
|
XMLNode.prototype.n = function(name, attributes, text) {
|
|
return this.node(name, attributes, text);
|
|
};
|
|
|
|
XMLNode.prototype.t = function(value) {
|
|
return this.text(value);
|
|
};
|
|
|
|
XMLNode.prototype.d = function(value) {
|
|
return this.cdata(value);
|
|
};
|
|
|
|
XMLNode.prototype.c = function(value) {
|
|
return this.comment(value);
|
|
};
|
|
|
|
XMLNode.prototype.r = function(value) {
|
|
return this.raw(value);
|
|
};
|
|
|
|
XMLNode.prototype.u = function() {
|
|
return this.up();
|
|
};
|
|
|
|
return XMLNode;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLCData":326,"./XMLComment":327,"./XMLDeclaration":332,"./XMLDocType":333,"./XMLElement":334,"./XMLRaw":337,"./XMLText":339,"lodash/lang/isArray":228,"lodash/lang/isEmpty":229,"lodash/lang/isFunction":230,"lodash/lang/isObject":232}],336:[function(require,module,exports){
|
|
(function() {
|
|
var XMLProcessingInstruction, create;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
module.exports = XMLProcessingInstruction = (function() {
|
|
function XMLProcessingInstruction(parent, target, value) {
|
|
this.stringify = parent.stringify;
|
|
if (target == null) {
|
|
throw new Error("Missing instruction target");
|
|
}
|
|
this.target = this.stringify.insTarget(target);
|
|
if (value) {
|
|
this.value = this.stringify.insValue(value);
|
|
}
|
|
}
|
|
|
|
XMLProcessingInstruction.prototype.clone = function() {
|
|
return create(XMLProcessingInstruction.prototype, this);
|
|
};
|
|
|
|
XMLProcessingInstruction.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += '<?';
|
|
r += this.target;
|
|
if (this.value) {
|
|
r += ' ' + this.value;
|
|
}
|
|
r += '?>';
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLProcessingInstruction;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{"lodash/object/create":236}],337:[function(require,module,exports){
|
|
(function() {
|
|
var XMLNode, XMLRaw, create,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
XMLNode = require('./XMLNode');
|
|
|
|
module.exports = XMLRaw = (function(superClass) {
|
|
extend(XMLRaw, superClass);
|
|
|
|
function XMLRaw(parent, text) {
|
|
XMLRaw.__super__.constructor.call(this, parent);
|
|
if (text == null) {
|
|
throw new Error("Missing raw text");
|
|
}
|
|
this.value = this.stringify.raw(text);
|
|
}
|
|
|
|
XMLRaw.prototype.clone = function() {
|
|
return create(XMLRaw.prototype, this);
|
|
};
|
|
|
|
XMLRaw.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += this.value;
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLRaw;
|
|
|
|
})(XMLNode);
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLNode":335,"lodash/object/create":236}],338:[function(require,module,exports){
|
|
(function() {
|
|
var XMLStringifier,
|
|
bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
module.exports = XMLStringifier = (function() {
|
|
function XMLStringifier(options) {
|
|
this.assertLegalChar = bind(this.assertLegalChar, this);
|
|
var key, ref, value;
|
|
this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0;
|
|
ref = (options != null ? options.stringify : void 0) || {};
|
|
for (key in ref) {
|
|
if (!hasProp.call(ref, key)) continue;
|
|
value = ref[key];
|
|
this[key] = value;
|
|
}
|
|
}
|
|
|
|
XMLStringifier.prototype.eleName = function(val) {
|
|
val = '' + val || '';
|
|
return this.assertLegalChar(val);
|
|
};
|
|
|
|
XMLStringifier.prototype.eleText = function(val) {
|
|
val = '' + val || '';
|
|
return this.assertLegalChar(this.elEscape(val));
|
|
};
|
|
|
|
XMLStringifier.prototype.cdata = function(val) {
|
|
val = '' + val || '';
|
|
if (val.match(/]]>/)) {
|
|
throw new Error("Invalid CDATA text: " + val);
|
|
}
|
|
return this.assertLegalChar(val);
|
|
};
|
|
|
|
XMLStringifier.prototype.comment = function(val) {
|
|
val = '' + val || '';
|
|
if (val.match(/--/)) {
|
|
throw new Error("Comment text cannot contain double-hypen: " + val);
|
|
}
|
|
return this.assertLegalChar(val);
|
|
};
|
|
|
|
XMLStringifier.prototype.raw = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.attName = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.attValue = function(val) {
|
|
val = '' + val || '';
|
|
return this.attEscape(val);
|
|
};
|
|
|
|
XMLStringifier.prototype.insTarget = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.insValue = function(val) {
|
|
val = '' + val || '';
|
|
if (val.match(/\?>/)) {
|
|
throw new Error("Invalid processing instruction value: " + val);
|
|
}
|
|
return val;
|
|
};
|
|
|
|
XMLStringifier.prototype.xmlVersion = function(val) {
|
|
val = '' + val || '';
|
|
if (!val.match(/1\.[0-9]+/)) {
|
|
throw new Error("Invalid version number: " + val);
|
|
}
|
|
return val;
|
|
};
|
|
|
|
XMLStringifier.prototype.xmlEncoding = function(val) {
|
|
val = '' + val || '';
|
|
if (!val.match(/[A-Za-z](?:[A-Za-z0-9._-]|-)*/)) {
|
|
throw new Error("Invalid encoding: " + val);
|
|
}
|
|
return val;
|
|
};
|
|
|
|
XMLStringifier.prototype.xmlStandalone = function(val) {
|
|
if (val) {
|
|
return "yes";
|
|
} else {
|
|
return "no";
|
|
}
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdPubID = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdSysID = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdElementValue = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdAttType = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdAttDefault = function(val) {
|
|
if (val != null) {
|
|
return '' + val || '';
|
|
} else {
|
|
return val;
|
|
}
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdEntityValue = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.dtdNData = function(val) {
|
|
return '' + val || '';
|
|
};
|
|
|
|
XMLStringifier.prototype.convertAttKey = '@';
|
|
|
|
XMLStringifier.prototype.convertPIKey = '?';
|
|
|
|
XMLStringifier.prototype.convertTextKey = '#text';
|
|
|
|
XMLStringifier.prototype.convertCDataKey = '#cdata';
|
|
|
|
XMLStringifier.prototype.convertCommentKey = '#comment';
|
|
|
|
XMLStringifier.prototype.convertRawKey = '#raw';
|
|
|
|
XMLStringifier.prototype.convertListKey = '#list';
|
|
|
|
XMLStringifier.prototype.assertLegalChar = function(str) {
|
|
var chars, chr;
|
|
if (this.allowSurrogateChars) {
|
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/;
|
|
} else {
|
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/;
|
|
}
|
|
chr = str.match(chars);
|
|
if (chr) {
|
|
throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index);
|
|
}
|
|
return str;
|
|
};
|
|
|
|
XMLStringifier.prototype.elEscape = function(str) {
|
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\r/g, '
');
|
|
};
|
|
|
|
XMLStringifier.prototype.attEscape = function(str) {
|
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"').replace(/\t/g, '	').replace(/\n/g, '
').replace(/\r/g, '
');
|
|
};
|
|
|
|
return XMLStringifier;
|
|
|
|
})();
|
|
|
|
}).call(this);
|
|
|
|
},{}],339:[function(require,module,exports){
|
|
(function() {
|
|
var XMLNode, XMLText, create,
|
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
hasProp = {}.hasOwnProperty;
|
|
|
|
create = require('lodash/object/create');
|
|
|
|
XMLNode = require('./XMLNode');
|
|
|
|
module.exports = XMLText = (function(superClass) {
|
|
extend(XMLText, superClass);
|
|
|
|
function XMLText(parent, text) {
|
|
XMLText.__super__.constructor.call(this, parent);
|
|
if (text == null) {
|
|
throw new Error("Missing element text");
|
|
}
|
|
this.value = this.stringify.eleText(text);
|
|
}
|
|
|
|
XMLText.prototype.clone = function() {
|
|
return create(XMLText.prototype, this);
|
|
};
|
|
|
|
XMLText.prototype.toString = function(options, level) {
|
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
|
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' ';
|
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
|
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
|
|
level || (level = 0);
|
|
space = new Array(level + offset + 1).join(indent);
|
|
r = '';
|
|
if (pretty) {
|
|
r += space;
|
|
}
|
|
r += this.value;
|
|
if (pretty) {
|
|
r += newline;
|
|
}
|
|
return r;
|
|
};
|
|
|
|
return XMLText;
|
|
|
|
})(XMLNode);
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLNode":335,"lodash/object/create":236}],340:[function(require,module,exports){
|
|
(function() {
|
|
var XMLBuilder, assign;
|
|
|
|
assign = require('lodash/object/assign');
|
|
|
|
XMLBuilder = require('./XMLBuilder');
|
|
|
|
module.exports.create = function(name, xmldec, doctype, options) {
|
|
options = assign({}, xmldec, doctype, options);
|
|
return new XMLBuilder(name, options).root();
|
|
};
|
|
|
|
}).call(this);
|
|
|
|
},{"./XMLBuilder":325,"lodash/object/assign":235}],341:[function(require,module,exports){
|
|
module.exports={
|
|
"name": "@jibo/jibo-server-client",
|
|
"description": "Jibo API for JavaScript",
|
|
"version": "3.0.78",
|
|
"publishConfig": {
|
|
"registry": "http://npm.jibo.com:8080"
|
|
},
|
|
"author": {
|
|
"name": "Jibo",
|
|
"email": "support@jibo.com",
|
|
"url": "https://www.jibo.com/"
|
|
},
|
|
"homepage": "https://github.com/jiborobot/srv-jibo-server-client",
|
|
"contributors": [
|
|
"Loren Segal <lsegal@amazon.com>",
|
|
"Trevor Rowe <trevrowe@amazon.com>",
|
|
"Dmytro Milashenko <dmytro.milashenko@jibo.com>",
|
|
"Alexander Rysenko <alexander.rysenko@jibo.com>"
|
|
],
|
|
"devDependencies": {
|
|
"@types/node": "^6.0.46",
|
|
"browserify": "13.1.0",
|
|
"chai": "*",
|
|
"coffee-script": "1.6.3",
|
|
"coffeeify": "2.1.0",
|
|
"coveralls": "2.x",
|
|
"cucumber": "0.5.x",
|
|
"eslint": "1.x",
|
|
"insert-module-globals": "^7.0.0",
|
|
"istanbul": "*",
|
|
"mocha": "*",
|
|
"phantomjs": "^1.9.20",
|
|
"repl.history": "*",
|
|
"semver": "*",
|
|
"typescript": "2.0.8",
|
|
"uglify-js": "2.x"
|
|
},
|
|
"dependencies": {
|
|
"buffer": "4.9.1",
|
|
"crypto-browserify": "1.0.9",
|
|
"jmespath": "0.15.0",
|
|
"node-rsa": "^0.4.2",
|
|
"querystring": "0.2.0",
|
|
"sax": "1.1.5",
|
|
"url": "0.10.3",
|
|
"uuid": "3.0.0",
|
|
"xml2js": "0.4.15",
|
|
"xmlbuilder": "2.6.2"
|
|
},
|
|
"optionalDependencies": {
|
|
"@jibo/ws": "~0.8.0"
|
|
},
|
|
"main": "lib/aws.js",
|
|
"browser": {
|
|
"lib/aws.js": "./lib/browser.js",
|
|
"fs": false,
|
|
"./global.js": "./browser.js",
|
|
"./lib/node_loader.js": "./lib/browser_loader.js"
|
|
},
|
|
"browserify": {
|
|
"transform": "./dist-tools/transform.js"
|
|
},
|
|
"directories": {
|
|
"lib": "lib"
|
|
},
|
|
"types": "index.d.ts",
|
|
"typings": "index.d.ts",
|
|
"engines": {
|
|
"node": ">= 0.8.0"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git@github.jibo.com:server/jibo-server-client.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/jiborobot/srv-jibo-server-client/issues",
|
|
"mail": "support@jibo.com"
|
|
},
|
|
"license": "Apache-2.0",
|
|
"keywords": [
|
|
"api",
|
|
"amazon",
|
|
"aws",
|
|
"jibo"
|
|
],
|
|
"scripts": {
|
|
"test": "npm -s run-script lint && npm -s run-script unit && npm -s run-script buildertest && npm -s run-script browsertest && npm -s run-script coverage && ([ -f configuration ] && npm -s run-script integration || true)",
|
|
"unit": "istanbul `[ $COVERAGE ] && echo 'cover _mocha' || echo 'test mocha'` -- test test/json test/model test/protocol test/query test/signers test/xml",
|
|
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha -- test test/json test/model test/protocol test/query test/signers test/xml",
|
|
"browsertest": "rake browser:test",
|
|
"buildertest": "mocha --compilers coffee:coffee-script -s 1000 -t 10000 dist-tools/test",
|
|
"integration": "cucumber.js",
|
|
"lint": "eslint lib dist-tools/*.js",
|
|
"console": "./scripts/console",
|
|
"testfiles": "istanbul `[ $COVERAGE ] && echo 'cover _mocha' || echo 'test mocha'`",
|
|
"tstest": "tsc -p ./ts",
|
|
"sdk-publish": "node scripts/sdk-publish.js",
|
|
"prepublish": "scripts/translate-api && node scripts/typings-generator.js && node dist-tools/create-all-services.js"
|
|
}
|
|
}
|
|
|
|
},{}],342:[function(require,module,exports){
|
|
require('./browser_loader');
|
|
|
|
var AWS = require('./core');
|
|
|
|
if (typeof window !== 'undefined') window.Jibo = AWS;
|
|
if (typeof module !== 'undefined') module.exports = AWS;
|
|
if (typeof self !== 'undefined') self.Jibo = AWS;
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Log')) {
|
|
AWS.apiLoader.services['log'] = {};
|
|
AWS.Log = AWS.Service.defineService('log', [ '2015-03-09' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'LogAdmin')) {
|
|
AWS.apiLoader.services['logadmin'] = {};
|
|
AWS.LogAdmin = AWS.Service.defineService('logadmin', [ '2015-03-09' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Push')) {
|
|
AWS.apiLoader.services['push'] = {};
|
|
AWS.Push = AWS.Service.defineService('push', [ '2016-07-29' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Account')) {
|
|
AWS.apiLoader.services['account'] = {};
|
|
AWS.Account = AWS.Service.defineService('account', [ '2015-11-11' ]);
|
|
require('./services/account');
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'AccountAdmin')) {
|
|
AWS.apiLoader.services['accountadmin'] = {};
|
|
AWS.AccountAdmin = AWS.Service.defineService('accountadmin', [ '2015-11-11' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Backup')) {
|
|
AWS.apiLoader.services['backup'] = {};
|
|
AWS.Backup = AWS.Service.defineService('backup', [ '2017-02-22' ]);
|
|
require('./services/backup');
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Notification')) {
|
|
AWS.apiLoader.services['notification'] = {};
|
|
AWS.Notification = AWS.Service.defineService('notification', [ '2015-05-05' ]);
|
|
require('./services/notification');
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Update')) {
|
|
AWS.apiLoader.services['update'] = {};
|
|
AWS.Update = AWS.Service.defineService('update', [ '2016-03-01' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'UpdateAdmin')) {
|
|
AWS.apiLoader.services['updateadmin'] = {};
|
|
AWS.UpdateAdmin = AWS.Service.defineService('updateadmin', [ '2016-03-01' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Robot')) {
|
|
AWS.apiLoader.services['robot'] = {};
|
|
AWS.Robot = AWS.Service.defineService('robot', [ '2016-02-25' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'RobotAdmin')) {
|
|
AWS.apiLoader.services['robotadmin'] = {};
|
|
AWS.RobotAdmin = AWS.Service.defineService('robotadmin', [ '2016-02-25' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Key')) {
|
|
AWS.apiLoader.services['key'] = {};
|
|
AWS.Key = AWS.Service.defineService('key', [ '2016-02-01' ]);
|
|
require('./services/key');
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Loop')) {
|
|
AWS.apiLoader.services['loop'] = {};
|
|
AWS.Loop = AWS.Service.defineService('loop', [ '2016-03-24' ]);
|
|
require('./services/loop');
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Media')) {
|
|
AWS.apiLoader.services['media'] = {};
|
|
AWS.Media = AWS.Service.defineService('media', [ '2016-07-25' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'MediaAdmin')) {
|
|
AWS.apiLoader.services['mediaadmin'] = {};
|
|
AWS.MediaAdmin = AWS.Service.defineService('mediaadmin', [ '2016-07-25' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Person')) {
|
|
AWS.apiLoader.services['person'] = {};
|
|
AWS.Person = AWS.Service.defineService('person', [ '2016-08-01' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'GQA')) {
|
|
AWS.apiLoader.services['gqa'] = {};
|
|
AWS.GQA = AWS.Service.defineService('gqa', [ '2016-09-30' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'OOBE')) {
|
|
AWS.apiLoader.services['oobe'] = {};
|
|
AWS.OOBE = AWS.Service.defineService('oobe', [ '2016-10-26' ]);
|
|
require('./services/oobe');
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'NLP')) {
|
|
AWS.apiLoader.services['nlp'] = {};
|
|
AWS.NLP = AWS.Service.defineService('nlp', [ '2016-10-31' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'Collision')) {
|
|
AWS.apiLoader.services['collision'] = {};
|
|
AWS.Collision = AWS.Service.defineService('collision', [ '2016-11-26' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'IFTTT')) {
|
|
AWS.apiLoader.services['ifttt'] = {};
|
|
AWS.IFTTT = AWS.Service.defineService('ifttt', [ '2017-02-07' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'OOBEAdmin')) {
|
|
AWS.apiLoader.services['oobeadmin'] = {};
|
|
AWS.OOBEAdmin = AWS.Service.defineService('oobeadmin', [ '2016-10-26' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'ROM')) {
|
|
AWS.apiLoader.services['rom'] = {};
|
|
AWS.ROM = AWS.Service.defineService('rom', [ '2017-10-11' ]);
|
|
}
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(AWS, 'OauthClientsAdmin')) {
|
|
AWS.apiLoader.services['oauthclientsadmin'] = {};
|
|
AWS.OauthClientsAdmin = AWS.Service.defineService('oauthclientsadmin', [ '2017-11-08' ]);
|
|
}
|
|
AWS.apiLoader.services['log']['2015-03-09'] = require('../apis/log-2015-03-09.min');
|
|
|
|
AWS.apiLoader.services['logadmin']['2015-03-09'] = require('../apis/logadmin-2015-03-09.min');
|
|
|
|
AWS.apiLoader.services['push']['2016-07-29'] = require('../apis/push-2016-07-29.min');
|
|
|
|
AWS.apiLoader.services['account']['2015-11-11'] = require('../apis/account-2015-11-11.min');
|
|
|
|
AWS.apiLoader.services['accountadmin']['2015-11-11'] = require('../apis/accountadmin-2015-11-11.min');
|
|
|
|
AWS.apiLoader.services['backup']['2017-02-22'] = require('../apis/backup-2017-02-22.min');
|
|
|
|
AWS.apiLoader.services['notification']['2015-05-05'] = require('../apis/notification-2015-05-05.min');
|
|
|
|
AWS.apiLoader.services['update']['2016-03-01'] = require('../apis/update-2016-03-01.min');
|
|
|
|
AWS.apiLoader.services['updateadmin']['2016-03-01'] = require('../apis/updateadmin-2016-03-01.min');
|
|
|
|
AWS.apiLoader.services['robot']['2016-02-25'] = require('../apis/robot-2016-02-25.min');
|
|
|
|
AWS.apiLoader.services['robotadmin']['2016-02-25'] = require('../apis/robotadmin-2016-02-25.min');
|
|
|
|
AWS.apiLoader.services['key']['2016-02-01'] = require('../apis/key-2016-02-01.min');
|
|
|
|
AWS.apiLoader.services['loop']['2016-03-24'] = require('../apis/loop-2016-03-24.min');
|
|
|
|
AWS.apiLoader.services['media']['2016-07-25'] = require('../apis/media-2016-07-25.min');
|
|
|
|
AWS.apiLoader.services['mediaadmin']['2016-07-25'] = require('../apis/mediaadmin-2016-07-25.min');
|
|
|
|
AWS.apiLoader.services['person']['2016-08-01'] = require('../apis/person-2016-08-01.min');
|
|
|
|
AWS.apiLoader.services['gqa']['2016-09-30'] = require('../apis/gqa-2016-09-30.min');
|
|
|
|
AWS.apiLoader.services['oobe']['2016-10-26'] = require('../apis/oobe-2016-10-26.min');
|
|
|
|
AWS.apiLoader.services['nlp']['2016-10-31'] = require('../apis/nlp-2016-10-31.min');
|
|
|
|
AWS.apiLoader.services['collision']['2016-11-26'] = require('../apis/collision-2016-11-26.min');
|
|
|
|
AWS.apiLoader.services['ifttt']['2017-02-07'] = require('../apis/ifttt-2017-02-07.min');
|
|
|
|
AWS.apiLoader.services['oobeadmin']['2016-10-26'] = require('../apis/oobeadmin-2016-10-26.min');
|
|
|
|
AWS.apiLoader.services['rom']['2017-10-11'] = require('../apis/rom-2017-10-11.min');
|
|
|
|
AWS.apiLoader.services['oauthclientsadmin']['2017-11-08'] = require('../apis/oauthclientsadmin-2017-11-08.min');
|
|
|
|
|
|
},{"../apis/account-2015-11-11.min":1,"../apis/accountadmin-2015-11-11.min":2,"../apis/backup-2017-02-22.min":3,"../apis/collision-2016-11-26.min":4,"../apis/gqa-2016-09-30.min":5,"../apis/ifttt-2017-02-07.min":6,"../apis/key-2016-02-01.min":7,"../apis/log-2015-03-09.min":8,"../apis/logadmin-2015-03-09.min":9,"../apis/loop-2016-03-24.min":10,"../apis/media-2016-07-25.min":11,"../apis/mediaadmin-2016-07-25.min":12,"../apis/nlp-2016-10-31.min":14,"../apis/notification-2015-05-05.min":15,"../apis/oauthclientsadmin-2017-11-08.min":16,"../apis/oobe-2016-10-26.min":17,"../apis/oobeadmin-2016-10-26.min":18,"../apis/person-2016-08-01.min":19,"../apis/push-2016-07-29.min":20,"../apis/robot-2016-02-25.min":21,"../apis/robotadmin-2016-02-25.min":22,"../apis/rom-2017-10-11.min":23,"../apis/update-2016-03-01.min":24,"../apis/updateadmin-2016-03-01.min":25,"./browser_loader":27,"./core":29,"./services/account":57,"./services/backup":58,"./services/key":59,"./services/loop":60,"./services/notification":61,"./services/oobe":62}]},{},[342]);
|
|
|