Files
self/common/src/utils/kyc/api.ts
Seshanth.S 886e02f53d SELF-1938 sumsub integration (#1661)
* Sumsub: Update keychain and types

* sumsub: ProvingMachine changes - WIP

* fix: remove duplicate identifier

* update proving machine

* Refactor && Continue onchain registration if user left the app

* fix register flow

* Add hooks to KycSuccessScreen

* Integrate KycVerifiedScreen (#1686)

* Integrate KycVerifiedScreen & Fix race conditions

* yarn lint

* lint

* lint

* add mock kyc

* fix disclose flow

* yarn lint

* Feat/add kyc home screen card design (#1708)

* feat: add new designs to the kycIdCard

* refactor: Update KycIdCard design to match IdCard styling

* feat: update document cards + dev document

* feat: update empty id card for new design

* feat: update pending document card design

* feat: update expired doc + unregistered doc cards from new design

* fix: unregisted id card button links to continue registration screen

* fix: logo design on document cards

* feat: add 6 different backgrounds for ids

deterministically shows 1 of 6 backgrounds for each document | fix: fixed document designs not displaying correctly.

* chore: trigger CI rebuild

* feat: Integrate PendingIdCard to Homescreen

* fix KycIdCard.tsx

---------

Co-authored-by: seshanthS <seshanth@protonmail.com>

* lint

* fix tests

* fix: cleanup only on unmount

* coderabbit comments

* fix: cleanup unused code

* fix: edge case for German Passports with D<< nationality code

* fix tests

* review comments

* review comments

* lint

* Hide duplicated cards in Homescreen

* remove console.log

* fix patch

* remove unused vars

* agent updates

* agent feedback

* abstract colors and formatting

* agent feedback

* Regenerate Sumsub patch-package patch

* fix: handle malformed kyc payload in card background selector

* re-add for clean up

---------

Co-authored-by: Evi Nova <66773372+Tranquil-Flow@users.noreply.github.com>
Co-authored-by: Evi Nova <tranquil_flow@protonmail.com>
Co-authored-by: Justin Hernandez <justin.hernandez@self.xyz>
2026-02-11 13:51:10 -08:00

95 lines
3.0 KiB
TypeScript

// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import {
KYC_ADDRESS_INDEX,
KYC_ADDRESS_LENGTH,
KYC_COUNTRY_INDEX,
KYC_COUNTRY_LENGTH,
KYC_DOB_INDEX,
KYC_DOB_LENGTH,
KYC_EXPIRY_DATE_INDEX,
KYC_EXPIRY_DATE_LENGTH,
KYC_FULL_NAME_INDEX,
KYC_FULL_NAME_LENGTH,
KYC_GENDER_INDEX,
KYC_GENDER_LENGTH,
KYC_ID_NUMBER_INDEX,
KYC_ID_NUMBER_LENGTH,
KYC_ID_TYPE_INDEX,
KYC_ID_TYPE_LENGTH,
KYC_ISSUANCE_DATE_INDEX,
KYC_ISSUANCE_DATE_LENGTH,
KYC_PHONE_NUMBER_INDEX,
KYC_PHONE_NUMBER_LENGTH,
KYC_PHOTO_HASH_INDEX,
KYC_PHOTO_HASH_LENGTH,
} from './constants.js';
import { KycData } from './types.js';
import { Point } from '@zk-kit/baby-jubjub';
//accepts a base64 applicant info and returns a kyc data object
export function deserializeApplicantInfo(
applicantInfoBase64: string
): Omit<
KycData,
'user_identifier' | 'current_date' | 'majority_age_ASCII' | 'selector_older_than'
> {
const applicantInfo = Buffer.from(applicantInfoBase64, 'base64').toString('utf-8');
const country = applicantInfo
.slice(KYC_COUNTRY_INDEX, KYC_COUNTRY_INDEX + KYC_COUNTRY_LENGTH)
.replace(/\x00/g, '');
const idType = applicantInfo
.slice(KYC_ID_TYPE_INDEX, KYC_ID_TYPE_INDEX + KYC_ID_TYPE_LENGTH)
.replace(/\x00/g, '');
const idNumber = applicantInfo
.slice(KYC_ID_NUMBER_INDEX, KYC_ID_NUMBER_INDEX + KYC_ID_NUMBER_LENGTH)
.replace(/\x00/g, '');
const issuanceDate = applicantInfo
.slice(KYC_ISSUANCE_DATE_INDEX, KYC_ISSUANCE_DATE_INDEX + KYC_ISSUANCE_DATE_LENGTH)
.replace(/\x00/g, '');
const expiryDate = applicantInfo
.slice(KYC_EXPIRY_DATE_INDEX, KYC_EXPIRY_DATE_INDEX + KYC_EXPIRY_DATE_LENGTH)
.replace(/\x00/g, '');
const fullName = applicantInfo
.slice(KYC_FULL_NAME_INDEX, KYC_FULL_NAME_INDEX + KYC_FULL_NAME_LENGTH)
.replace(/\x00/g, '');
const dob = applicantInfo
.slice(KYC_DOB_INDEX, KYC_DOB_INDEX + KYC_DOB_LENGTH)
.replace(/\x00/g, '');
const photoHash = applicantInfo
.slice(KYC_PHOTO_HASH_INDEX, KYC_PHOTO_HASH_INDEX + KYC_PHOTO_HASH_LENGTH)
.replace(/\x00/g, '');
const phoneNumber = applicantInfo
.slice(KYC_PHONE_NUMBER_INDEX, KYC_PHONE_NUMBER_INDEX + KYC_PHONE_NUMBER_LENGTH)
.replace(/\x00/g, '');
const gender = applicantInfo
.slice(KYC_GENDER_INDEX, KYC_GENDER_INDEX + KYC_GENDER_LENGTH)
.replace(/\x00/g, '');
const address = applicantInfo
.slice(KYC_ADDRESS_INDEX, KYC_ADDRESS_INDEX + KYC_ADDRESS_LENGTH)
.replace(/\x00/g, '');
return {
country,
idType,
idNumber,
issuanceDate,
expiryDate,
fullName,
dob,
photoHash,
phoneNumber,
gender,
address,
};
}
//accepts a base64 signature and returns a signature object
export function deserializeSignature(signature: string): { R: Point<bigint>; s: bigint } {
const [Rx, Ry, s] = Buffer.from(signature, 'base64').toString('utf-8').split(',').map(BigInt);
return { R: [Rx, Ry] as Point<bigint>, s };
}