Socket
Socket
Sign inDemoInstall

@unumid/server-sdk

Package Overview
Dependencies
Maintainers
1
Versions
88
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@unumid/server-sdk - npm Package Compare versions

Comparing version 1.3.2 to 1.4.0

build/utils/didHelper.d.ts

6

build/issuer/issueCredentials.js

@@ -53,3 +53,3 @@ "use strict";

var logger_1 = __importDefault(require("../logger"));
var didHandler_1 = require("../utils/didHandler");
var didHelper_1 = require("../utils/didHelper");
var encrypt_1 = require("../utils/encrypt");

@@ -71,3 +71,3 @@ var createProof_1 = require("../utils/createProof");

subjectDid = cred.credentialSubject.id;
return [4 /*yield*/, didHandler_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, subjectDid)];
return [4 /*yield*/, didHelper_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, subjectDid)];
case 1:

@@ -78,3 +78,3 @@ didDocResponse = _a.sent();

}
publicKeyInfos = didHandler_1.getKeyFromDIDDoc(didDocResponse.body, 'RSA');
publicKeyInfos = didHelper_1.getKeyFromDIDDoc(didDocResponse.body, 'RSA');
if (publicKeyInfos.length === 0) {

@@ -81,0 +81,0 @@ throw new error_1.CustError(404, 'Public key not found for the DID');

@@ -47,3 +47,3 @@ "use strict";

var logger_1 = __importDefault(require("../logger"));
var didHandler_1 = require("../utils/didHandler");
var didHelper_1 = require("../utils/didHelper");
var networkRequestHelper_1 = require("../utils/networkRequestHelper");

@@ -62,3 +62,3 @@ var verify_1 = require("../utils/verify");

proof = credential.proof;
return [4 /*yield*/, didHandler_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, proof.verificationMethod)];
return [4 /*yield*/, didHelper_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, proof.verificationMethod)];
case 1:

@@ -70,3 +70,3 @@ didDocumentResponse = _a.sent();

authToken = networkRequestHelper_1.handleAuthToken(didDocumentResponse);
publicKeyObject = didHandler_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
publicKeyObject = didHelper_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
data = lodash_1.omit(credential, 'proof');

@@ -73,0 +73,0 @@ try {

@@ -49,3 +49,3 @@ "use strict";

var error_1 = require("../utils/error");
var didHandler_1 = require("../utils/didHandler");
var didHelper_1 = require("../utils/didHelper");
var helpers_1 = require("../utils/helpers");

@@ -59,3 +59,3 @@ var networkRequestHelper_1 = require("../utils/networkRequestHelper");

exports.validateNoPresentationParams = function (noPresentation) {
var type = noPresentation.type, holder = noPresentation.holder, proof = noPresentation.proof, presentationRequestUuid = noPresentation.presentationRequestUuid;
var type = noPresentation.type, holder = noPresentation.holder, proof = noPresentation.proof, presentationRequestUuid = noPresentation.presentationRequestUuid, verifierDid = noPresentation.verifierDid;
if (!type) {

@@ -76,2 +76,5 @@ throw new error_1.CustError(400, 'Invalid Presentation: type is required.');

}
if (!verifierDid) {
throw new error_1.CustError(400, 'Invalid Presentation: verifierDid is required.');
}
if (type[0] !== 'NoPresentation') {

@@ -95,3 +98,3 @@ throw new error_1.CustError(400, 'Invalid type: first element must be \'NoPresentation\'.');

exports.verifyNoPresentationHelper = function (authorization, noPresentation, verifier) { return __awaiter(void 0, void 0, void 0, function () {
var _a, verificationMethod, signatureValue, unsignedValue, didDocumentResponse, authToken, publicKeyInfos, _b, publicKey, encoding, unsignedNoPresentation, isVerified, result_1, receiptOptions, receiptCallOptions, resp, result, e_1;
var _a, verificationMethod, signatureValue, unsignedValue, verifierDid, result_1, didDocumentResponse, authToken, publicKeyInfos, _b, publicKey, encoding, unsignedNoPresentation, isVerified, result_2, receiptOptions, receiptCallOptions, resp, result, e_1;
return __generator(this, function (_c) {

@@ -103,4 +106,15 @@ switch (_c.label) {

exports.validateNoPresentationParams(noPresentation);
_a = noPresentation.proof, verificationMethod = _a.verificationMethod, signatureValue = _a.signatureValue, unsignedValue = _a.unsignedValue;
return [4 /*yield*/, didHandler_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, verificationMethod)];
_a = noPresentation.proof, verificationMethod = _a.verificationMethod, signatureValue = _a.signatureValue, unsignedValue = _a.unsignedValue, verifierDid = noPresentation.verifierDid;
// validate that the verifier did provided matches the verifier did in the presentation
if (verifierDid !== verifier) {
result_1 = {
authToken: authorization,
body: {
isVerified: false,
message: "The presentation was meant for verifier, " + verifierDid + ", not the provided verifier, " + verifier + "."
}
};
return [2 /*return*/, result_1];
}
return [4 /*yield*/, didHelper_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, verificationMethod)];
case 1:

@@ -112,3 +126,3 @@ didDocumentResponse = _c.sent();

authToken = networkRequestHelper_1.handleAuthToken(didDocumentResponse);
publicKeyInfos = didHandler_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
publicKeyInfos = didHelper_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
_b = publicKeyInfos[0], publicKey = _b.publicKey, encoding = _b.encoding;

@@ -118,10 +132,10 @@ unsignedNoPresentation = lodash_1.omit(noPresentation, 'proof');

if (!isVerified) {
result_1 = {
result_2 = {
authToken: authToken,
body: {
isVerified: false,
message: 'Credential signature can not be verified.'
message: 'Presentation signature can not be verified.'
}
};
return [2 /*return*/, result_1];
return [2 /*return*/, result_2];
}

@@ -128,0 +142,0 @@ receiptOptions = {

@@ -60,2 +60,7 @@ "use strict";

var error_1 = require("../utils/error");
var lodash_1 = require("lodash");
var didHelper_1 = require("../utils/didHelper");
var config_1 = require("../config");
var verify_1 = require("../utils/verify");
var networkRequestHelper_1 = require("../utils/networkRequestHelper");
function isPresentation(presentation) {

@@ -65,2 +70,44 @@ return presentation.type[0] === 'VerifiablePresentation';

/**
* Verify the PresentationRequest signature as a way to side step verifier MITM attacks where an entity spoofs requests.
*/
function verifyPresentationRequest(authorization, presentationRequest) {
return __awaiter(this, void 0, void 0, function () {
var _a, verificationMethod, signatureValue, unsignedValue, didDocumentResponse, authToken, publicKeyInfos, _b, publicKey, encoding, unsignedPresentationRequest, isVerified, result_1, result;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_a = presentationRequest.proof, verificationMethod = _a.verificationMethod, signatureValue = _a.signatureValue, unsignedValue = _a.unsignedValue;
return [4 /*yield*/, didHelper_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, verificationMethod)];
case 1:
didDocumentResponse = _c.sent();
if (didDocumentResponse instanceof Error) {
throw didDocumentResponse;
}
authToken = networkRequestHelper_1.handleAuthToken(didDocumentResponse);
publicKeyInfos = didHelper_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
_b = publicKeyInfos[0], publicKey = _b.publicKey, encoding = _b.encoding;
unsignedPresentationRequest = lodash_1.omit(presentationRequest, 'proof');
isVerified = verify_1.doVerify(signatureValue, unsignedPresentationRequest, publicKey, encoding, unsignedValue);
if (!isVerified) {
result_1 = {
authToken: authToken,
body: {
isVerified: false,
message: 'PresentationRequest signature can not be verified.'
}
};
return [2 /*return*/, result_1];
}
result = {
authToken: authToken,
body: {
isVerified: true
}
};
return [2 /*return*/, result];
}
});
});
}
/**
* Handler to send information regarding the user agreeing to share a credential Presentation.

@@ -72,7 +119,7 @@ * @param authorization: string

exports.verifyPresentation = function (authorization, encryptedPresentation, verifierDid, encryptionPrivateKey, presentationRequest) { return __awaiter(void 0, void 0, void 0, function () {
var presentation, verificationResult_1, result_1, credentialRequests, verificationResult, result, error_2;
var presentation, requestVerificationResult, type, result_2, verificationResult_1, result_3, credentialRequests, verificationResult, result, error_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 4, , 5]);
_a.trys.push([0, 6, , 7]);
requireAuth_1.requireAuth(authorization);

@@ -92,18 +139,35 @@ if (!encryptedPresentation) {

presentation = library_crypto_1.decrypt(encryptionPrivateKey, encryptedPresentation);
// verify the presentation request uuid match
if (presentationRequest && presentationRequest.presentationRequest.uuid !== presentation.presentationRequestUuid) {
throw new error_1.CustError(400, "presentation request uuid provided, " + presentationRequest.presentationRequest.uuid + ", does not match the presentationRequestUuid that the presentation was in response to, " + presentation.presentationRequestUuid + ".");
}
if (!!isPresentation(presentation)) return [3 /*break*/, 2];
if (!(presentationRequest && presentationRequest.presentationRequest)) return [3 /*break*/, 2];
return [4 /*yield*/, verifyPresentationRequest(authorization, presentationRequest.presentationRequest)];
case 1:
requestVerificationResult = _a.sent();
authorization = requestVerificationResult.authToken;
// if invalid then can stop here but still send back the decrypted presentation with the verification results
if (!requestVerificationResult.body.isVerified) {
type = isPresentation(presentation) ? 'VerifiablePresentation' : 'NoPresentation';
result_2 = {
authToken: requestVerificationResult.authToken,
body: __assign(__assign({}, requestVerificationResult.body), { type: type, presentation: presentation })
};
return [2 /*return*/, result_2];
}
_a.label = 2;
case 2:
if (!!isPresentation(presentation)) return [3 /*break*/, 4];
return [4 /*yield*/, verifyNoPresentationHelper_1.verifyNoPresentationHelper(authorization, presentation, verifierDid)];
case 1:
case 3:
verificationResult_1 = _a.sent();
result_1 = {
result_3 = {
authToken: verificationResult_1.authToken,
body: __assign(__assign({}, verificationResult_1.body), { type: 'NoPresentation', presentation: presentation })
};
return [2 /*return*/, result_1];
case 2:
return [2 /*return*/, result_3];
case 4:
credentialRequests = presentationRequest === null || presentationRequest === void 0 ? void 0 : presentationRequest.presentationRequest.credentialRequests;
return [4 /*yield*/, verifyPresentationHelper_1.verifyPresentationHelper(authorization, presentation, verifierDid, credentialRequests)];
case 3:
case 5:
verificationResult = _a.sent();

@@ -115,3 +179,3 @@ result = {

return [2 /*return*/, result];
case 4:
case 6:
error_2 = _a.sent();

@@ -125,3 +189,3 @@ if (error_2 instanceof library_crypto_1.CryptoError) {

throw error_2;
case 5: return [2 /*return*/];
case 7: return [2 /*return*/];
}

@@ -128,0 +192,0 @@ });

@@ -54,3 +54,3 @@ "use strict";

var error_1 = require("../utils/error");
var didHandler_1 = require("../utils/didHandler");
var didHelper_1 = require("../utils/didHelper");
var networkRequestHelper_1 = require("../utils/networkRequestHelper");

@@ -159,3 +159,3 @@ var verify_1 = require("../utils/verify");

var context = presentation['@context'];
var type = presentation.type, verifiableCredentials = presentation.verifiableCredentials, proof = presentation.proof, presentationRequestUuid = presentation.presentationRequestUuid;
var type = presentation.type, verifiableCredentials = presentation.verifiableCredentials, proof = presentation.proof, presentationRequestUuid = presentation.presentationRequestUuid, verifierDid = presentation.verifierDid;
var retObj = {};

@@ -178,2 +178,5 @@ // validate required fields

}
if (!verifierDid) {
throw new error_1.CustError(400, 'Invalid Presentation: verifierDid is required.');
}
if (helpers_1.isArrayEmpty(context)) {

@@ -224,2 +227,4 @@ throw new error_1.CustError(400, 'Invalid Presentation: @context must be a non-empty array.');

}
// can break from inner loop because validation has been met.
break;
}

@@ -242,3 +247,3 @@ }

exports.verifyPresentationHelper = function (authorization, presentation, verifier, credentialRequests) { return __awaiter(void 0, void 0, void 0, function () {
var data, proof, didDocumentResponse, authToken, pubKeyObj, result_1, isPresentationVerified, result_2, result_3, areCredentialsValid, _i, _a, credential, isExpired, isStatusValidResponse, isStatusValid, isVerifiedResponse, isVerified_1, result_4, isVerified, credentialTypes, issuers, subject, receiptOptions, receiptCallOptions, resp, result, error_2;
var data, result_1, proof, didDocumentResponse, authToken, pubKeyObj, result_2, isPresentationVerified, result_3, result_4, areCredentialsValid, _i, _a, credential, isExpired, isStatusValidResponse, isStatusValid, isVerifiedResponse, isVerified_1, result_5, isVerified, credentialTypes, issuers, subject, receiptOptions, receiptCallOptions, resp, result, error_2;
return __generator(this, function (_b) {

@@ -257,2 +262,13 @@ switch (_b.label) {

presentation = validatePresentation(presentation);
// validate that the verifier did provided matches the verifier did in the presentation
if (presentation.verifierDid !== verifier) {
result_1 = {
authToken: authorization,
body: {
isVerified: false,
message: "The presentation was meant for verifier, " + presentation.verifierDid + ", not the provided verifier, " + verifier + "."
}
};
return [2 /*return*/, result_1];
}
// if specific credential requests, then need to confirm the presentation provided meets the requirements

@@ -263,3 +279,3 @@ if (helpers_1.isArrayNotEmpty(credentialRequests)) {

proof = presentation.proof;
return [4 /*yield*/, didHandler_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, proof.verificationMethod)];
return [4 /*yield*/, didHelper_1.getDIDDoc(config_1.configData.SaaSUrl, authorization, proof.verificationMethod)];
case 1:

@@ -271,5 +287,5 @@ didDocumentResponse = _b.sent();

authToken = networkRequestHelper_1.handleAuthToken(didDocumentResponse);
pubKeyObj = didHandler_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
pubKeyObj = didHelper_1.getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
if (pubKeyObj.length === 0) {
result_1 = {
result_2 = {
authToken: authToken,

@@ -281,3 +297,3 @@ body: {

};
return [2 /*return*/, result_1];
return [2 /*return*/, result_2];
}

@@ -295,3 +311,3 @@ isPresentationVerified = false;

}
result_2 = {
result_3 = {
authToken: authToken,

@@ -303,6 +319,6 @@ body: {

};
return [2 /*return*/, result_2];
return [2 /*return*/, result_3];
}
if (!isPresentationVerified) {
result_3 = {
result_4 = {
authToken: authToken,

@@ -314,3 +330,3 @@ body: {

};
return [2 /*return*/, result_3];
return [2 /*return*/, result_4];
}

@@ -352,3 +368,3 @@ areCredentialsValid = true;

if (!areCredentialsValid) {
result_4 = {
result_5 = {
authToken: authToken,

@@ -360,3 +376,3 @@ body: {

};
return [2 /*return*/, result_4];
return [2 /*return*/, result_5];
}

@@ -363,0 +379,0 @@ isVerified = isPresentationVerified && areCredentialsValid;

{
"name": "@unumid/server-sdk",
"version": "1.3.2",
"version": "1.4.0",
"main": "build/index.js",

@@ -46,3 +46,3 @@ "repository": "git@github.com:UnumID/Server-SDK-TypeScript.git",

"@unumid/library-crypto": "https://github.com/UnumID/Library-Crypto-TypeScript.git#v1.2.0",
"@unumid/types": "https://github.com/UnumID/types.git#1.4.1",
"@unumid/types": "https://github.com/UnumID/types.git#1.5.1",
"dotenv": "^8.2.0",

@@ -49,0 +49,0 @@ "express": "^4.17.1",

@@ -7,3 +7,3 @@ import { configData } from '../config';

import logger from '../logger';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHandler';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHelper';
import { doEncrypt } from '../utils/encrypt';

@@ -10,0 +10,0 @@ import { createProof } from '../utils/createProof';

@@ -9,3 +9,3 @@

import { VerifiableCredential } from '@unumid/types';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHandler';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHelper';
import { handleAuthToken } from '../utils/networkRequestHelper';

@@ -12,0 +12,0 @@ import { doVerify } from '../utils/verify';

@@ -11,3 +11,3 @@

import { CustError } from '../utils/error';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHandler';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHelper';
import { isArrayEmpty } from '../utils/helpers';

@@ -26,3 +26,4 @@ import { handleAuthToken, makeNetworkRequest } from '../utils/networkRequestHelper';

proof,
presentationRequestUuid
presentationRequestUuid,
verifierDid
} = noPresentation;

@@ -50,2 +51,6 @@

if (!verifierDid) {
throw new CustError(400, 'Invalid Presentation: verifierDid is required.');
}
if (type[0] !== 'NoPresentation') {

@@ -78,4 +83,16 @@ throw new CustError(400, 'Invalid type: first element must be \'NoPresentation\'.');

const { proof: { verificationMethod, signatureValue, unsignedValue } } = noPresentation;
const { proof: { verificationMethod, signatureValue, unsignedValue }, verifierDid } = noPresentation;
// validate that the verifier did provided matches the verifier did in the presentation
if (verifierDid !== verifier) {
const result: UnumDto<VerifiedStatus> = {
authToken: authorization,
body: {
isVerified: false,
message: `The presentation was meant for verifier, ${verifierDid}, not the provided verifier, ${verifier}.`
}
};
return result;
}
const didDocumentResponse = await getDIDDoc(configData.SaaSUrl, authorization as string, verificationMethod);

@@ -101,3 +118,3 @@

isVerified: false,
message: 'Credential signature can not be verified.'
message: 'Presentation signature can not be verified.'
}

@@ -104,0 +121,0 @@ };

import { DecryptedPresentation, PresentationOrNoPresentation, UnumDto, VerifiedStatus } from '../types';
import { Presentation, CredentialRequest, NoPresentation, PresentationRequestDto, EncryptedData } from '@unumid/types';
import { Presentation, CredentialRequest, NoPresentation, PresentationRequestDto, EncryptedData, PresentationRequest } from '@unumid/types';
import { requireAuth } from '../requireAuth';

@@ -10,2 +10,7 @@ import { CryptoError, decrypt } from '@unumid/library-crypto';

import { CustError } from '../utils/error';
import { omit } from 'lodash';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHelper';
import { configData } from '../config';
import { doVerify } from '../utils/verify';
import { handleAuthToken } from '../utils/networkRequestHelper';

@@ -17,2 +22,42 @@ function isPresentation (presentation: PresentationOrNoPresentation): presentation is Presentation {

/**
* Verify the PresentationRequest signature as a way to side step verifier MITM attacks where an entity spoofs requests.
*/
async function verifyPresentationRequest (authorization: string, presentationRequest: PresentationRequest): Promise<UnumDto<VerifiedStatus>> {
const { proof: { verificationMethod, signatureValue, unsignedValue } } = presentationRequest;
const didDocumentResponse = await getDIDDoc(configData.SaaSUrl, authorization as string, verificationMethod);
if (didDocumentResponse instanceof Error) {
throw didDocumentResponse;
}
const authToken: string = handleAuthToken(didDocumentResponse);
const publicKeyInfos = getKeyFromDIDDoc(didDocumentResponse.body, 'secp256r1');
const { publicKey, encoding } = publicKeyInfos[0];
const unsignedPresentationRequest = omit(presentationRequest, 'proof');
const isVerified = doVerify(signatureValue, unsignedPresentationRequest, publicKey, encoding, unsignedValue);
if (!isVerified) {
const result: UnumDto<VerifiedStatus> = {
authToken,
body: {
isVerified: false,
message: 'PresentationRequest signature can not be verified.'
}
};
return result;
}
const result: UnumDto<VerifiedStatus> = {
authToken,
body: {
isVerified: true
}
};
return result;
}
/**
* Handler to send information regarding the user agreeing to share a credential Presentation.

@@ -46,2 +91,3 @@ * @param authorization: string

// verify the presentation request uuid match
if (presentationRequest && presentationRequest.presentationRequest.uuid !== presentation.presentationRequestUuid) {

@@ -51,2 +97,23 @@ throw new CustError(400, `presentation request uuid provided, ${presentationRequest.presentationRequest.uuid}, does not match the presentationRequestUuid that the presentation was in response to, ${presentation.presentationRequestUuid}.`);

// verify the presentation request signature if present
if (presentationRequest && presentationRequest.presentationRequest) {
const requestVerificationResult = await verifyPresentationRequest(authorization, presentationRequest.presentationRequest);
authorization = requestVerificationResult.authToken;
// if invalid then can stop here but still send back the decrypted presentation with the verification results
if (!requestVerificationResult.body.isVerified) {
const type = isPresentation(presentation) ? 'VerifiablePresentation' : 'NoPresentation';
const result: UnumDto<DecryptedPresentation> = {
authToken: requestVerificationResult.authToken,
body: {
...requestVerificationResult.body,
type,
presentation: presentation
}
};
return result;
}
}
if (!isPresentation(presentation)) {

@@ -53,0 +120,0 @@ const verificationResult: UnumDto<VerifiedStatus> = await verifyNoPresentationHelper(authorization, presentation, verifierDid);

@@ -15,3 +15,3 @@ import { omit } from 'lodash';

import { CustError } from '../utils/error';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHandler';
import { getDIDDoc, getKeyFromDIDDoc } from '../utils/didHelper';
import { handleAuthToken, makeNetworkRequest } from '../utils/networkRequestHelper';

@@ -141,3 +141,3 @@ import { doVerify } from '../utils/verify';

const context = presentation['@context'];
const { type, verifiableCredentials, proof, presentationRequestUuid } = presentation;
const { type, verifiableCredentials, proof, presentationRequestUuid, verifierDid } = presentation;
let retObj: JSONObj = {};

@@ -166,2 +166,6 @@

if (!verifierDid) {
throw new CustError(400, 'Invalid Presentation: verifierDid is required.');
}
if (isArrayEmpty(context)) {

@@ -215,2 +219,5 @@ throw new CustError(400, 'Invalid Presentation: @context must be a non-empty array.');

}
// can break from inner loop because validation has been met.
break;
}

@@ -249,2 +256,14 @@ }

// validate that the verifier did provided matches the verifier did in the presentation
if (presentation.verifierDid !== verifier) {
const result: UnumDto<VerifiedStatus> = {
authToken: authorization,
body: {
isVerified: false,
message: `The presentation was meant for verifier, ${presentation.verifierDid}, not the provided verifier, ${verifier}.`
}
};
return result;
}
// if specific credential requests, then need to confirm the presentation provided meets the requirements

@@ -251,0 +270,0 @@ if (isArrayNotEmpty(credentialRequests)) {

@@ -8,8 +8,8 @@ import { configData } from '../../src/config';

import * as createKeyPairs from '../../src/utils/createKeyPairs';
import { getDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc } from '../../src/utils/didHelper';
import { doEncrypt } from '../../src/utils/encrypt';
import { makeNetworkRequest } from '../../src/utils/networkRequestHelper';
jest.mock('../../src/utils/didHandler', () => {
const actual = jest.requireActual('../../src/utils/didHandler');
jest.mock('../../src/utils/didHelper', () => {
const actual = jest.requireActual('../../src/utils/didHelper');
return {

@@ -16,0 +16,0 @@ ...actual,

import { DidDocument } from '@unumid/types';
import { getKeyFromDIDDoc } from '../../src/utils/didHandler';
import { getKeyFromDIDDoc } from '../../src/utils/didHelper';

@@ -4,0 +4,0 @@ describe('getKeyFromDidDoc', () => {

@@ -5,3 +5,3 @@ import * as restHlpr from '../../src/utils/networkRequestHelper';

import { RESTResponse } from '../../src/types';
import { getDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc } from '../../src/utils/didHelper';

@@ -8,0 +8,0 @@ describe('Get DID doc for the given did', () => {

import * as cryptoLib from '@unumid/library-crypto';
import { PublicKeyInfo, EncryptedData, KeyPair } from '@unumid/types';
import { getDIDDoc, getKeyFromDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc, getKeyFromDIDDoc } from '../../src/utils/didHelper';
import { doEncrypt } from '../../src/utils/encrypt';

@@ -5,0 +5,0 @@ import { doVerify } from '../../src/utils/verify';

import { VerifiableCredential } from '@unumid/types';
import { UnumDto } from '../../src/types';
import { getDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc } from '../../src/utils/didHelper';
import { doVerify } from '../../src/utils/verify';

@@ -10,4 +10,4 @@ import { verifyCredential } from '../../src/verifier/verifyCredential';

// Selective "spyon" mocking example of package.
jest.mock('../../src/utils/didHandler', () => {
const actual = jest.requireActual('../../src/utils/didHandler');
jest.mock('../../src/utils/didHelper', () => {
const actual = jest.requireActual('../../src/utils/didHelper');
return {

@@ -14,0 +14,0 @@ ...actual,

import { omit } from 'lodash';
import { VerifiedStatus, UnumDto } from '../../src/types';
import { dummyAuthToken, makeDummyDidDocument } from './mocks';
import { dummyAuthToken, dummyVerifierDid, makeDummyDidDocument } from './mocks';
import { NoPresentation } from '@unumid/types';
import { verifyNoPresentationHelper as verifyNoPresentation } from '../../src/verifier/verifyNoPresentationHelper';
import { getDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc } from '../../src/utils/didHelper';
import { makeNetworkRequest } from '../../src/utils/networkRequestHelper';
import { doVerify } from '../../src/utils/verify';
jest.mock('../../src/utils/didHandler', () => {
const actual = jest.requireActual('../../src/utils/didHandler');
jest.mock('../../src/utils/didHelper', () => {
const actual = jest.requireActual('../../src/utils/didHelper');
return {

@@ -44,2 +44,3 @@ ...actual,

const verifier = 'did:unum:dd407b1a-ee7f-46a2-af2a-ccbb48cbb0dc';
const dummyNoPresentation: NoPresentation = {

@@ -52,2 +53,3 @@ holder: 'did:unum:50fb0b5b-79ff-4db9-9f33-d93feab702db',

],
verifierDid: verifier,
proof: {

@@ -75,3 +77,2 @@ signatureValue: 'AN1rKvtGeqaB4L16dr2gwF9jZF77hdhrb8iBsTgUTt2XqUyoJYnfQQmczxMuKLM2zWU6E6DSSaqzWVsisbD3VhG8taLWGx6BY',

const authHeader = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoidmVyaWZpZXIiLCJ1dWlkIjoiM2VjYzVlZDMtZjdhMC00OTU4LWJjOTgtYjc5NTQxMThmODUyIiwiZGlkIjoiZGlkOnVudW06ZWVhYmU0NGItNjcxMi00NTRkLWIzMWItNTM0NTg4NTlmMTFmIiwiZXhwIjoxNTk1NDcxNTc0LjQyMiwiaWF0IjoxNTk1NTI5NTExfQ.4iJn_a8fHnVsmegdR5uIsdCjXmyZ505x1nA8NVvTEBg';
const verifier = 'did:unum:dd407b1a-ee7f-46a2-af2a-ccbb48cbb0dc';

@@ -78,0 +79,0 @@ describe('verifyNoPresentation', () => {

@@ -12,3 +12,3 @@ import { NoPresentation, Presentation, VerifiedStatus, UnumDto, CustError } from '../../src/index';

import { PresentationRequestDto } from '@unumid/types';
import { getDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc } from '../../src/utils/didHelper';
import { getUUID } from '../../src/utils/helpers';

@@ -18,4 +18,4 @@ import { makeNetworkRequest } from '../../src/utils/networkRequestHelper';

jest.mock('../../src/utils/didHandler', () => {
const actual = jest.requireActual('../../src/utils/didHandler');
jest.mock('../../src/utils/didHelper', () => {
const actual = jest.requireActual('../../src/utils/didHelper');
return {

@@ -57,2 +57,3 @@ ...actual,

presentationRequestUuid,
verifierDid: verifier,
proof,

@@ -582,2 +583,40 @@ uuid: 'a'

describe('verifyEncryptedPresentation - presentationRequestSignature check', () => {
const { context, type, verifiableCredentials, presentationRequestUuid, proof, authHeader, verifier } = populateMockData();
it('returns response body with proper validation error message if presentation request signature can not be verified', async () => {
const dummyDidDoc = await makeDummyDidDocument({ id: dummyNoPresentation.holder });
const headers = { 'x-auth-token': dummyAuthToken };
mockGetDIDDoc.mockResolvedValue({ body: dummyDidDoc, headers });
mockMakeNetworkRequest.mockResolvedValue({ body: { success: true }, headers });
mockDoVerify.mockReturnValueOnce(false);
const presentation: Presentation = {
'@context': context,
type,
verifiableCredentials,
presentationRequestUuid,
verifierDid: verifier,
proof,
uuid: 'a'
};
const encryptedPresentation = encrypt(`did:unum:${getUUID()}`, dummyRsaPublicKey, presentation, 'pem');
const fakeBadPresentationRequestDto = {
presentationRequest: {
uuid: presentationRequestUuid,
proof: { signatureValue: 'signature' }
},
verifier: {
did: verifier
}
};
// const response = await callVerifyEncryptedPresentation(context, type, verifiableCredentials, presentationRequestUuid, proof, verifier, authHeader);
const response = await verifyPresentation(authHeader, encryptedPresentation, verifier, dummyRsaPrivateKey, fakeBadPresentationRequestDto);
expect(response.body.isVerified).toBe(false);
expect(response.body.message).toBe('PresentationRequest signature can not be verified.');
});
});
describe('verifyEncryptedPresentation - Validation for proof object', () => {

@@ -642,2 +681,4 @@ const { context, type, verifiableCredentials, presentationRequestUuid, proof, authHeader, verifier } = populateMockData();

const verifier = 'did:unum:dd407b1a-ee7f-46a2-af2a-ccbb48cbb0dc';
const dummyNoPresentation: NoPresentation = {

@@ -650,2 +691,3 @@ holder: 'did:unum:50fb0b5b-79ff-4db9-9f33-d93feab702db',

],
verifierDid: verifier,
proof: {

@@ -673,3 +715,2 @@ signatureValue: 'AN1rKvtGeqaB4L16dr2gwF9jZF77hdhrb8iBsTgUTt2XqUyoJYnfQQmczxMuKLM2zWU6E6DSSaqzWVsisbD3VhG8taLWGx6BY',

const authHeader = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoidmVyaWZpZXIiLCJ1dWlkIjoiM2VjYzVlZDMtZjdhMC00OTU4LWJjOTgtYjc5NTQxMThmODUyIiwiZGlkIjoiZGlkOnVudW06ZWVhYmU0NGItNjcxMi00NTRkLWIzMWItNTM0NTg4NTlmMTFmIiwiZXhwIjoxNTk1NDcxNTc0LjQyMiwiaWF0IjoxNTk1NTI5NTExfQ.4iJn_a8fHnVsmegdR5uIsdCjXmyZ505x1nA8NVvTEBg';
const verifier = 'did:unum:dd407b1a-ee7f-46a2-af2a-ccbb48cbb0dc';

@@ -676,0 +717,0 @@ const callVerifyNoPresentation = (

@@ -12,8 +12,8 @@ // import * as utilLib from '../../src/utils';

import { JSONObj } from '../../src/types';
import { getDIDDoc } from '../../src/utils/didHandler';
import { getDIDDoc } from '../../src/utils/didHelper';
import { makeNetworkRequest } from '../../src/utils/networkRequestHelper';
import { doVerify } from '../../src/utils/verify';
jest.mock('../../src/utils/didHandler', () => {
const actual = jest.requireActual('../../src/utils/didHandler');
jest.mock('../../src/utils/didHelper', () => {
const actual = jest.requireActual('../../src/utils/didHelper');
return {

@@ -55,2 +55,3 @@ ...actual,

presentationRequestUuid,
verifierDid: verifier,
proof,

@@ -176,3 +177,3 @@ uuid: 'a'

describe('verifyPresentation - Success Scenario', () => {
describe('verifyPresentation - Success Scenario with verifiableCredentialsString', () => {
let response: UnumDto<VerifiedStatus>;

@@ -193,3 +194,3 @@ let verStatus: boolean;

mockMakeNetworkRequest.mockResolvedValue({ body: { success: true }, headers: dummyResponseHeaders });
response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
response = await callVerifyPresentation(context, type, verifiableCredentialString, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
verStatus = response.body.isVerified;

@@ -250,68 +251,6 @@ });

describe('verifyPresentation - Failure Scenarios', () => {
describe('verifyPresentation - Success Scenario', () => {
let response: UnumDto<VerifiedStatus>;
let verStatus: boolean;
const { context, type, verifiableCredential, presentationRequestUuid, proof, invalidProof, authHeader, verifier, credentialRequests } = populateMockData();
beforeAll(async () => {
const dummySubjectDidDoc = await makeDummyDidDocument();
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockDoVerify.mockReturnValueOnce(false);
mockVerifyCredential.mockResolvedValue({ authToken: dummyAuthToken, body: false });
mockIsCredentialExpired.mockReturnValue(true);
mockCheckCredentialStatus.mockReturnValue({ authToken: dummyAuthToken, body: { status: 'revoked' } });
verifiableCredential[0].proof.verificationMethod = proof.verificationMethod;
});
afterAll(() => {
jest.clearAllMocks();
});
it('gets the subject did document', async () => {
const dummySubjectDidDoc = await makeDummyDidDocument();
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockGetDIDDoc.mockResolvedValueOnce({ body: dummySubjectDidDoc, headers: dummyResponseHeaders });
response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, invalidProof, verifier, authHeader, credentialRequests);
verStatus = response.body.isVerified;
expect(mockGetDIDDoc).toBeCalled();
});
it('verifies the presentation', async () => {
expect(mockDoVerify).toBeCalled();
});
it('Result should be true', () => {
expect(verStatus).toBeDefined();
expect(verStatus).toBe(false);
});
it('returns a 404 status code if the did document has no public keys', async () => {
const dummyDidDocWithoutKeys = {
...makeDummyDidDocument(),
publicKey: []
};
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockGetDIDDoc.mockResolvedValueOnce({ body: dummyDidDocWithoutKeys, headers: dummyResponseHeaders });
const response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
expect(response.body.isVerified).toBe(false);
expect(response.body.message).toBe('Public key not found for the DID associated with the proof.verificationMethod');
});
it('returns a 404 status code if the did document is not found', async () => {
mockGetDIDDoc.mockResolvedValueOnce(new CustError(404, 'DID Document not found.'));
try {
await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
fail();
} catch (e) {
expect(e.code).toEqual(404);
}
});
});
describe('verifyPresentation - Success Scenario with verifiableCredentialsString', () => {
let response: UnumDto<VerifiedStatus>;
let verStatus: boolean;
const { context, type, verifiableCredential, verifiableCredentialString, presentationRequestUuid, proof, authHeader, verifier, credentialRequests } = populateMockData();

@@ -329,3 +268,3 @@

mockMakeNetworkRequest.mockResolvedValue({ body: { success: true }, headers: dummyResponseHeaders });
response = await callVerifyPresentation(context, type, verifiableCredentialString, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
verStatus = response.body.isVerified;

@@ -386,2 +325,88 @@ });

describe('verifyPresentation - Failure Scenarios', () => {
let response: UnumDto<VerifiedStatus>;
let verStatus: boolean;
const { context, type, verifiableCredential, presentationRequestUuid, proof, invalidProof, authHeader, verifier, credentialRequests } = populateMockData();
beforeAll(async () => {
const dummySubjectDidDoc = await makeDummyDidDocument();
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockDoVerify.mockReturnValueOnce(false);
mockVerifyCredential.mockResolvedValue({ authToken: dummyAuthToken, body: false });
mockIsCredentialExpired.mockReturnValue(true);
mockCheckCredentialStatus.mockReturnValue({ authToken: dummyAuthToken, body: { status: 'revoked' } });
verifiableCredential[0].proof.verificationMethod = proof.verificationMethod;
});
afterAll(() => {
jest.clearAllMocks();
});
it('gets the subject did document', async () => {
const dummySubjectDidDoc = await makeDummyDidDocument();
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockGetDIDDoc.mockResolvedValueOnce({ body: dummySubjectDidDoc, headers: dummyResponseHeaders });
response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, invalidProof, verifier, authHeader, credentialRequests);
verStatus = response.body.isVerified;
expect(mockGetDIDDoc).toBeCalled();
});
it('verifies the presentation', async () => {
expect(mockDoVerify).toBeCalled();
});
it('Result should be true', () => {
expect(verStatus).toBeDefined();
expect(verStatus).toBe(false);
});
it('returns a isVerified false with proper message if the did document has no public keys', async () => {
const dummyDidDocWithoutKeys = {
...makeDummyDidDocument(),
publicKey: []
};
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockGetDIDDoc.mockResolvedValueOnce({ body: dummyDidDocWithoutKeys, headers: dummyResponseHeaders });
const response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
expect(response.body.isVerified).toBe(false);
expect(response.body.message).toBe('Public key not found for the DID associated with the proof.verificationMethod');
});
it('returns a 404 status code if the did document is not found', async () => {
mockGetDIDDoc.mockResolvedValueOnce(new CustError(404, 'DID Document not found.'));
try {
await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
fail();
} catch (e) {
expect(e.code).toEqual(404);
}
});
it('returns a isVerified false with proper message if the verifierDid does not match the one in the presentation.', async () => {
const dummyDidDocWithoutKeys = {
...makeDummyDidDocument(),
publicKey: []
};
const dummyResponseHeaders = { 'x-auth-token': dummyAuthToken };
mockGetDIDDoc.mockResolvedValueOnce({ body: dummyDidDocWithoutKeys, headers: dummyResponseHeaders });
const presentation: Presentation = {
'@context': context,
type,
verifiableCredentials: verifiableCredential,
presentationRequestUuid,
verifierDid: verifier,
proof,
uuid: 'a'
};
const response = await verifyPresentation(authHeader, presentation, 'fakeVerifierDid', credentialRequests);
// const response = await callVerifyPresentation(context, type, verifiableCredential, presentationRequestUuid, proof, verifier, authHeader, credentialRequests);
expect(response.body.isVerified).toBe(false);
expect(response.body.message).toBe(`The presentation was meant for verifier, ${presentation.verifierDid}, not the provided verifier, fakeVerifierDid.`);
});
});
describe('verifyPresentation - Validation Failures', () => {

@@ -388,0 +413,0 @@ const { context, type, verifiableCredential, presentationRequestUuid, proof, authHeader, verifier, credentialRequests } = populateMockData();

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc