Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: restructure consent model for updated api #85

Merged
merged 13 commits into from
Aug 20, 2021
60 changes: 52 additions & 8 deletions audit-resolve.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,67 @@
},
"1770|sqlite3>node-gyp>tar": {
"decision": "ignore",
"madeAt": 1629080956000,
"expiresAt": 1631672938643
"madeAt": 1629160833406,
"expiresAt": 1631752828971
},
"1770|sqlite3>node-pre-gyp>tar": {
"decision": "ignore",
"madeAt": 1629080956000,
"expiresAt": 1631672938643
"madeAt": 1629160833406,
"expiresAt": 1631752828971
},
"1771|sqlite3>node-gyp>tar": {
"decision": "ignore",
"madeAt": 1629080956000,
"expiresAt": 1631672938643
"madeAt": 1629160833406,
"expiresAt": 1631752828971
},
"1771|sqlite3>node-pre-gyp>tar": {
"decision": "ignore",
"madeAt": 1629080956000,
"expiresAt": 1631672938643
"madeAt": 1629160833406,
"expiresAt": 1631752828971
},
"1773|@mojaloop/api-snippets>openapi-typescript>meow>normalize-package-data>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|@mojaloop/api-snippets>openapi-typescript>meow>read-pkg-up>read-pkg>normalize-package-data>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|openapi-typescript>meow>read-pkg-up>read-pkg>normalize-package-data>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|npm-run-all>read-pkg>normalize-package-data>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|@mojaloop/api-snippets>ttypescript>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|babel-jest>@jest/transform>@babel/core>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|babel-jest>@jest/transform>babel-plugin-istanbul>istanbul-lib-instrument>@babel/core>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|babel-jest>babel-plugin-istanbul>istanbul-lib-instrument>@babel/core>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|knex>liftoff>rechoir>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|knex>liftoff>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
},
"1773|openapi-typescript>meow>normalize-package-data>resolve>path-parse": {
"decision": "fix",
"madeAt": 1628830559342
}
},
"rules": {},
Expand Down
17 changes: 8 additions & 9 deletions migrations/20200624121732_consent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,18 @@ export async function up (knex: Knex): Promise<void | Knex.SchemaBuilder> {
if (!exists) {
return knex.schema.createTable('Consent',
(t: Knex.CreateTableBuilder): void => {
// TODO: Confirm string length for status and revoked at
t.string('id', 36).primary().notNullable()
t.string('status', 32).notNullable()
t.string('initiatorId', 32).notNullable()
t.string('participantId', 32).notNullable()

t.string('credentialType', 16).notNullable()
t.string('credentialPayload').notNullable()
t.string('credentialChallenge', 128).notNullable()
t.integer('credentialCounter').notNullable()
t.json('originalCredential').notNullable()

t.timestamp('createdAt').defaultTo(knex.fn.now())
// TODO: Do we need to change internal representation to Date object
t.string('revokedAt', 256).nullable()
t.string('credentialId', 256).nullable()
t.string('credentialType', 16).nullable()
t.string('credentialStatus', 10).nullable()
t.string('credentialPayload').nullable()
t.string('credentialChallenge', 128).nullable()
t.timestamp('revokedAt').nullable()
})
}
})
Expand Down
20 changes: 0 additions & 20 deletions migrations/20210624144226_consent_attestation_user_data.ts

This file was deleted.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@
"javascript-state-machine": "^3.1.0",
"json-canonicalize": "^1.0.4",
"knex": "^0.21.19",
"moment": "^2.29.1",
"mysql": "^2.18.1",
"npm-run-all": "^4.1.5",
"openapi-response-validator": "^9.1.0",
Expand Down
135 changes: 11 additions & 124 deletions seeds/01_consent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,144 +32,31 @@

'use strict'
import * as Knex from 'knex'
import moment from 'moment'
import { Consent } from '../src/model/consent/consent'

export const consents = [

export const consents: Array<Consent> = [
{
id: '123',
status: 'ACTIVE',
initiatorId: 'PISPA',
participantId: 'DFSPA',
credentialId: null,
credentialType: null,
credentialStatus: null,
credentialPayload: null,
credentialChallenge: null,
revokedAt: null,
attestationObject: null,
clientDataJSON: null
},
{
id: '124',
status: 'ACTIVE',
initiatorId: 'PISPB',
participantId: 'DFSPA',
credentialId: '9876',
credentialType: 'FIDO',
credentialStatus: 'PENDING',
credentialPayload: null,
credentialChallenge: 'string_representing_challenge_a',
attestationObject: 'o2NmbXRmcGFja2VkZ2F0dFN0bXSjY2FsZyZjc2lnWEcwRQIgHq9' +
'JKpi/bFnnu0uVV+k6JjHfBcFwWRRCXJWlejgzJLUCIQD2iOONGXebOCxq37UqvumxC/d' +
'Jz1a3U9F1DaxVMFnzf2N4NWOBWQLBMIICvTCCAaWgAwIBAgIECwXNUzANBgkqhkiG9w0' +
'BAQsFADAuMSwwKgYDVQQDEyNZdWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDY' +
'zMTAgFw0xNDA4MDEwMDAwMDBaGA8yMDUwMDkwNDAwMDAwMFowbjELMAkGA1UEBhMCU0U' +
'xEjAQBgNVBAoMCVl1YmljbyBBQjEiMCAGA1UECwwZQXV0aGVudGljYXRvciBBdHRlc3R' +
'hdGlvbjEnMCUGA1UEAwweWXViaWNvIFUyRiBFRSBTZXJpYWwgMTg0OTI5NjE5MFkwEwY' +
'HKoZIzj0CAQYIKoZIzj0DAQcDQgAEIRpvsbWJJcsKwRhffCrjqLSIEBR5sR7/9VXgfZd' +
'RvSsXaiUt7lns44WZIFuz6ii/j9f8fadcBUJyrkhY5ZH8WqNsMGowIgYJKwYBBAGCxAo' +
'CBBUxLjMuNi4xLjQuMS40MTQ4Mi4xLjEwEwYLKwYBBAGC5RwCAQEEBAMCBDAwIQYLKwY' +
'BBAGC5RwBAQQEEgQQFJogIY72QTOWuIH41bfx9TAMBgNVHRMBAf8EAjAAMA0GCSqGSIb' +
'3DQEBCwUAA4IBAQA+/qPfPSrgclePfgTQ3VpLaNsBr+hjLhi04LhzQxiRGWwYS+vB1TO' +
'iPXeLsQQIwbmqQU51doVbCTaXGLNIr1zvbLAwhnLWH7i9m4ahCqaCzowtTvCQ7VBUGP5' +
'T1M4eYnoo83IDCVjQj/pZG8QYgOGOigztGoWAf5CWcUF6C0UyFbONwUcqJEl2QLToa/7' +
'E8VRjm4W46IAUljYkODVZASv8h3wLROx9p5TSBlSymtwdulxQe/DKbfNSvM3edA0up+E' +
'IJKLOOU+QTR2ZQV46fEW1/ih6m8vcaY6L3NW0eYpc7TXeijUJAgoUtya/vzmnRAecuY9' +
'bncoJt8PrvL2ir2kDaGF1dGhEYXRhWMRJlg3liA6MaHQ0Fw9kdmBbj+SuuaKGMseZXPO' +
'6gx2XY0EAAAAEFJogIY72QTOWuIH41bfx9QBAX8aQc8WgIOiYzoRIKbTYJdlzMZ/8zo3' +
'ZiIL3Rvh/ONfr9kZtudCwYO49tWVkjgJGyJSpoo6anRBVJGda0Lri3aUBAgMmIAEhWCB' +
'0Zo9xAj7V50Tu7Hj8F5Wo0A3AloIpsVDSY2icW9eSwiJYIH79t0O2hnPDguuloYn2eSd' +
'R7caaZd/Ffnmk4vyOATab',
clientDataJSON: '{"type":"webauthn.create","challenge":"MgA3ADgANQBjADIAZ' +
'AA5ADkAYQA0AGMAMQA5AGQAMQBhADgANwBkADMANABmAGQAMABjADEAMABhAGQAMABiA' +
'DUAMgA3ADIAMQBjAGYAMwBjADgAMAAyADgAOABjADIAOQBkAGEANQBiADAAZQBiAGUAZ' +
'gA2ADcAOAAzADQAMAA","origin":"http://localhost:5000","crossOrigin":false}'
},
{
id: '125',
status: 'ACTIVE',
initiatorId: 'PISPC',
status: 'VERIFIED',
participantId: 'DFSPA',
credentialId: '9875',
credentialType: 'FIDO',
credentialStatus: 'VERIFIED',
credentialPayload: 'string_representing_public_key_a',
credentialChallenge: 'string_representing_challenge_b',
attestationObject: 'o2NmbXRmcGFja2VkZ2F0dFN0bXSjY2FsZyZjc2lnWEcwRQIgHq9' +
'JKpi/bFnnu0uVV+k6JjHfBcFwWRRCXJWlejgzJLUCIQD2iOONGXebOCxq37UqvumxC/d' +
'Jz1a3U9F1DaxVMFnzf2N4NWOBWQLBMIICvTCCAaWgAwIBAgIECwXNUzANBgkqhkiG9w0' +
'BAQsFADAuMSwwKgYDVQQDEyNZdWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDY' +
'zMTAgFw0xNDA4MDEwMDAwMDBaGA8yMDUwMDkwNDAwMDAwMFowbjELMAkGA1UEBhMCU0U' +
'xEjAQBgNVBAoMCVl1YmljbyBBQjEiMCAGA1UECwwZQXV0aGVudGljYXRvciBBdHRlc3R' +
'hdGlvbjEnMCUGA1UEAwweWXViaWNvIFUyRiBFRSBTZXJpYWwgMTg0OTI5NjE5MFkwEwY' +
'HKoZIzj0CAQYIKoZIzj0DAQcDQgAEIRpvsbWJJcsKwRhffCrjqLSIEBR5sR7/9VXgfZd' +
'RvSsXaiUt7lns44WZIFuz6ii/j9f8fadcBUJyrkhY5ZH8WqNsMGowIgYJKwYBBAGCxAo' +
'CBBUxLjMuNi4xLjQuMS40MTQ4Mi4xLjEwEwYLKwYBBAGC5RwCAQEEBAMCBDAwIQYLKwY' +
'BBAGC5RwBAQQEEgQQFJogIY72QTOWuIH41bfx9TAMBgNVHRMBAf8EAjAAMA0GCSqGSIb' +
'3DQEBCwUAA4IBAQA+/qPfPSrgclePfgTQ3VpLaNsBr+hjLhi04LhzQxiRGWwYS+vB1TO' +
'iPXeLsQQIwbmqQU51doVbCTaXGLNIr1zvbLAwhnLWH7i9m4ahCqaCzowtTvCQ7VBUGP5' +
'T1M4eYnoo83IDCVjQj/pZG8QYgOGOigztGoWAf5CWcUF6C0UyFbONwUcqJEl2QLToa/7' +
'E8VRjm4W46IAUljYkODVZASv8h3wLROx9p5TSBlSymtwdulxQe/DKbfNSvM3edA0up+E' +
'IJKLOOU+QTR2ZQV46fEW1/ih6m8vcaY6L3NW0eYpc7TXeijUJAgoUtya/vzmnRAecuY9' +
'bncoJt8PrvL2ir2kDaGF1dGhEYXRhWMRJlg3liA6MaHQ0Fw9kdmBbj+SuuaKGMseZXPO' +
'6gx2XY0EAAAAEFJogIY72QTOWuIH41bfx9QBAX8aQc8WgIOiYzoRIKbTYJdlzMZ/8zo3' +
'ZiIL3Rvh/ONfr9kZtudCwYO49tWVkjgJGyJSpoo6anRBVJGda0Lri3aUBAgMmIAEhWCB' +
'0Zo9xAj7V50Tu7Hj8F5Wo0A3AloIpsVDSY2icW9eSwiJYIH79t0O2hnPDguuloYn2eSd' +
'R7caaZd/Ffnmk4vyOATab',
clientDataJSON: '{"type":"webauthn.create","challenge":"MgA3ADgANQBjADIAZ' +
'AA5ADkAYQA0AGMAMQA5AGQAMQBhADgANwBkADMANABmAGQAMABjADEAMABhAGQAMABiA' +
'DUAMgA3ADIAMQBjAGYAMwBjADgAMAAyADgAOABjADIAOQBkAGEANQBiADAAZQBiAGUAZ' +
'gA2ADcAOAAzADQAMAA","origin":"http://localhost:5000","crossOrigin":false}'
credentialCounter: 4,
originalCredential: JSON.stringify({ status:'PENDING', payload:{}, credentialType:'test'}),
},
{
id: '126',
id: '124',
status: 'REVOKED',
initiatorId: 'PISPC',
participantId: 'DFSPA',
credentialId: '9875',
credentialType: 'FIDO',
credentialStatus: 'VERIFIED',
credentialPayload: 'string_representing_public_key_a',
credentialChallenge: 'string_representing_challenge_b',
revokedAt: '2011-10-05T14:48:00.000Z',
attestationObject: 'o2NmbXRmcGFja2VkZ2F0dFN0bXSjY2FsZyZjc2lnWEcwRQIgHq9' +
'JKpi/bFnnu0uVV+k6JjHfBcFwWRRCXJWlejgzJLUCIQD2iOONGXebOCxq37UqvumxC/d' +
'Jz1a3U9F1DaxVMFnzf2N4NWOBWQLBMIICvTCCAaWgAwIBAgIECwXNUzANBgkqhkiG9w0' +
'BAQsFADAuMSwwKgYDVQQDEyNZdWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDY' +
'zMTAgFw0xNDA4MDEwMDAwMDBaGA8yMDUwMDkwNDAwMDAwMFowbjELMAkGA1UEBhMCU0U' +
'xEjAQBgNVBAoMCVl1YmljbyBBQjEiMCAGA1UECwwZQXV0aGVudGljYXRvciBBdHRlc3R' +
'hdGlvbjEnMCUGA1UEAwweWXViaWNvIFUyRiBFRSBTZXJpYWwgMTg0OTI5NjE5MFkwEwY' +
'HKoZIzj0CAQYIKoZIzj0DAQcDQgAEIRpvsbWJJcsKwRhffCrjqLSIEBR5sR7/9VXgfZd' +
'RvSsXaiUt7lns44WZIFuz6ii/j9f8fadcBUJyrkhY5ZH8WqNsMGowIgYJKwYBBAGCxAo' +
'CBBUxLjMuNi4xLjQuMS40MTQ4Mi4xLjEwEwYLKwYBBAGC5RwCAQEEBAMCBDAwIQYLKwY' +
'BBAGC5RwBAQQEEgQQFJogIY72QTOWuIH41bfx9TAMBgNVHRMBAf8EAjAAMA0GCSqGSIb' +
'3DQEBCwUAA4IBAQA+/qPfPSrgclePfgTQ3VpLaNsBr+hjLhi04LhzQxiRGWwYS+vB1TO' +
'iPXeLsQQIwbmqQU51doVbCTaXGLNIr1zvbLAwhnLWH7i9m4ahCqaCzowtTvCQ7VBUGP5' +
'T1M4eYnoo83IDCVjQj/pZG8QYgOGOigztGoWAf5CWcUF6C0UyFbONwUcqJEl2QLToa/7' +
'E8VRjm4W46IAUljYkODVZASv8h3wLROx9p5TSBlSymtwdulxQe/DKbfNSvM3edA0up+E' +
'IJKLOOU+QTR2ZQV46fEW1/ih6m8vcaY6L3NW0eYpc7TXeijUJAgoUtya/vzmnRAecuY9' +
'bncoJt8PrvL2ir2kDaGF1dGhEYXRhWMRJlg3liA6MaHQ0Fw9kdmBbj+SuuaKGMseZXPO' +
'6gx2XY0EAAAAEFJogIY72QTOWuIH41bfx9QBAX8aQc8WgIOiYzoRIKbTYJdlzMZ/8zo3' +
'ZiIL3Rvh/ONfr9kZtudCwYO49tWVkjgJGyJSpoo6anRBVJGda0Lri3aUBAgMmIAEhWCB' +
'0Zo9xAj7V50Tu7Hj8F5Wo0A3AloIpsVDSY2icW9eSwiJYIH79t0O2hnPDguuloYn2eSd' +
'R7caaZd/Ffnmk4vyOATab',
clientDataJSON: '{"type":"webauthn.create","challenge":"MgA3ADgANQBjADIAZ' +
'AA5ADkAYQA0AGMAMQA5AGQAMQBhADgANwBkADMANABmAGQAMABjADEAMABhAGQAMABiA' +
'DUAMgA3ADIAMQBjAGYAMwBjADgAMAAyADgAOABjADIAOQBkAGEANQBiADAAZQBiAGUAZ' +
'gA2ADcAOAAzADQAMAA","origin":"http://localhost:5000","crossOrigin":false}'
},
{
id: '127',
status: 'REVOKED',
initiatorId: 'PISPA',
participantId: 'DFSPA',
credentialId: null,
credentialType: null,
credentialStatus: null,
credentialPayload: null,
credentialChallenge: null,
revokedAt: '2020-08-19T05:44:18.843Z',
attestationObject: null,
clientDataJSON: null
credentialCounter: 4,
originalCredential: JSON.stringify({ status:'PENDING', payload:{}, credentialType:'test'}),
revokedAt: moment.utc('2011-10-05T14:48:00.000Z').format('YYYY-MM-DD HH:mm:ss')
}
]

Expand Down
19 changes: 0 additions & 19 deletions src/domain/challenge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,31 +35,12 @@
* ticket #354
*/

import util from 'util'
import crypto from 'crypto'
import { logger } from '~/shared/logger'
import { thirdparty as tpAPI } from '@mojaloop/api-snippets'
import { canonicalize } from 'json-canonicalize'
import sha256 from 'crypto-js/sha256'

// Async promisified randomBytes function
const randomBytesAsync = util.promisify(crypto.randomBytes)

/**
* Helper function which uses the crypto library to generate
* a secure random challenge string (Base 64 encoding) of given size
* @param size Integer value of how many bytes should generated, 32 by default
*/
export async function generate (size = 32): Promise<string> {
try {
const buf = await randomBytesAsync(Math.round(Math.abs(size)))
return buf.toString('base64')
} catch (error) {
logger.push({ error }).error('Unable to generate challenge string')
throw error
}
}

/**
* Helper function to validate signatures using public key
* @param challenge UTF-8 challenge string
Expand Down
Loading