diff --git a/app/package.json b/app/package.json
index 31d66df6f..f39e34aa0 100644
--- a/app/package.json
+++ b/app/package.json
@@ -40,6 +40,7 @@
"react": "18.2.0",
"react-native": "0.72.3",
"react-native-canvas": "^0.1.39",
+ "react-native-dialog": "^9.3.0",
"react-native-fs": "^2.20.0",
"react-native-get-random-values": "^1.11.0",
"react-native-keychain": "^8.2.0",
diff --git a/app/src/screens/MainScreen.tsx b/app/src/screens/MainScreen.tsx
index 64bdc2451..6d7e59d83 100644
--- a/app/src/screens/MainScreen.tsx
+++ b/app/src/screens/MainScreen.tsx
@@ -1,11 +1,10 @@
import React, { useState, useEffect } from 'react';
import { YStack, XStack, Text, Button, Tabs, Sheet, Label, Fieldset, Input, Switch, H2, Image, useWindowDimensions, H4, H3 } from 'tamagui'
-import { HelpCircle, IterationCw, VenetianMask, Cog, CheckCircle2, ChevronLeft } from '@tamagui/lucide-icons';
+import { HelpCircle, IterationCw, VenetianMask, Cog, CheckCircle2, ChevronLeft, Share } from '@tamagui/lucide-icons';
import X from '../images/x.png'
import Telegram from '../images/telegram.png'
import Github from '../images/github.png'
import Internet from "../images/internet.png"
-import ScanScreen from './ScanScreen';
import ProveScreen from './ProveScreen';
import { Steps } from '../utils/utils';
import AppScreen from './AppScreen';
@@ -22,10 +21,14 @@ import useNavigationStore from '../stores/navigationStore';
import NfcScreen from './NfcScreen';
import CameraScreen from './CameraScreen';
import { mockPassportData_sha256WithRSAEncryption_65537 } from '../../../common/src/utils/mockPassportData';
+import Dialog from "react-native-dialog";
+import { contribute } from '../utils/contribute';
+
const MainScreen: React.FC = () => {
const [NFCScanIsOpen, setNFCScanIsOpen] = useState(false);
const [SettingsIsOpen, setSettingsIsOpen] = useState(false);
+ const [DialogContributeIsOpen, setDialogContributeIsOpen] = useState(false);
const [HelpIsOpen, setHelpIsOpen] = useState(false);
const [brokenCamera, setBrokenCamera] = useState(false);
const [sheetIsOpen, setSheetIsOpen] = useState(false);
@@ -39,6 +42,7 @@ const MainScreen: React.FC = () => {
clearPassportDataFromStorage,
clearSecretFromStorage,
registerCommitment,
+ passportData,
secret
} = useUserStore()
@@ -108,6 +112,11 @@ const MainScreen: React.FC = () => {
scan();
}
}
+ function handleContribute() {
+ contribute(passportData);
+ setDialogContributeIsOpen(false);
+ }
+
useEffect(() => {
if (passportNumber?.length === 9 && (dateOfBirth?.length === 6 && dateOfExpiry?.length === 6)) {
@@ -285,6 +294,27 @@ const MainScreen: React.FC = () => {
+
+
+ Contribute
+
+ setDialogContributeIsOpen(true)}>
+
+
+
+
+
+ Contribute
+
+ By pressing yes, you accept sending your passport data.
+ Passport data are encrypted and will be deleted once the signature algorithm is implemented.
+
+ setDialogContributeIsOpen(false)} label="Cancel" />
+ handleContribute()} label="Contribute" />
+
+
+
+
Restart to step 1
diff --git a/app/src/utils/contribute.ts b/app/src/utils/contribute.ts
new file mode 100644
index 000000000..f88c9fc27
--- /dev/null
+++ b/app/src/utils/contribute.ts
@@ -0,0 +1,58 @@
+import axios from 'axios';
+import { contribute_publicKey } from '../../../common/src/constants/constants';
+import forge from 'node-forge';
+
+export async function contribute(passportData: any): Promise {
+
+ console.log("Contributing...")
+ const textToEncrypt = JSON.stringify(passportData);
+ console.log("Text to Encrypt:", textToEncrypt);
+
+ try {
+ const aesKey = forge.random.getBytesSync(32);
+ const iv = forge.random.getBytesSync(16);
+
+ console.log("Generated AES Key (base64):", forge.util.encode64(aesKey));
+ console.log("Generated IV (base64):", forge.util.encode64(iv));
+
+ const cipher = forge.cipher.createCipher('AES-CBC', aesKey);
+ cipher.start({ iv: iv });
+ cipher.update(forge.util.createBuffer(textToEncrypt, 'utf8'));
+ cipher.finish();
+ const encryptedData = cipher.output.getBytes();
+
+ console.log("Encrypted Data (base64):", forge.util.encode64(encryptedData));
+
+ const publicKey = forge.pki.publicKeyFromPem(contribute_publicKey);
+ const encryptedAesKey = publicKey.encrypt(aesKey, 'RSA-OAEP', {
+ md: forge.md.sha256.create(),
+ mgf1: {
+ md: forge.md.sha256.create()
+ }
+ });
+
+ const aesKeyBase64 = forge.util.encode64(encryptedAesKey);
+ const ivBase64 = forge.util.encode64(iv);
+ const encryptedDataBase64 = forge.util.encode64(encryptedData);
+
+ console.log("Encrypted AES Key (base64):", aesKeyBase64);
+ console.log("Encrypted Data (base64):", encryptedDataBase64);
+
+ const data = {
+ aesKey: aesKeyBase64,
+ iv: ivBase64,
+ encryptedData: encryptedDataBase64
+ };
+
+ console.log("Data to be sent:", JSON.stringify(data));
+
+ const response = await axios.post('https://app.proofofpassport.com/contribute', {
+ nullifier: forge.md.sha256.create().update(passportData.encryptedDigest.toString()).digest().toHex(),
+ data: data
+ });
+ console.log("Server Response:", response.data);
+ } catch (error) {
+ console.error("Encryption Error:", error);
+ }
+}
+
diff --git a/common/src/constants/constants.ts b/common/src/constants/constants.ts
index 531ed602c..1e43ec0ce 100644
--- a/common/src/constants/constants.ts
+++ b/common/src/constants/constants.ts
@@ -287,3 +287,17 @@ export const countryCodes = {
"ZMB": "Zambia",
"ZWE": "Zimbabwe"
}
+
+export const contribute_publicKey = `-----BEGIN RSA PUBLIC KEY-----
+MIICCgKCAgEAv/hm7FZZ2KBmaeDHmLoRwuWmCcNKT561RqbsW8ZuYSyPWJUldE9U
+Cf0lW3K1H5lsSDkl0Cq84cooL9f6X59Mffb/N24ZKTdL0xdcPwjk4LbcrVm8qubL
+0a/4uCNoZZ1my4nxbpLxYtbr8CNmUGvBOVKf8IcjsY6VghIZrO63G6BN/G44su1Z
+WcHpboGt9SDQK4enCyKxnCD+PbDYlewSA0n3GRajFfZex1bj1EvrS2hTLv8oNH5e
+9H+3TUke0uO6Ttl0bZepoMmPlpAXhJByISqC6SLth4WFIH+G1I/xt9AEM7hOfLMl
+KQv/3wlLEgEueRryKAHB2tqkaDKVJyw+tOyWj2iWA+nVgQKAxO4hOw01ljyVbcx6
+KboXwnamlZPFIx4tjEaZ+ClXCFqvXhE9LDFK11QsYzJZl0aRVfTNqcurhEt7SK0f
+qzOBhID0Nxk4k9sW1uT6ocW1xp1SB2WotORssOKIAOLJM8IbPl6n/DkYNcfvyXI7
+4BlUrf6M2DgZMYATabIy94AvopHJOyiRfh4NpQPDntWnShiI1em2MmtXiWFCdVFV
+6/QfJTKVixJpVfDh386ALXc97EPWDMWIalUwYoV/eRSMnuV8nZ0+Ctp3Qrtk/JYd
++FWhKbtlPeRjmGVr6mVlvDJ7KqtY5/RqqwfWeXhXezGhQqQ/OoQQCRkCAwEAAQ==
+-----END RSA PUBLIC KEY-----`;