mirror of
https://github.com/mosip/inji-wallet.git
synced 2026-01-09 13:38:01 -05:00
* [INJIMOB-2160] use pixelpass for processing mmdoc data for rendering Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] fix history not showing properly post download Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] add processing VC logic for iOS Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] modify selectCredential in VCItemSelectors to return selectCredential Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor - remove debug logs Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor - mark prop credentialWrapper as mandatory Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor - optimize imports Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor - remove unused functions / code block Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor - format code Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] modify pixelpass module to get toJSON api from pixelpass class Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor - optimize imports Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] show keytype for mso_mdoc format VCs Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] use id in mso_mdoc VC as unique VC ID Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] refactor getDisplayId method Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] update ci-client & pixelpass version Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] add runtime asset to gitignore Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] remove unused var Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> * [INJIMOB-2160] bypass verification for mock VCs This is done since mock VCs are not verifiable as of now. Co-Authored by: BalachandarG <balachandar.g@thoughtworks.com> Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com> --------- Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>
146 lines
4.6 KiB
TypeScript
146 lines
4.6 KiB
TypeScript
import Cloud from '../../shared/CloudBackupAndRestoreUtils';
|
|
import {CACHED_API} from '../../shared/api';
|
|
import NetInfo from '@react-native-community/netinfo';
|
|
import {
|
|
constructAuthorizationConfiguration,
|
|
constructIssuerMetaData,
|
|
constructProofJWT,
|
|
hasKeyPair,
|
|
updateCredentialInformation,
|
|
vcDownloadTimeout,
|
|
} from '../../shared/openId4VCI/Utils';
|
|
import {authorize} from 'react-native-app-auth';
|
|
import {
|
|
fetchKeyPair,
|
|
generateKeyPair,
|
|
} from '../../shared/cryptoutil/cryptoUtil';
|
|
import {NativeModules} from 'react-native';
|
|
import {
|
|
VerificationErrorMessage,
|
|
VerificationErrorType,
|
|
verifyCredential,
|
|
} from '../../shared/vcjs/verifyCredential';
|
|
import {
|
|
getImpressionEventData,
|
|
sendImpressionEvent,
|
|
} from '../../shared/telemetry/TelemetryUtils';
|
|
import {TelemetryConstants} from '../../shared/telemetry/TelemetryConstants';
|
|
import {VciClient} from '../../shared/vciClient/VciClient';
|
|
import {isMockVC} from '../../shared/Utils';
|
|
|
|
export const IssuersService = () => {
|
|
return {
|
|
isUserSignedAlready: () => async () => {
|
|
return await Cloud.isSignedInAlready();
|
|
},
|
|
downloadIssuersList: async () => {
|
|
return await CACHED_API.fetchIssuers();
|
|
},
|
|
checkInternet: async () => await NetInfo.fetch(),
|
|
downloadIssuerWellknown: async (context: any) => {
|
|
const wellknownResponse = await CACHED_API.fetchIssuerWellknownConfig(
|
|
context.selectedIssuerId,
|
|
);
|
|
return wellknownResponse;
|
|
},
|
|
downloadCredentialTypes: async (context: any) => {
|
|
const credentialTypes = [];
|
|
for (const key in context.selectedIssuer
|
|
.credential_configurations_supported) {
|
|
credentialTypes.push({
|
|
id: key,
|
|
...context.selectedIssuer.credential_configurations_supported[key],
|
|
});
|
|
}
|
|
if (credentialTypes.length == 0)
|
|
throw new Error(
|
|
`No credential type found for issuer ${context.selectedIssuer.credential_issuer}`,
|
|
);
|
|
|
|
return credentialTypes;
|
|
},
|
|
downloadCredential: async (context: any) => {
|
|
const downloadTimeout = await vcDownloadTimeout();
|
|
const accessToken: string = context.tokenResponse?.accessToken;
|
|
const proofJWT = await constructProofJWT(
|
|
context.publicKey,
|
|
context.privateKey,
|
|
accessToken,
|
|
context.selectedIssuer,
|
|
context.keyType,
|
|
);
|
|
let credential = await VciClient.downloadCredential(
|
|
constructIssuerMetaData(
|
|
context.selectedIssuer,
|
|
context.selectedCredentialType,
|
|
downloadTimeout,
|
|
),
|
|
proofJWT,
|
|
accessToken,
|
|
);
|
|
|
|
console.info(`VC download via ${context.selectedIssuerId} is successful`);
|
|
return await updateCredentialInformation(context, credential);
|
|
},
|
|
invokeAuthorization: async (context: any) => {
|
|
sendImpressionEvent(
|
|
getImpressionEventData(
|
|
TelemetryConstants.FlowType.vcDownload,
|
|
context.selectedIssuer.credential_issuer +
|
|
TelemetryConstants.Screens.webViewPage,
|
|
),
|
|
);
|
|
return await authorize(
|
|
constructAuthorizationConfiguration(
|
|
context.selectedIssuer,
|
|
context.selectedCredentialType.scope,
|
|
),
|
|
);
|
|
},
|
|
|
|
getKeyOrderList: async () => {
|
|
const {RNSecureKeystoreModule} = NativeModules;
|
|
const keyOrder = JSON.parse(
|
|
(await RNSecureKeystoreModule.getData('keyPreference'))[1],
|
|
);
|
|
return keyOrder;
|
|
},
|
|
|
|
generateKeyPair: async (context: any) => {
|
|
const keypair = await generateKeyPair(context.keyType);
|
|
return keypair;
|
|
},
|
|
|
|
getKeyPair: async (context: any) => {
|
|
if (context.keyType === '') {
|
|
throw new Error('key type not found');
|
|
} else if (!!(await hasKeyPair(context.keyType))) {
|
|
return await fetchKeyPair(context.keyType);
|
|
}
|
|
},
|
|
|
|
getSelectedKey: async (context: any) => {
|
|
return context.keyType;
|
|
},
|
|
|
|
verifyCredential: async (context: any) => {
|
|
//TODO: Remove bypassing verification of mock VCs once mock VCs are verifiable
|
|
if (!isMockVC(context.selectedIssuerId)) {
|
|
const verificationResult = await verifyCredential(
|
|
context.verifiableCredential?.credential,
|
|
context.selectedCredentialType.format,
|
|
);
|
|
if (!verificationResult.isVerified) {
|
|
throw new Error(verificationResult.verificationErrorCode);
|
|
}
|
|
} else {
|
|
return {
|
|
isVerified: true,
|
|
verificationMessage: VerificationErrorMessage.NO_ERROR,
|
|
verificationErrorCode: VerificationErrorType.NO_ERROR,
|
|
};
|
|
}
|
|
},
|
|
};
|
|
};
|