diff --git a/app/package.json b/app/package.json index 02966df12..9636fa367 100644 --- a/app/package.json +++ b/app/package.json @@ -29,6 +29,8 @@ "body-parser": "^1.20.2", "buffer": "^6.0.3", "burnt": "^0.12.2", + "country-emoji": "^1.5.6", + "country-iso-3-to-2": "^1.1.1", "crypto-js": "^4.1.1", "ethers": "^6.11.0", "expo-modules-core": "^1.11.12", diff --git a/app/src/screens/CameraScreen.tsx b/app/src/screens/CameraScreen.tsx index 3067b10c1..6fbfc21a2 100644 --- a/app/src/screens/CameraScreen.tsx +++ b/app/src/screens/CameraScreen.tsx @@ -46,12 +46,12 @@ const CameraScreen: React.FC = ({ sheetIsOpen, setSheetIsOpen localProof, } = useUserStore() const handleSkip = () => { - update({ - passportData: mockPassportData_sha256_rsa_65537 - }) - setSelectedTab("next"); - deleteMrzFields(); - toast.show("Using mock passport data!", { type: "info" }) + // update({ + // passportData: mockPassportData_sha256_rsa_65537 + // }) + setSelectedTab("mock"); + // deleteMrzFields(); + // toast.show("Using mock passport data!", { type: "info" }) } return ( diff --git a/app/src/screens/MainScreen.tsx b/app/src/screens/MainScreen.tsx index 02a35abc2..2c18e2dd8 100644 --- a/app/src/screens/MainScreen.tsx +++ b/app/src/screens/MainScreen.tsx @@ -53,6 +53,7 @@ import StepOneStepTwo from '../components/StepOneStepTwo'; import SplashScreen from './SplashScreen'; import ValidProofScreen from './ValidProofScreen'; import WrongProofScreen from './WrongProofScreen'; +import MockDataScreen from './MockDataScreen'; const MainScreen: React.FC = () => { const [NFCScanIsOpen, setNFCScanIsOpen] = useState(false); @@ -785,6 +786,9 @@ const MainScreen: React.FC = () => { + + + { + const { update: updateNavigationStore } = useNavigationStore(); + const [signatureAlgorithm, setSignatureAlgorithm] = useState("rsa sha256"); + const listOfSignatureAlgorithms = ["rsa sha1", "rsa sha256", "rsapss sha256"]; + + const [dateOfBirthDatePicker, setDateOfBirthDatePicker] = useState(new Date(new Date().setFullYear(new Date().getFullYear() - 24))) + const [dateOfBirthDatePickerFormatted, setDateOfBirthDatePickerFormatted] = useState(null) + const [dateOfExpiryDatePicker, setDateOfExpiryDatePicker] = useState(new Date(new Date().setFullYear(new Date().getFullYear() + 5))) + const [dateOfExpiryDatePickerFormatted, setDateOfExpiryDatePickerFormatted] = useState(null) + const [dateOfBirthDatePickerIsOpen, setDateOfBirthDatePickerIsOpen] = useState(false) + const [dateOfExpiryDatePickerIsOpen, setDateOfExpiryDatePickerIsOpen] = useState(false) + const [nationality, setNationality] = useState("FRA") + + const castDate = (date: Date) => { + return (date.toISOString().slice(2, 4) + date.toISOString().slice(5, 7) + date.toISOString().slice(8, 10)).toString(); + } + const getDSC = () => { + switch (signatureAlgorithm) { + case "rsa sha1": + return mock_dsc_sha1_rsa_4096 + case "rsa sha256": + return mock_dsc_sha256_rsa_4096 + case "rsapss sha256": + return mock_dsc_sha256_rsapss_4096 + } + } + // const getPassportData = () => { + // switch (signatureAlgorithm) { + // case "rsa_sha1": + // return mockPassportData_sha1_rsa_65537 + // case "rsa_sha256": + // return mockPassportData_sha256_rsa_65537 + // } + // } + + const handleGenerate = () => { + + const mockPassportData = genMockPassportData(signatureAlgorithm as "rsa sha256" | "rsa sha1" | "rsapss sha256", nationality, castDate(dateOfBirthDatePicker), castDate(dateOfExpiryDatePicker)); + const dsc = getDSC() + console.log(mockPassportData) + updateNavigationStore({ + passportData: mockPassportData, + }); + useUserStore.getState().dscCertificate = dsc; + useUserStore.getState().setRegistered(true); + useNavigationStore.getState().setSelectedTab("app"); + }; + + return ( + + Generate passport data + + + Encryption + + + + + + + + Issuer country + + + + + +
+ + Date of birth + + + {dateOfBirthDatePicker ? dateOfBirthDatePicker.toISOString().slice(0, 10) : ''} + + + { + setDateOfBirthDatePickerIsOpen(false) + setDateOfBirthDatePicker(date) + }} + onCancel={() => { + setDateOfBirthDatePickerIsOpen(false) + }} + /> +
+
+ + Date of expiry + + + {dateOfExpiryDatePicker ? dateOfExpiryDatePicker.toISOString().slice(0, 10) : ''} + + + { + setDateOfExpiryDatePickerIsOpen(false) + setDateOfExpiryDatePicker(date) + }} + onCancel={() => { + setDateOfExpiryDatePickerIsOpen(false) + }} + /> +
+ + + } /> + + ); +}; + +export default MockDataScreen; \ No newline at end of file diff --git a/app/src/types/country-iso-3-to-2.d.ts b/app/src/types/country-iso-3-to-2.d.ts new file mode 100644 index 000000000..72a6b39db --- /dev/null +++ b/app/src/types/country-iso-3-to-2.d.ts @@ -0,0 +1,4 @@ +declare module 'country-iso-3-to-2' { + function getCountryISO2(iso3: string): string; + export = getCountryISO2; +} \ No newline at end of file diff --git a/app/tsconfig.json b/app/tsconfig.json index df8e5b3c9..d35258423 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -5,5 +5,9 @@ "dom", "esnext" ] - } + }, + "typeRoots": [ + "./node_modules/@types", + "./src/types" + ] } \ No newline at end of file diff --git a/common/scripts/passportData/genMockPassportData.ts b/common/scripts/passportData/genMockPassportData.ts new file mode 100644 index 000000000..24e7872fa --- /dev/null +++ b/common/scripts/passportData/genMockPassportData.ts @@ -0,0 +1,92 @@ +import { PassportData } from "../../src/utils/types"; +import { hash, assembleEContent, formatAndConcatenateDataHashes, formatMrz, hexToDecimal } from "../../src/utils/utils"; +import * as forge from 'node-forge'; +import * as rs from 'jsrsasign'; +import { mock_dsc_key_sha1_rsa_4096, mock_dsc_key_sha256_rsa_4096, mock_dsc_key_sha256_rsapss_2048, mock_dsc_sha256_rsapss_2048 } from "../../src/constants/mockCertificates"; +import { sampleDataHashes_rsa_sha1, sampleDataHashes_rsa_sha256, sampleDataHashes_rsapss_sha256 } from "./sampleDataHashes"; + +export function genMockPassportData( + signatureType: 'rsa sha1' | 'rsa sha256' | 'rsapss sha256', + nationality: string, + birthDate: string, + expiryDate +): PassportData { + const lastName = 'DUPONT'; + const firstNames = 'ALPHONSE c.charCodeAt(0)); + } else { + const md = signatureType === 'rsa sha1' ? forge.md.sha1.create() : forge.md.sha256.create(); + md.update(forge.util.binary.raw.encode(new Uint8Array(eContent))); + const forgeSignature = privKey.sign(md); + signature = Array.from(forgeSignature, (c: string) => c.charCodeAt(0)); + } + + const signatureBytes = Array.from(signature, byte => byte < 128 ? byte : byte - 256); + + return { + mrz: mrz, + signatureAlgorithm: signatureAlgorithm, + pubKey: { + modulus: hexToDecimal(modulus), + exponent: '65537', + }, + dataGroupHashes: concatenatedDataHashes, + eContent: eContent, + encryptedDigest: signatureBytes, + photoBase64: "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABjElEQVR42mL8//8/AyUYiBQYmIy3..." + }; +} \ No newline at end of file diff --git a/common/scripts/passportData/sampleDataHashes.ts b/common/scripts/passportData/sampleDataHashes.ts new file mode 100644 index 000000000..0d34dbe4a --- /dev/null +++ b/common/scripts/passportData/sampleDataHashes.ts @@ -0,0 +1,68 @@ +export const sampleDataHashes_rsa_sha1 = [ + [ + 2, + [-66, 82, -76, -21, -34, 33, 79, 50, -104, -120, -114, 35, 116, -32, 6, -14, -100, -115, -128, -8] + ], + [ + 3, + [0, -62, 104, 108, -19, -10, 97, -26, 116, -58, 69, 110, 26, 87, 17, 89, 110, -57, 108, -6] + ], + [ + 14, + [76, 123, -40, 13, 51, -29, 72, -11, 59, -63, -18, -90, 103, 49, 23, -92, -85, -68, -62, -59] + ] +] as [number, number[]][] + +export const sampleDataHashes_rsa_sha256 = [ + [ + 2, + [-66, 82, -76, -21, -34, 33, 79, 50, -104, -120, -114, 35, 116, -32, 6, -14, -100, -115, -128, -8, 10, 61, 98, 86, -8, 45, -49, -46, 90, -24, -81, 38] + ], + [ + 3, + [0, -62, 104, 108, -19, -10, 97, -26, 116, -58, 69, 110, 26, 87, 17, 89, 110, -57, 108, -6, 36, 21, 39, 87, 110, 102, -6, -43, -82, -125, -85, -82] + ], + [ + 11, + [-120, -101, 87, -112, 111, 15, -104, 127, 85, 25, -102, 81, 20, 58, 51, 75, -63, 116, -22, 0, 60, 30, 29, 30, -73, -115, 72, -9, -1, -53, 100, 124] + ], + [ + 12, + [41, -22, 106, 78, 31, 11, 114, -119, -19, 17, 92, 71, -122, 47, 62, 78, -67, -23, -55, -42, 53, 4, 47, -67, -55, -123, 6, 121, 34, -125, 64, -114] + ], + [ + 13, + [91, -34, -46, -63, 62, -34, 104, 82, 36, 41, -118, -3, 70, 15, -108, -48, -100, 45, 105, -85, -15, -61, -71, 43, -39, -94, -110, -55, -34, 89, -18, 38] + ], + [ + 14, + [76, 123, -40, 13, 51, -29, 72, -11, 59, -63, -18, -90, 103, 49, 23, -92, -85, -68, -62, -59, -100, -69, -7, 28, -58, 95, 69, 15, -74, 56, 54, 38] + ] +] as [number, number[]][] + +export const sampleDataHashes_rsapss_sha256 = [ + [ + 2, + [-66, 82, -76, -21, -34, 33, 79, 50, -104, -120, -114, 35, 116, -32, 6, -14, -100, -115, -128, -8, 10, 61, 98, 86, -8, 45, -49, -46, 90, -24, -81, 38] + ], + [ + 3, + [0, -62, 104, 108, -19, -10, 97, -26, 116, -58, 69, 110, 26, 87, 17, 89, 110, -57, 108, -6, 36, 21, 39, 87, 110, 102, -6, -43, -82, -125, -85, -82] + ], + [ + 11, + [-120, -101, 87, -112, 111, 15, -104, 127, 85, 25, -102, 81, 20, 58, 51, 75, -63, 116, -22, 0, 60, 30, 29, 30, -73, -115, 72, -9, -1, -53, 100, 124] + ], + [ + 12, + [41, -22, 106, 78, 31, 11, 114, -119, -19, 17, 92, 71, -122, 47, 62, 78, -67, -23, -55, -42, 53, 4, 47, -67, -55, -123, 6, 121, 34, -125, 64, -114] + ], + [ + 13, + [91, -34, -46, -63, 62, -34, 104, 82, 36, 41, -118, -3, 70, 15, -108, -48, -100, 45, 105, -85, -15, -61, -71, 43, -39, -94, -110, -55, -34, 89, -18, 38] + ], + [ + 14, + [76, 123, -40, 13, 51, -29, 72, -11, 59, -63, -18, -90, 103, 49, 23, -92, -85, -68, -62, -59, -100, -69, -7, 28, -58, 95, 69, 15, -74, 56, 54, 38] + ] +] as [number, number[]][] \ No newline at end of file