mirror of
https://github.com/selfxyz/self.git
synced 2026-04-27 03:01:15 -04:00
Merge branch 'dev' into fix/zkemail-rsa
This commit is contained in:
4
.github/workflows/action.yml
vendored
4
.github/workflows/action.yml
vendored
@@ -4,6 +4,7 @@ on:
|
||||
branches:
|
||||
- dev
|
||||
- main
|
||||
- openpassportv2
|
||||
paths:
|
||||
- 'circuits/**'
|
||||
- 'common/**'
|
||||
@@ -11,6 +12,7 @@ on:
|
||||
branches:
|
||||
- dev
|
||||
- main
|
||||
- openpassportv2
|
||||
paths:
|
||||
- 'circuits/**'
|
||||
- 'common/**'
|
||||
@@ -59,6 +61,8 @@ jobs:
|
||||
|
||||
- name: Run Tests (Circuits)
|
||||
working-directory: ./circuits
|
||||
env:
|
||||
FULL_TEST_SUITE: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/openpassportv2' }}
|
||||
run: yarn test
|
||||
|
||||
- name: Run Tests (Common)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
| nodejs | > v18 | [Install nodejs](https://nodejs.org/) |
|
||||
| circom | Latest | [Install circom](https://docs.circom.io/) |
|
||||
| snarkjs | Latest | [Install snarkjs](https://github.com/iden3/snarkjs) |
|
||||
| watchman | Latest | [Install watchman](https://facebook.github.io/watchman/) |
|
||||
|
||||
|
||||
### Android
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
1686F0E02C500FBD00841CDE /* QRScannerBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 1686F0DF2C500FBD00841CDE /* QRScannerBridge.m */; };
|
||||
16E6646E2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16E6646D2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift */; };
|
||||
16E884A52C5BD764003B7125 /* passport.json in Resources */ = {isa = PBXBuildFile; fileRef = 16E884A42C5BD764003B7125 /* passport.json */; };
|
||||
205310F3BECB4ECF3B41887C /* Pods_OpenPassport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A19556C626C22D40B7D18E23 /* Pods_OpenPassport.framework */; };
|
||||
1B904271B8E1DB8434EF0613 /* Pods_OpenPassport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3435ED6D988B5E2DE0DE8101 /* Pods_OpenPassport.framework */; };
|
||||
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
|
||||
905B70052A72767900AFA232 /* PassportReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 905B70042A72767900AFA232 /* PassportReader.swift */; };
|
||||
905B70072A72774000AFA232 /* PassportReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 905B70062A72774000AFA232 /* PassportReader.m */; };
|
||||
@@ -112,14 +112,14 @@
|
||||
169349842CC694DA00166F21 /* OpenPassportDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = OpenPassportDebug.entitlements; path = OpenPassport/OpenPassportDebug.entitlements; sourceTree = "<group>"; };
|
||||
16E6646D2B8D292500FDD6A0 /* QKMRZScannerViewRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QKMRZScannerViewRepresentable.swift; sourceTree = "<group>"; };
|
||||
16E884A42C5BD764003B7125 /* passport.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = passport.json; sourceTree = "<group>"; };
|
||||
7C737C07B2C3788F9AB02DE4 /* Pods-OpenPassport.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenPassport.release.xcconfig"; path = "Target Support Files/Pods-OpenPassport/Pods-OpenPassport.release.xcconfig"; sourceTree = "<group>"; };
|
||||
3435ED6D988B5E2DE0DE8101 /* Pods_OpenPassport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_OpenPassport.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = OpenPassport/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
905B70032A72767800AFA232 /* OpenPassport-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OpenPassport-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
905B70042A72767900AFA232 /* PassportReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PassportReader.swift; sourceTree = "<group>"; };
|
||||
905B70062A72774000AFA232 /* PassportReader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PassportReader.m; sourceTree = "<group>"; };
|
||||
905B70082A729CD400AFA232 /* OpenPassport.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = OpenPassport.entitlements; path = OpenPassport/OpenPassport.entitlements; sourceTree = "<group>"; };
|
||||
A19556C626C22D40B7D18E23 /* Pods_OpenPassport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_OpenPassport.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C9DDA5F7441C6B4DEC17FCC9 /* Pods-OpenPassport.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenPassport.debug.xcconfig"; path = "Target Support Files/Pods-OpenPassport/Pods-OpenPassport.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
A239B1BBD7EF208EB51EF7DE /* Pods-OpenPassport.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenPassport.release.xcconfig"; path = "Target Support Files/Pods-OpenPassport/Pods-OpenPassport.release.xcconfig"; sourceTree = "<group>"; };
|
||||
BB9316819FB038104D42933E /* Pods-OpenPassport.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenPassport.debug.xcconfig"; path = "Target Support Files/Pods-OpenPassport/Pods-OpenPassport.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
E56E082698598B41447667BB /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = OpenPassport/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
|
||||
/* End PBXFileReference section */
|
||||
@@ -140,7 +140,7 @@
|
||||
05D985F62BB331AB00F58EEA /* libfr.a in Frameworks */,
|
||||
167D934A2C91D2EA00530E6B /* libwitnesscalc_prove_rsa_65537_sha256.a in Frameworks */,
|
||||
167D93462C91B1E100530E6B /* libwitnesscalc_register_rsa_65537_sha1.a in Frameworks */,
|
||||
205310F3BECB4ECF3B41887C /* Pods_OpenPassport.framework in Frameworks */,
|
||||
1B904271B8E1DB8434EF0613 /* Pods_OpenPassport.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -227,7 +227,7 @@
|
||||
0569F35E2BBC98C9006670BD /* libfq.a */,
|
||||
0569F35A2BBC900D006670BD /* librapidsnark.a */,
|
||||
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
|
||||
A19556C626C22D40B7D18E23 /* Pods_OpenPassport.framework */,
|
||||
3435ED6D988B5E2DE0DE8101 /* Pods_OpenPassport.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@@ -274,8 +274,8 @@
|
||||
BBD78D7AC51CEA395F1C20DB /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C9DDA5F7441C6B4DEC17FCC9 /* Pods-OpenPassport.debug.xcconfig */,
|
||||
7C737C07B2C3788F9AB02DE4 /* Pods-OpenPassport.release.xcconfig */,
|
||||
BB9316819FB038104D42933E /* Pods-OpenPassport.debug.xcconfig */,
|
||||
A239B1BBD7EF208EB51EF7DE /* Pods-OpenPassport.release.xcconfig */,
|
||||
);
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
@@ -287,15 +287,15 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "OpenPassport" */;
|
||||
buildPhases = (
|
||||
17F3EE4BABFEFEDC3C2AD3FC /* [CP] Check Pods Manifest.lock */,
|
||||
62212FE980074600640A3F2F /* [CP] Check Pods Manifest.lock */,
|
||||
FD10A7F022414F080027D42C /* Start Packager */,
|
||||
13B07F871A680F5B00A75B9A /* Sources */,
|
||||
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
||||
13B07F8E1A680F5B00A75B9A /* Resources */,
|
||||
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
||||
054340D12C71B2980014B445 /* Embed App Clips */,
|
||||
A032F3F676B35028E7879043 /* [CP] Embed Pods Frameworks */,
|
||||
C35A2C941C33076C64ACA128 /* [CP] Copy Pods Resources */,
|
||||
19B6B230BF58128B7603B834 /* [CP] Embed Pods Frameworks */,
|
||||
CCF107224BF9CF7E8A4F57B7 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -369,7 +369,24 @@
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
|
||||
};
|
||||
17F3EE4BABFEFEDC3C2AD3FC /* [CP] Check Pods Manifest.lock */ = {
|
||||
19B6B230BF58128B7603B834 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-OpenPassport/Pods-OpenPassport-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-OpenPassport/Pods-OpenPassport-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OpenPassport/Pods-OpenPassport-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
62212FE980074600640A3F2F /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -391,24 +408,7 @@
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
A032F3F676B35028E7879043 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-OpenPassport/Pods-OpenPassport-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-OpenPassport/Pods-OpenPassport-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OpenPassport/Pods-OpenPassport-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
C35A2C941C33076C64ACA128 /* [CP] Copy Pods Resources */ = {
|
||||
CCF107224BF9CF7E8A4F57B7 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -492,7 +492,7 @@
|
||||
/* Begin XCBuildConfiguration section */
|
||||
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = C9DDA5F7441C6B4DEC17FCC9 /* Pods-OpenPassport.debug.xcconfig */;
|
||||
baseConfigurationReference = BB9316819FB038104D42933E /* Pods-OpenPassport.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
@@ -633,7 +633,7 @@
|
||||
};
|
||||
13B07F951A680F5B00A75B9A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7C737C07B2C3788F9AB02DE4 /* Pods-OpenPassport.release.xcconfig */;
|
||||
baseConfigurationReference = A239B1BBD7EF208EB51EF7DE /* Pods-OpenPassport.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
@@ -857,7 +857,10 @@
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
);
|
||||
OTHER_LDFLAGS = "$(inherited) ";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
" ",
|
||||
);
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
|
||||
@@ -947,7 +950,10 @@
|
||||
"-DFOLLY_MOBILE=1",
|
||||
"-DFOLLY_USE_LIBCPP=1",
|
||||
);
|
||||
OTHER_LDFLAGS = "$(inherited) ";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
" ",
|
||||
);
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
USE_HERMES = false;
|
||||
|
||||
@@ -47,10 +47,17 @@ target 'OpenPassport' do
|
||||
post_install do |installer|
|
||||
installer.generated_projects.each do |project|
|
||||
project.targets.each do |target|
|
||||
if target.name == 'RNZipArchive'
|
||||
target.source_build_phase.files.each do |file|
|
||||
if file.settings && file.settings['COMPILER_FLAGS']
|
||||
file.settings['COMPILER_FLAGS'] = ''
|
||||
end
|
||||
end
|
||||
end
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
|
||||
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1813,8 +1813,8 @@ SPEC CHECKSUMS:
|
||||
SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef
|
||||
SwiftQRScanner: e85a25f9b843e9231dab89a96e441472fe54a724
|
||||
SwiftyTesseract: 1f3d96668ae92dc2208d9842c8a59bea9fad2cbb
|
||||
Yoga: b05994d1933f507b0a28ceaa4fdb968dc18da178
|
||||
Yoga: a9ef4f5c2cd79ad812110525ef61048be6a582a4
|
||||
|
||||
PODFILE CHECKSUM: fff5f0fc97e17fb53d7fd9198944714a37fed0a6
|
||||
PODFILE CHECKSUM: cc6778e0dcd4c510b705f4dc458411547dc1d00c
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
"@tamagui/lucide-icons": "1.110.0",
|
||||
"@tamagui/toast": "1.110.0",
|
||||
"@tamagui/types": "1.110.0",
|
||||
"@types/msgpack-lite": "^0.1.11",
|
||||
"@types/pako": "^2.0.3",
|
||||
"axios": "^1.6.3",
|
||||
"buffer": "^6.0.3",
|
||||
"burnt": "^0.12.2",
|
||||
@@ -66,7 +64,9 @@
|
||||
"@tsconfig/react-native": "^3.0.0",
|
||||
"@types/crypto-js": "^4.1.1",
|
||||
"@types/express": "^4.17.17",
|
||||
"@types/msgpack-lite": "^0.1.11",
|
||||
"@types/node-forge": "^1.3.3",
|
||||
"@types/pako": "^2.0.3",
|
||||
"@types/react": "^18.2.6",
|
||||
"@types/react-native-dotenv": "^0.2.0",
|
||||
"@types/react-test-renderer": "^18.0.0",
|
||||
|
||||
@@ -48,7 +48,6 @@ template VC_AND_DISCLOSE( nLevels,FORBIDDEN_COUNTRIES_LIST_LENGTH) {
|
||||
component poseidon_nullifier = PoseidonHash(2);
|
||||
poseidon_nullifier.in[0] <== secret;
|
||||
poseidon_nullifier.in[1] <== scope;
|
||||
poseidon_nullifier.dummy <== 0;
|
||||
signal output nullifier <== poseidon_nullifier.out;
|
||||
signal output revealedData_packed[3] <== disclose.revealedData_packed;
|
||||
signal output older_than[2] <== disclose.older_than;
|
||||
|
||||
@@ -34,7 +34,6 @@ template OPENPASSPORT_DSC(signatureAlgorithm, n_dsc, k_dsc, n_csca, k_csca, max_
|
||||
signal input path[nLevels];
|
||||
signal input siblings[nLevels];
|
||||
|
||||
signal dummy <== 0;
|
||||
|
||||
// leaf
|
||||
signal leaf <== LeafHasher(kScaled)(csca_pubKey, signatureAlgorithm);
|
||||
@@ -45,7 +44,7 @@ template OPENPASSPORT_DSC(signatureAlgorithm, n_dsc, k_dsc, n_csca, k_csca, max_
|
||||
// verify certificate signature
|
||||
signal hashedCertificate[hashLength] <== ShaBytesDynamic(hashLength, max_cert_bytes)(raw_dsc_cert, raw_dsc_cert_padded_bytes);
|
||||
|
||||
SignatureVerifier(signatureAlgorithm, n_csca, k_csca)(hashedCertificate, csca_pubKey, signature, dummy);
|
||||
SignatureVerifier(signatureAlgorithm, n_csca, k_csca)(hashedCertificate, csca_pubKey, signature);
|
||||
|
||||
// verify DSC csca_pubKey
|
||||
component shiftLeft = VarShiftLeft(max_cert_bytes, dscPubkeyBytesLength); // use select subarray for dscPubKey variable length
|
||||
@@ -59,6 +58,6 @@ template OPENPASSPORT_DSC(signatureAlgorithm, n_dsc, k_dsc, n_csca, k_csca, max_
|
||||
|
||||
// blinded dsc commitment
|
||||
signal pubkeyHash <== CustomHasher(k_dsc)(dsc_pubKey);
|
||||
signal output blinded_dsc_commitment <== PoseidonHash(2)([secret, pubkeyHash], 0);
|
||||
signal output blinded_dsc_commitment <== PoseidonHash(2)([secret, pubkeyHash]);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ template OPENPASSPORT_PROVE(signatureAlgorithm, n, k, MAX_ECONTENT_PADDED_LEN, M
|
||||
signal input secret;
|
||||
signal input dsc_secret;
|
||||
|
||||
signal dummy <== 0;
|
||||
|
||||
signal attestation_id <== 1;
|
||||
|
||||
@@ -59,7 +58,7 @@ template OPENPASSPORT_PROVE(signatureAlgorithm, n, k, MAX_ECONTENT_PADDED_LEN, M
|
||||
isWrongSelectorMode === 0;
|
||||
|
||||
// verify passport signature
|
||||
PassportVerifier(signatureAlgorithm, n, k, MAX_ECONTENT_PADDED_LEN, MAX_SIGNED_ATTR_PADDED_LEN)(dg1,dg1_hash_offset, dg2_hash, eContent,eContent_padded_length, signed_attr, signed_attr_padded_length, signed_attr_econtent_hash_offset, pubKey, signature, dummy);
|
||||
PassportVerifier(signatureAlgorithm, n, k, MAX_ECONTENT_PADDED_LEN, MAX_SIGNED_ATTR_PADDED_LEN)(dg1,dg1_hash_offset, dg2_hash, eContent,eContent_padded_length, signed_attr, signed_attr_padded_length, signed_attr_econtent_hash_offset, pubKey, signature);
|
||||
// verify passport is not expired
|
||||
component isValid = IsValid();
|
||||
isValid.currDate <== current_date;
|
||||
@@ -72,7 +71,6 @@ template OPENPASSPORT_PROVE(signatureAlgorithm, n, k, MAX_ECONTENT_PADDED_LEN, M
|
||||
component poseidon_hasher = PoseidonHash(2);
|
||||
poseidon_hasher.in[0] <== signatureHashed;
|
||||
poseidon_hasher.in[1] <== scope;
|
||||
poseidon_hasher.dummy <== 0;
|
||||
signal output nullifier <== poseidon_hasher.out;
|
||||
|
||||
// DISCLOSE (optional)
|
||||
@@ -116,6 +114,6 @@ template OPENPASSPORT_PROVE(signatureAlgorithm, n, k, MAX_ECONTENT_PADDED_LEN, M
|
||||
signal output commitment <== commitmentPrivate * selectorModeCommitment;
|
||||
// // blinded dsc commitment
|
||||
signal pubkeyHash <== CustomHasher(kScaled)(pubKey);
|
||||
signal blindedDscCommitmenPrivate <== PoseidonHash(2)([dsc_secret, pubkeyHash],0);
|
||||
signal blindedDscCommitmenPrivate <== PoseidonHash(2)([dsc_secret, pubkeyHash]);
|
||||
signal output blinded_dsc_commitment <== blindedDscCommitmenPrivate * selectorModeBlindedDscCommitment;
|
||||
}
|
||||
|
||||
72
circuits/circuits/removeDummy.py
Normal file
72
circuits/circuits/removeDummy.py
Normal file
@@ -0,0 +1,72 @@
|
||||
import os
|
||||
import re
|
||||
|
||||
def process_line(line):
|
||||
# Handle "+ dummy * dummy" pattern at the end (only lowercase, standalone 'dummy')
|
||||
line = re.sub(r'\s*\+\s*\bdummy\b\s*\*\s*\bdummy\b', '', line)
|
||||
|
||||
# Handle "dummy * dummy +" pattern at the start of expression (only lowercase, standalone 'dummy')
|
||||
line = re.sub(r'<==\s*\bdummy\b\s*\*\s*\bdummy\b\s*\+\s*', '<== ', line)
|
||||
|
||||
# If line starts with uppercase or contains 'template'
|
||||
if line[0].isupper() or 'template' in line.lower():
|
||||
# Remove ', dummy' or 'dummy,' pattern (only lowercase, standalone 'dummy')
|
||||
line = re.sub(r',\s*\bdummy\b(?![A-Za-z])', '', line)
|
||||
line = re.sub(r'\bdummy\b(?![A-Za-z]),', '', line)
|
||||
# Remove standalone 'dummy' (only lowercase)
|
||||
line = re.sub(r'\bdummy\b(?![A-Za-z])', '', line)
|
||||
return line
|
||||
# Handle function calls with dummy parameter
|
||||
elif '(' in line and ')' in line:
|
||||
# Remove ', dummy' before closing parenthesis (only lowercase, standalone 'dummy')
|
||||
line = re.sub(r',\s*\bdummy\b(?![A-Za-z])\s*\)', ')', line)
|
||||
return line
|
||||
# For other lines, if they contain standalone 'dummy' (lowercase only), return None to remove the entire line
|
||||
elif re.search(r'\bdummy\b(?![A-Za-z])', line):
|
||||
return None
|
||||
return line
|
||||
|
||||
def remove_dummy_lines(directory):
|
||||
# Walk through all directories and files
|
||||
for root, dirs, files in os.walk(directory):
|
||||
# Filter for .circom files
|
||||
for file in files:
|
||||
if file.endswith('.circom'):
|
||||
file_path = os.path.join(root, file)
|
||||
print(f"Processing: {file_path}")
|
||||
|
||||
# Read file content
|
||||
with open(file_path, 'r') as f:
|
||||
lines = f.readlines()
|
||||
|
||||
# Process lines
|
||||
new_lines = []
|
||||
lines_removed = 0
|
||||
for line in lines:
|
||||
processed_line = process_line(line)
|
||||
if processed_line is not None:
|
||||
new_lines.append(processed_line)
|
||||
else:
|
||||
lines_removed += 1
|
||||
|
||||
# If we found and modified/removed any lines
|
||||
if len(lines) != len(new_lines):
|
||||
print(f"Modified/Removed {lines_removed} lines containing 'dummy' in {file_path}")
|
||||
|
||||
# Write back the filtered content
|
||||
with open(file_path, 'w') as f:
|
||||
f.writelines(new_lines)
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Get the current directory where the script is running
|
||||
current_dir = os.getcwd()
|
||||
|
||||
# Ask for confirmation
|
||||
print(f"This will process 'dummy' occurrences in .circom files in {current_dir} and its subdirectories.")
|
||||
confirm = input("Do you want to continue? (y/n): ")
|
||||
|
||||
if confirm.lower() == 'y':
|
||||
remove_dummy_lines(current_dir)
|
||||
print("Process completed!")
|
||||
else:
|
||||
print("Operation cancelled.")
|
||||
@@ -47,10 +47,9 @@ template BigAddNoCarry(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
out[i] <== in[0][i] + in[1][i] + dummy * dummy;
|
||||
out[i] <== in[0][i] + in[1][i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,11 +59,9 @@ template BigAdd(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER + 1];
|
||||
signal input dummy;
|
||||
|
||||
component bigAddNoCarry = BigAddNoCarry(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigAddNoCarry.in <== in;
|
||||
bigAddNoCarry.dummy <== dummy;
|
||||
|
||||
component num2bits[CHUNK_NUMBER];
|
||||
|
||||
@@ -75,16 +72,16 @@ template BigAdd(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
if (i == 0){
|
||||
num2bits[i].in <== bigAddNoCarry.out[i];
|
||||
} else {
|
||||
num2bits[i].in <== bigAddNoCarry.out[i] + num2bits[i - 1].out[CHUNK_SIZE] + dummy * dummy;
|
||||
num2bits[i].in <== bigAddNoCarry.out[i] + num2bits[i - 1].out[CHUNK_SIZE];
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
if (i == 0) {
|
||||
out[i] <== bigAddNoCarry.out[i] - (num2bits[i].out[CHUNK_SIZE]) * (2 ** CHUNK_SIZE) + dummy * dummy;
|
||||
out[i] <== bigAddNoCarry.out[i] - (num2bits[i].out[CHUNK_SIZE]) * (2 ** CHUNK_SIZE);
|
||||
}
|
||||
else {
|
||||
out[i] <== bigAddNoCarry.out[i] - (num2bits[i].out[CHUNK_SIZE]) * (2 ** CHUNK_SIZE) + num2bits[i - 1].out[CHUNK_SIZE] + dummy * dummy;
|
||||
out[i] <== bigAddNoCarry.out[i] - (num2bits[i].out[CHUNK_SIZE]) * (2 ** CHUNK_SIZE) + num2bits[i - 1].out[CHUNK_SIZE];
|
||||
}
|
||||
}
|
||||
out[CHUNK_NUMBER] <== num2bits[CHUNK_NUMBER - 1].out[CHUNK_SIZE];
|
||||
@@ -97,7 +94,6 @@ template BigMultNoCarry(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
assert(CHUNK_SIZE <= 126);
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
signal output out[CHUNK_NUMBER * 2 - 1];
|
||||
|
||||
signal tmpMults[CHUNK_NUMBER][CHUNK_NUMBER];
|
||||
@@ -127,7 +123,7 @@ template BigMultNoCarry(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[i - j][j];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][i];
|
||||
@@ -137,7 +133,7 @@ template BigMultNoCarry(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[CHUNK_NUMBER - 1 - j][i + j - CHUNK_NUMBER + 1];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[CHUNK_NUMBER - 1 - j][i + j - CHUNK_NUMBER + 1] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[CHUNK_NUMBER - 1 - j][i + j - CHUNK_NUMBER + 1] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][2 * CHUNK_NUMBER - 2 - i];
|
||||
@@ -151,15 +147,12 @@ template BigMultNoCarry(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
template BigMult(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[CHUNK_NUMBER * 2];
|
||||
|
||||
component bigMultNoCarry = BigMultNoCarry(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigMultNoCarry.in <== in;
|
||||
bigMultNoCarry.dummy <== dummy;
|
||||
|
||||
component num2bits[CHUNK_NUMBER * 2 - 1];
|
||||
component bits2numOverflow[CHUNK_NUMBER * 2 - 1];
|
||||
@@ -179,7 +172,7 @@ template BigMult(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
if (i == 0){
|
||||
num2bits[i].in <== bigMultNoCarry.out[i];
|
||||
} else {
|
||||
num2bits[i].in <== dummy * dummy + bigMultNoCarry.out[i] + bits2numOverflow[i - 1].out;
|
||||
num2bits[i].in <== bigMultNoCarry.out[i] + bits2numOverflow[i - 1].out;
|
||||
}
|
||||
|
||||
bits2numOverflow[i] = Bits2Num(CHUNK_SIZE + ADDITIONAL_LEN);
|
||||
@@ -206,15 +199,12 @@ template BigMult(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
// use only for CHUNK_NUMBER == 2 ** x
|
||||
template BigMultOptimised(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input dummy;
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER * 2];
|
||||
|
||||
component karatsuba = KaratsubaNoCarry(CHUNK_NUMBER);
|
||||
karatsuba.in <== in;
|
||||
karatsuba.dummy <== dummy;
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
component getLastNBits[CHUNK_NUMBER * 2 - 1];
|
||||
component bits2Num[CHUNK_NUMBER * 2 - 1];
|
||||
@@ -245,7 +235,6 @@ template BigMod(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input base[CHUNK_NUMBER * 2];
|
||||
signal input modulus[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
var long_division[2][200] = long_div(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER, base, modulus);
|
||||
|
||||
@@ -265,7 +254,6 @@ template BigMod(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
multChecks.in1 <== div;
|
||||
multChecks.in2 <== modulus;
|
||||
multChecks.dummy <== dummy;
|
||||
|
||||
component greaterThan = BigGreaterThan(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
|
||||
@@ -279,7 +267,6 @@ template BigMod(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
bigAddCheck.in1 <== multChecks.out;
|
||||
bigAddCheck.in2 <== mod;
|
||||
bigAddCheck.dummy <== dummy;
|
||||
|
||||
|
||||
component smartEqual = SmartEqual(CHUNK_SIZE, CHUNK_NUMBER * 2 + 2);
|
||||
@@ -289,7 +276,6 @@ template BigMod(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
}
|
||||
smartEqual.in[1][CHUNK_NUMBER * 2] <== 0;
|
||||
smartEqual.in[1][CHUNK_NUMBER * 2 + 1] <== 0;
|
||||
smartEqual.dummy <== dummy;
|
||||
|
||||
smartEqual.out === 1;
|
||||
}
|
||||
@@ -300,17 +286,14 @@ template BigMod(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
template BigMultModP(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
signal input in[3][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
component bigMult = BigMultOptimised(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigMult.in[0] <== in[0];
|
||||
bigMult.in[1] <== in[1];
|
||||
bigMult.dummy <== dummy;
|
||||
|
||||
component bigMod = BigMod(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigMod.base <== bigMult.out;
|
||||
bigMod.modulus <== in[2];
|
||||
bigMod.dummy <== dummy;
|
||||
|
||||
out <== bigMod.mod;
|
||||
}
|
||||
@@ -321,17 +304,14 @@ template BigMultModP(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
template BigMultModPNonOptimised(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
signal input in[3][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
component bigMult = BigMult(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigMult.in[0] <== in[0];
|
||||
bigMult.in[1] <== in[1];
|
||||
bigMult.dummy <== dummy;
|
||||
|
||||
component bigMod = BigMod(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigMod.base <== bigMult.out;
|
||||
bigMod.modulus <== in[2];
|
||||
bigMod.dummy <== dummy;
|
||||
|
||||
out <== bigMod.mod;
|
||||
}
|
||||
@@ -345,10 +325,9 @@ template BigSubNoBorrow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
out[i] <== in[0][i] - in[1][i] + dummy * dummy;
|
||||
out[i] <== in[0][i] - in[1][i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,10 +337,8 @@ template BigSubNoBorrow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
template BigSub(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
component bigSubNoBorrow = BigSubNoBorrow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
bigSubNoBorrow.in <== in;
|
||||
bigSubNoBorrow.dummy <== dummy;
|
||||
|
||||
component lessThan[CHUNK_NUMBER];
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
@@ -369,11 +346,11 @@ template BigSub(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
lessThan[i].in[1] <== 2 ** CHUNK_SIZE;
|
||||
|
||||
if (i == 0){
|
||||
lessThan[i].in[0] <== bigSubNoBorrow.out[i] + 2 ** CHUNK_SIZE + dummy * dummy;
|
||||
out[i] <== bigSubNoBorrow.out[i] + (2 ** CHUNK_SIZE) * (lessThan[i].out) + dummy * dummy;
|
||||
lessThan[i].in[0] <== bigSubNoBorrow.out[i] + 2 ** CHUNK_SIZE;
|
||||
out[i] <== bigSubNoBorrow.out[i] + (2 ** CHUNK_SIZE) * (lessThan[i].out);
|
||||
} else {
|
||||
lessThan[i].in[0] <== bigSubNoBorrow.out[i] - lessThan[i - 1].out + 2 ** CHUNK_SIZE + dummy * dummy;
|
||||
out[i] <== bigSubNoBorrow.out[i] + (2 ** CHUNK_SIZE) * (lessThan[i].out) - lessThan[i - 1].out + dummy * dummy;
|
||||
lessThan[i].in[0] <== bigSubNoBorrow.out[i] - lessThan[i - 1].out + 2 ** CHUNK_SIZE;
|
||||
out[i] <== bigSubNoBorrow.out[i] + (2 ** CHUNK_SIZE) * (lessThan[i].out) - lessThan[i - 1].out;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -387,8 +364,6 @@ template PowerMod(CHUNK_SIZE, CHUNK_NUMBER, EXP) {
|
||||
signal input base[CHUNK_NUMBER];
|
||||
signal input modulus[CHUNK_NUMBER];
|
||||
|
||||
signal input dummy;
|
||||
|
||||
signal output out[CHUNK_NUMBER];
|
||||
|
||||
var exp_process[256] = exp_to_bits(EXP);
|
||||
@@ -398,13 +373,11 @@ template PowerMod(CHUNK_SIZE, CHUNK_NUMBER, EXP) {
|
||||
|
||||
for (var i = 0; i < exp_process[0]; i++){
|
||||
muls[i] = BigMultModP(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
muls[i].dummy <== dummy;
|
||||
muls[i].in[2] <== modulus;
|
||||
}
|
||||
|
||||
for (var i = 0; i < exp_process[1] - 1; i++){
|
||||
resultMuls[i] = BigMultModP(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
resultMuls[i].dummy <== dummy;
|
||||
resultMuls[i].in[2] <== modulus;
|
||||
}
|
||||
|
||||
@@ -448,8 +421,6 @@ template BigModInvOptimised(CHUNK_SIZE, CHUNK_NUMBER) {
|
||||
signal input modulus[CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
var inv[200] = mod_inv(CHUNK_SIZE, CHUNK_NUMBER, in, modulus);
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++) {
|
||||
@@ -460,7 +431,6 @@ template BigModInvOptimised(CHUNK_SIZE, CHUNK_NUMBER) {
|
||||
mult.in[0] <== in;
|
||||
mult.in[1] <== out;
|
||||
mult.in[2] <== modulus;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
mult.out[0] === 1;
|
||||
for (var i = 1; i < CHUNK_NUMBER; i++) {
|
||||
@@ -477,7 +447,6 @@ template BigAddNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS){
|
||||
|
||||
signal input in1[CHUNK_NUMBER_GREATER];
|
||||
signal input in2[CHUNK_NUMBER_LESS];
|
||||
signal input dummy;
|
||||
|
||||
signal output out[CHUNK_NUMBER_GREATER + 1];
|
||||
|
||||
@@ -490,7 +459,6 @@ template BigAddNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS){
|
||||
bigAdd.in[0][i] <== in1[i];
|
||||
bigAdd.in[1][i] <== 0;
|
||||
}
|
||||
bigAdd.dummy <== dummy;
|
||||
|
||||
out <== bigAdd.out;
|
||||
}
|
||||
@@ -505,7 +473,6 @@ template BigMultNoCarryNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_L
|
||||
|
||||
signal input in1[CHUNK_NUMBER_GREATER];
|
||||
signal input in2[CHUNK_NUMBER_LESS];
|
||||
signal input dummy;
|
||||
signal output out[CHUNK_NUMBER_GREATER + CHUNK_NUMBER_LESS - 1];
|
||||
|
||||
|
||||
@@ -540,7 +507,7 @@ template BigMultNoCarryNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_L
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[i - j][j];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][i];
|
||||
@@ -551,7 +518,7 @@ template BigMultNoCarryNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_L
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[i - j][j];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][CHUNK_NUMBER_LESS - 1];
|
||||
@@ -577,7 +544,6 @@ template BigMultNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS){
|
||||
|
||||
signal input in1[CHUNK_NUMBER_GREATER];
|
||||
signal input in2[CHUNK_NUMBER_LESS];
|
||||
signal input dummy;
|
||||
signal output out[CHUNK_NUMBER_GREATER + CHUNK_NUMBER_LESS];
|
||||
var isPowerOfTwo = 0;
|
||||
for (var i = 0; i < CHUNK_NUMBER_GREATER; i++){
|
||||
@@ -586,12 +552,10 @@ template BigMultNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS){
|
||||
}
|
||||
}
|
||||
if (isPowerOfTwo == 0){
|
||||
dummy * dummy === 0;
|
||||
|
||||
component bigMultNoCarry = BigMultNoCarryNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS);
|
||||
bigMultNoCarry.in1 <== in1;
|
||||
bigMultNoCarry.in2 <== in2;
|
||||
bigMultNoCarry.dummy <== dummy;
|
||||
|
||||
component num2bits[CHUNK_NUMBER_GREATER + CHUNK_NUMBER_LESS - 1];
|
||||
component bits2numOverflow[CHUNK_NUMBER_GREATER + CHUNK_NUMBER_LESS - 1];
|
||||
@@ -615,7 +579,7 @@ template BigMultNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS){
|
||||
if (i == 0){
|
||||
num2bits[i].in <== bigMultNoCarry.out[i];
|
||||
} else {
|
||||
num2bits[i].in <== bigMultNoCarry.out[i] + bits2numOverflow[i - 1].out + dummy * dummy;
|
||||
num2bits[i].in <== bigMultNoCarry.out[i] + bits2numOverflow[i - 1].out;
|
||||
}
|
||||
|
||||
bits2numOverflow[i] = Bits2Num(CHUNK_SIZE + ADDITIONAL_LEN);
|
||||
@@ -645,7 +609,6 @@ template BigMultNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS){
|
||||
bigMult.in[0][i] <== in1[i];
|
||||
bigMult.in[1][i] <== 0;
|
||||
}
|
||||
bigMult.dummy <== dummy;
|
||||
for (var i = 0; i < CHUNK_NUMBER_LESS + CHUNK_NUMBER_GREATER; i++){
|
||||
out[i] <== bigMult.out[i];
|
||||
}
|
||||
@@ -678,7 +641,6 @@ template BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_MODULUS){
|
||||
|
||||
signal input base[CHUNK_NUMBER_BASE];
|
||||
signal input modulus[CHUNK_NUMBER_MODULUS];
|
||||
signal input dummy;
|
||||
|
||||
var long_division[2][200] = long_div(CHUNK_SIZE, CHUNK_NUMBER_MODULUS, CHUNK_NUMBER_DIV - 1, base, modulus);
|
||||
|
||||
@@ -699,13 +661,11 @@ template BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_MODULUS){
|
||||
|
||||
multChecks.in1 <== div;
|
||||
multChecks.in2 <== modulus;
|
||||
multChecks.dummy <== dummy;
|
||||
} else {
|
||||
multChecks = BigMultNonEqual(CHUNK_SIZE, CHUNK_NUMBER_MODULUS, CHUNK_NUMBER_DIV);
|
||||
|
||||
multChecks.in2 <== div;
|
||||
multChecks.in1 <== modulus;
|
||||
multChecks.dummy <== dummy;
|
||||
}
|
||||
|
||||
component greaterThan = BigGreaterThan(CHUNK_SIZE, CHUNK_NUMBER_MODULUS);
|
||||
@@ -720,7 +680,6 @@ template BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_MODULUS){
|
||||
|
||||
bigAddCheck.in1 <== multChecks.out;
|
||||
bigAddCheck.in2 <== mod;
|
||||
bigAddCheck.dummy <== dummy;
|
||||
|
||||
component smartEqual = SmartEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE + 2);
|
||||
smartEqual.in[0] <== bigAddCheck.out;
|
||||
@@ -729,7 +688,6 @@ template BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_MODULUS){
|
||||
}
|
||||
smartEqual.in[1][CHUNK_NUMBER_BASE] <== 0;
|
||||
smartEqual.in[1][CHUNK_NUMBER_BASE + 1] <== 0;
|
||||
smartEqual.dummy <== dummy;
|
||||
|
||||
smartEqual.out === 1;
|
||||
}
|
||||
@@ -741,20 +699,16 @@ template BigMultModPNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS
|
||||
signal input in1[CHUNK_NUMBER_GREATER];
|
||||
signal input in2[CHUNK_NUMBER_LESS];
|
||||
signal input modulus[CHUNK_NUMBER_MODULUS];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[CHUNK_NUMBER_MODULUS];
|
||||
|
||||
component bigMult = BigMultNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_LESS);
|
||||
bigMult.in1 <== in1;
|
||||
bigMult.in2 <== in2;
|
||||
bigMult.dummy <== dummy;
|
||||
|
||||
component bigMod = BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_GREATER + CHUNK_NUMBER_LESS, CHUNK_NUMBER_MODULUS);
|
||||
bigMod.base <== bigMult.out;
|
||||
bigMod.modulus <== modulus;
|
||||
bigMod.dummy <== dummy;
|
||||
|
||||
out <== bigMod.mod;
|
||||
}
|
||||
@@ -802,7 +756,6 @@ template PowerModNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, EXP) {
|
||||
|
||||
signal input base[CHUNK_NUMBER];
|
||||
signal input modulus[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
signal output out[CHUNK_NUMBER];
|
||||
|
||||
@@ -813,13 +766,11 @@ template PowerModNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, EXP) {
|
||||
|
||||
for (var i = 0; i < exp_process[0]; i++){
|
||||
muls[i] = BigMultModPNonOptimised(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
muls[i].dummy <== dummy;
|
||||
muls[i].in[2] <== modulus;
|
||||
}
|
||||
|
||||
for (var i = 0; i < exp_process[1] - 1; i++){
|
||||
resultMuls[i] = BigMultModPNonOptimised(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
resultMuls[i].dummy <== dummy;
|
||||
resultMuls[i].in[2] <== modulus;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,12 +27,10 @@ template BigAddOverflow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
out[i] <== in[0][i] + in[1][i] + dummy * dummy;
|
||||
out[i] <== in[0][i] + in[1][i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,13 +40,12 @@ template BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_L
|
||||
signal input in1[CHUNK_NUMBER_GREATER];
|
||||
signal input in2[CHUNK_NUMBER_LESS];
|
||||
signal output out[CHUNK_NUMBER_GREATER];
|
||||
signal input dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER_LESS; i++){
|
||||
out[i] <== in1[i] + in2[i] + dummy * dummy;
|
||||
out[i] <== in1[i] + in2[i];
|
||||
}
|
||||
for (var i = CHUNK_NUMBER_LESS; i < CHUNK_NUMBER_GREATER; i++){
|
||||
out[i] <== in1[i] + dummy * dummy;
|
||||
out[i] <== in1[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +57,6 @@ template BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
assert(CHUNK_SIZE <= 126);
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
signal output out[CHUNK_NUMBER * 2 - 1];
|
||||
|
||||
signal tmpMults[CHUNK_NUMBER][CHUNK_NUMBER];
|
||||
@@ -90,7 +86,7 @@ template BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[i - j][j];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][i];
|
||||
@@ -100,7 +96,7 @@ template BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[CHUNK_NUMBER - 1 - j][i + j - CHUNK_NUMBER + 1];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[CHUNK_NUMBER - 1 - j][i + j - CHUNK_NUMBER + 1] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[CHUNK_NUMBER - 1 - j][i + j - CHUNK_NUMBER + 1] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][2 * CHUNK_NUMBER - 2 - i];
|
||||
@@ -117,12 +113,10 @@ template BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
assert(CHUNK_SIZE <= 126);
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
signal output out[CHUNK_NUMBER * 2 - 1];
|
||||
|
||||
component karatsuba = KaratsubaNoCarry(CHUNK_NUMBER);
|
||||
karatsuba.in <== in;
|
||||
karatsuba.dummy <== dummy;
|
||||
for (var i = 0; i < CHUNK_NUMBER * 2 - 1; i++){
|
||||
out[i] <== karatsuba.out[i];
|
||||
}
|
||||
@@ -137,7 +131,6 @@ template BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_
|
||||
|
||||
signal input in1[CHUNK_NUMBER_GREATER];
|
||||
signal input in2[CHUNK_NUMBER_LESS];
|
||||
signal input dummy;
|
||||
signal output out[CHUNK_NUMBER_GREATER + CHUNK_NUMBER_LESS - 1];
|
||||
|
||||
|
||||
@@ -172,7 +165,7 @@ template BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[i - j][j];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][i];
|
||||
@@ -183,7 +176,7 @@ template BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER_GREATER, CHUNK_NUMBER_
|
||||
if (j == 0){
|
||||
tmpResult[i][j] <== tmpMults[i - j][j];
|
||||
} else {
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1] + dummy * dummy;
|
||||
tmpResult[i][j] <== tmpMults[i - j][j] + tmpResult[i][j - 1];
|
||||
}
|
||||
}
|
||||
out[i] <== tmpResult[i][CHUNK_NUMBER_LESS - 1];
|
||||
@@ -209,19 +202,16 @@ template BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_MODULUS, OVE
|
||||
|
||||
signal input base[CHUNK_NUMBER_BASE];
|
||||
signal input modulus[CHUNK_NUMBER_MODULUS];
|
||||
signal input dummy;
|
||||
|
||||
signal output mod[CHUNK_NUMBER_MODULUS];
|
||||
signal output div[CHUNK_NUMBER_BASE + OVERFLOW_SHIFT - CHUNK_NUMBER_MODULUS + 1];
|
||||
|
||||
component reduce = RemoveOverflow(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_BASE + OVERFLOW_SHIFT);
|
||||
reduce.in <== base;
|
||||
reduce.dummy <== dummy;
|
||||
|
||||
component bigMod = BigModNonEqual(CHUNK_SIZE, CHUNK_NUMBER_BASE + OVERFLOW_SHIFT, CHUNK_NUMBER_MODULUS);
|
||||
bigMod.base <== reduce.out;
|
||||
bigMod.modulus <== modulus;
|
||||
bigMod.dummy <== dummy;
|
||||
|
||||
bigMod.mod ==> mod;
|
||||
bigMod.div ==> div;
|
||||
@@ -235,12 +225,9 @@ template BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER) {
|
||||
signal input modulus[CHUNK_NUMBER];
|
||||
signal output out[CHUNK_NUMBER];
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
component reduce = RemoveOverflow(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER_BASE + 1);
|
||||
reduce.in <== in;
|
||||
reduce.dummy <== dummy;
|
||||
|
||||
var div_res[2][200] = long_div(CHUNK_SIZE, CHUNK_NUMBER, (CHUNK_NUMBER_BASE + 1 - CHUNK_NUMBER), reduce.out, modulus);
|
||||
var mod[CHUNK_NUMBER];
|
||||
@@ -257,7 +244,6 @@ template BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER_BASE, CHUNK_NUMBER) {
|
||||
mult.in1 <== reduce.out;
|
||||
mult.in2 <== out;
|
||||
mult.modulus <== modulus;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
mult.out[0] === 1;
|
||||
for (var i = 1; i < CHUNK_NUMBER; i++) {
|
||||
@@ -283,8 +269,6 @@ template RemoveOverflow(CHUNK_SIZE, CHUNK_NUMBER_OLD, CHUNK_NUMBER_NEW){
|
||||
assert(CHUNK_SIZE <= 126);
|
||||
assert(CHUNK_NUMBER_OLD <= CHUNK_NUMBER_NEW);
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal input in[CHUNK_NUMBER_OLD];
|
||||
signal output out[CHUNK_NUMBER_NEW];
|
||||
|
||||
@@ -300,7 +284,7 @@ template RemoveOverflow(CHUNK_SIZE, CHUNK_NUMBER_OLD, CHUNK_NUMBER_NEW){
|
||||
out[i] <== bits2Num[i].out;
|
||||
} else {
|
||||
getLastNBits[i] = GetLastNBits(CHUNK_SIZE);
|
||||
getLastNBits[i].in <== in[i] + getLastNBits[i - 1].div + dummy * dummy;
|
||||
getLastNBits[i].in <== in[i] + getLastNBits[i - 1].div;
|
||||
bits2Num[i] = Bits2Num(CHUNK_SIZE);
|
||||
bits2Num[i].in <== getLastNBits[i].out;
|
||||
out[i] <== bits2Num[i].out;
|
||||
@@ -324,13 +308,13 @@ template RemoveOverflow(CHUNK_SIZE, CHUNK_NUMBER_OLD, CHUNK_NUMBER_NEW){
|
||||
out[i] <== bits2Num[i].out;
|
||||
} else {
|
||||
getLastNBits[i] = GetLastNBits(CHUNK_SIZE);
|
||||
getLastNBits[i].in <== in[i] + getLastNBits[i - 1].div + dummy * dummy;
|
||||
getLastNBits[i].in <== in[i] + getLastNBits[i - 1].div;
|
||||
bits2Num[i] = Bits2Num(CHUNK_SIZE);
|
||||
bits2Num[i].in <== getLastNBits[i].out;
|
||||
out[i] <== bits2Num[i].out;
|
||||
}
|
||||
}
|
||||
out[CHUNK_NUMBER_NEW - 1] <== getLastNBits[CHUNK_NUMBER_NEW - 2].div + in[CHUNK_NUMBER_NEW - 1] + dummy * dummy;
|
||||
out[CHUNK_NUMBER_NEW - 1] <== getLastNBits[CHUNK_NUMBER_NEW - 2].div + in[CHUNK_NUMBER_NEW - 1];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,20 +324,18 @@ template BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
signal input in1[CHUNK_NUMBER];
|
||||
signal input in2[CHUNK_NUMBER];
|
||||
signal input modulus[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[CHUNK_NUMBER];
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
if (i == 0){
|
||||
out[i] <== 2 ** CHUNK_SIZE + modulus[i] + in1[i] - in2[i] + dummy * dummy;
|
||||
out[i] <== 2 ** CHUNK_SIZE + modulus[i] + in1[i] - in2[i];
|
||||
} else {
|
||||
if (i == CHUNK_NUMBER - 1){
|
||||
out[i] <== modulus[i] + in1[i] - in2[i] - 1 + dummy * dummy;
|
||||
out[i] <== modulus[i] + in1[i] - in2[i] - 1;
|
||||
} else {
|
||||
out[i] <== 2 ** CHUNK_SIZE + modulus[i] + in1[i] - in2[i] - 1 + dummy * dummy;
|
||||
out[i] <== 2 ** CHUNK_SIZE + modulus[i] + in1[i] - in2[i] - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -391,13 +373,10 @@ template ForceEqual(CHUNK_NUMBER){
|
||||
template ReducedEqual(CHUNK_SIZE, CHUNK_NUMBER_OLD, CHUNK_NUMBER_NEW){
|
||||
signal input in1[CHUNK_NUMBER_NEW];
|
||||
signal input in2[CHUNK_NUMBER_OLD];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out;
|
||||
|
||||
component reduce = RemoveOverflow(CHUNK_SIZE, CHUNK_NUMBER_OLD, CHUNK_NUMBER_NEW);
|
||||
reduce.in <== in2;
|
||||
reduce.dummy <== dummy;
|
||||
|
||||
component forceEqual = ForceEqual(CHUNK_NUMBER_NEW);
|
||||
forceEqual.in[0] <== in1;
|
||||
@@ -415,13 +394,9 @@ template ReducedEqual(CHUNK_SIZE, CHUNK_NUMBER_OLD, CHUNK_NUMBER_NEW){
|
||||
template SmartEqual(CHUNK_SIZE, CHUNK_NUMBER){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out;
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
component isEqual = IsEqual();
|
||||
component sumLeft = GetSumOfNElements(CHUNK_NUMBER);
|
||||
sumLeft.dummy <== dummy;
|
||||
component sumRight = GetSumOfNElements(CHUNK_NUMBER);
|
||||
sumRight.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
sumLeft.in[i] <== 2 ** (i * CHUNK_SIZE) * in[0][i];
|
||||
|
||||
@@ -7,7 +7,6 @@ pragma circom 2.1.6;
|
||||
template KaratsubaNoCarry(CHUNK_NUMBER) {
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[2 * CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
if (CHUNK_NUMBER == 1) {
|
||||
out[0] <== in[0][0] * in[1][0];
|
||||
@@ -15,9 +14,6 @@ template KaratsubaNoCarry(CHUNK_NUMBER) {
|
||||
component karatsubaA1B1 = KaratsubaNoCarry(CHUNK_NUMBER / 2);
|
||||
component karatsubaA2B2 = KaratsubaNoCarry(CHUNK_NUMBER / 2);
|
||||
component karatsubaA1A2B1B2 = KaratsubaNoCarry(CHUNK_NUMBER / 2);
|
||||
karatsubaA2B2.dummy <== dummy;
|
||||
karatsubaA1B1.dummy <== dummy;
|
||||
karatsubaA1A2B1B2.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER / 2; i++) {
|
||||
karatsubaA1B1.in[0][i] <== in[0][i];
|
||||
@@ -34,18 +30,18 @@ template KaratsubaNoCarry(CHUNK_NUMBER) {
|
||||
out[i] <== karatsubaA1B1.out[i]
|
||||
+ karatsubaA1A2B1B2.out[i - CHUNK_NUMBER / 2]
|
||||
- karatsubaA1B1.out[i - CHUNK_NUMBER / 2]
|
||||
- karatsubaA2B2.out[i - CHUNK_NUMBER / 2] + dummy * dummy;
|
||||
- karatsubaA2B2.out[i - CHUNK_NUMBER / 2];
|
||||
} else {
|
||||
out[i] <== karatsubaA1B1.out[i] + dummy * dummy;
|
||||
out[i] <== karatsubaA1B1.out[i];
|
||||
}
|
||||
} else {
|
||||
if (CHUNK_NUMBER / 2 <= i && i < 3 * (CHUNK_NUMBER / 2)) {
|
||||
out[i] <== karatsubaA2B2.out[i - CHUNK_NUMBER]
|
||||
+ karatsubaA1A2B1B2.out[i - CHUNK_NUMBER / 2]
|
||||
- karatsubaA1B1.out[i - CHUNK_NUMBER / 2]
|
||||
- karatsubaA2B2.out[i - CHUNK_NUMBER / 2] + dummy * dummy;
|
||||
- karatsubaA2B2.out[i - CHUNK_NUMBER / 2];
|
||||
} else {
|
||||
out[i] <== karatsubaA2B2.out[i - CHUNK_NUMBER] + dummy * dummy;
|
||||
out[i] <== karatsubaA2B2.out[i - CHUNK_NUMBER];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,13 +10,10 @@ template BinSum(NUM, LEN){
|
||||
assert (LEN + NUM - 1 <= 253);
|
||||
var OUT_LEN = LEN + NUM - 1;
|
||||
signal input in[NUM][LEN];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[OUT_LEN];
|
||||
|
||||
component bits2Num[NUM];
|
||||
component sumN = GetSumOfNElements(NUM);
|
||||
sumN.dummy <== dummy;
|
||||
for (var i = 0; i < NUM; i++) {
|
||||
bits2Num[i] = Bits2Num(LEN);
|
||||
bits2Num[i].in <== in[i];
|
||||
|
||||
@@ -51,15 +51,12 @@ template TangentCheck(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
|
||||
signal input in1[2][CHUNK_NUMBER];
|
||||
signal input in2[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
component mult = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== in1[0];
|
||||
mult.in[1] <== in1[0];
|
||||
mult.dummy <== dummy;
|
||||
|
||||
component scalarMult = ScalarMultOverflow(CHUNK_NUMBER * 2 - 1);
|
||||
scalarMult.scalar <== 3;
|
||||
@@ -68,7 +65,6 @@ template TangentCheck(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component add = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add.in1 <== scalarMult.out;
|
||||
add.in2 <== A;
|
||||
add.dummy <== dummy;
|
||||
|
||||
component scalarMult2 = ScalarMultOverflow(CHUNK_NUMBER);
|
||||
scalarMult2.in <== in1[1];
|
||||
@@ -77,54 +73,44 @@ template TangentCheck(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component modInv = BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
modInv.in <== scalarMult2.out;
|
||||
modInv.modulus <== P;
|
||||
modInv.dummy <== dummy;
|
||||
|
||||
component mul2 = BigMultNonEqualOverflow(CHUNK_SIZE, 2 * CHUNK_NUMBER - 1, CHUNK_NUMBER);
|
||||
mul2.in1 <== add.out;
|
||||
mul2.in2 <== modInv.out;
|
||||
mul2.dummy <== dummy;
|
||||
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod.base <== mul2.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
component sub = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub.in1 <== in1[0];
|
||||
sub.in2 <== in2[0];
|
||||
sub.modulus <== P;
|
||||
sub.dummy <== dummy;
|
||||
|
||||
component mul3 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
mul3.in1 <== mod.mod;
|
||||
mul3.in2 <== sub.out;
|
||||
mul3.dummy <== dummy;
|
||||
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod2.base <== mul3.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
component sub2 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub2.in1 <== mod2.mod;
|
||||
sub2.in2 <== in1[1];
|
||||
sub2.modulus <== P;
|
||||
sub2.dummy <== dummy;
|
||||
|
||||
component add2 = BigAddOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
add2.in[0] <== P;
|
||||
add2.in[1] <== in2[1];
|
||||
add2.dummy <== dummy;
|
||||
|
||||
component smartEqual = SmartEqual(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
smartEqual.in[0] <== sub2.out;
|
||||
smartEqual.in[1] <== add2.out;
|
||||
smartEqual.dummy <== dummy;
|
||||
|
||||
component smartEqual2 = SmartEqual(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
smartEqual2.in[0] <== sub2.out;
|
||||
smartEqual2.in[1] <== in2[1];
|
||||
smartEqual2.dummy <== dummy;
|
||||
|
||||
smartEqual.out * smartEqual.out + smartEqual2.out === 1;
|
||||
}
|
||||
@@ -139,66 +125,54 @@ template AdditionCheck(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in1[2][CHUNK_NUMBER];
|
||||
signal input in2[2][CHUNK_NUMBER];
|
||||
signal input in3[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
component sub = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub.in1 <== in2[0];
|
||||
sub.in2 <== in1[0];
|
||||
sub.modulus <== P;
|
||||
sub.dummy <== dummy;
|
||||
|
||||
component sub2 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub2.in1 <== in2[1];
|
||||
sub2.in2 <== in1[1];
|
||||
sub2.modulus <== P;
|
||||
sub2.dummy <== dummy;
|
||||
|
||||
component sub3 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub3.in1 <== in1[0];
|
||||
sub3.in2 <== in3[0];
|
||||
sub3.modulus <== P;
|
||||
sub3.dummy <== dummy;
|
||||
|
||||
component modInv = BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
modInv.in <== sub.out;
|
||||
modInv.modulus <== P;
|
||||
modInv.dummy <== dummy;
|
||||
|
||||
component mul = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mul.in[0] <== sub2.out;
|
||||
mul.in[1] <== modInv.out;
|
||||
mul.dummy <== dummy;
|
||||
|
||||
component mul2 = BigMultNonEqualOverflow(CHUNK_SIZE, 2 * CHUNK_NUMBER - 1, CHUNK_NUMBER);
|
||||
mul2.in1 <== mul.out;
|
||||
mul2.in2 <== sub3.out;
|
||||
mul2.dummy <== dummy;
|
||||
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 2);
|
||||
mod.base <== mul2.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
component sub4 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub4.in1 <== mod.mod;
|
||||
sub4.in2 <== in1[1];
|
||||
sub4.modulus <== P;
|
||||
sub4.dummy <== dummy;
|
||||
|
||||
component add = BigAddOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
add.in[0] <== P;
|
||||
add.in[1] <== in3[1];
|
||||
add.dummy <== dummy;
|
||||
|
||||
component smartEqual = SmartEqual(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
smartEqual.in[0] <== sub4.out;
|
||||
smartEqual.in[1] <== add.out;
|
||||
smartEqual.dummy <== dummy;
|
||||
|
||||
component smartEqual2 = SmartEqual(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
smartEqual2.in[0] <== sub4.out;
|
||||
smartEqual2.in[1] <== in3[1];
|
||||
smartEqual2.dummy <== dummy;
|
||||
|
||||
smartEqual.out * smartEqual.out + smartEqual2.out === 1;
|
||||
|
||||
@@ -210,12 +184,10 @@ template AdditionCheck(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
// Computes 0 * G, 1 * G, 2 * G, ... (2 ** WINDOW_SIZE - 1) * G
|
||||
template EllipticCurvePrecomputePipinger(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WINDOW_SIZE){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
var PRECOMPUTE_NUMBER = 2 ** WINDOW_SIZE;
|
||||
|
||||
signal output out[PRECOMPUTE_NUMBER][2][CHUNK_NUMBER];
|
||||
dummy * dummy === 0;
|
||||
|
||||
for (var i = 0; i < 2; i++){
|
||||
for (var j = 0; j < CHUNK_NUMBER; j++){
|
||||
@@ -232,7 +204,6 @@ template EllipticCurvePrecomputePipinger(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WIND
|
||||
if (i % 2 == 0){
|
||||
doublers[i \ 2 - 1] = EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
doublers[i \ 2 - 1].in <== out[i \ 2];
|
||||
doublers[i \ 2 - 1].dummy <== dummy;
|
||||
doublers[i \ 2 - 1].out ==> out[i];
|
||||
|
||||
}
|
||||
@@ -240,7 +211,6 @@ template EllipticCurvePrecomputePipinger(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WIND
|
||||
adders[i \ 2 - 1] = EllipticCurveAddOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
adders[i \ 2 - 1].in1 <== out[1];
|
||||
adders[i \ 2 - 1].in2 <== out[i - 1];
|
||||
adders[i \ 2 - 1].dummy <== dummy;
|
||||
adders[i \ 2 - 1].out ==> out[i];
|
||||
}
|
||||
}
|
||||
@@ -257,48 +227,38 @@ template PointOnCurveOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
assert(CHUNK_SIZE == 64);
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
component mult = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== in[0];
|
||||
mult.in[1] <== in[0];
|
||||
mult.dummy <== dummy;
|
||||
|
||||
component mult2 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
mult2.in1 <== mult.out;
|
||||
mult2.in2 <== in[0];
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
component mult3 = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult3.in[0] <== in[0];
|
||||
mult3.in[1] <== A;
|
||||
mult3.dummy <== dummy;
|
||||
|
||||
component mult4 = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult4.in[0] <== in[1];
|
||||
mult4.in[1] <== in[1];
|
||||
mult4.dummy <== dummy;
|
||||
|
||||
component add = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER * 2 - 1);
|
||||
add.in1 <== mult2.out;
|
||||
add.in2 <== mult3.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
component add2 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER);
|
||||
add2.in1 <== add.out;
|
||||
add2.in2 <== B;
|
||||
add2.dummy <== dummy;
|
||||
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod.base <== mult4.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod2.base <== add2.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
mod.mod[i] === mod2.mod[i];
|
||||
@@ -313,14 +273,11 @@ template PointOnCurveOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
template EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
// x * x
|
||||
component mult = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== in[0];
|
||||
mult.in[1] <== in[0];
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// 3 * x * x
|
||||
component scalarMult = ScalarMultOverflow(CHUNK_NUMBER * 2 - 1);
|
||||
@@ -331,7 +288,6 @@ template EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component add = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add.in1 <== scalarMult.out;
|
||||
add.in2 <== A;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// 2 * y
|
||||
component scalarMult2 = ScalarMultOverflow(CHUNK_NUMBER);
|
||||
@@ -342,32 +298,27 @@ template EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component modInv = BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
modInv.in <== scalarMult2.out;
|
||||
modInv.modulus <== P;
|
||||
modInv.dummy <== dummy;
|
||||
|
||||
// (3 * x * x + a) * 1 / (2 * y)
|
||||
component mult2 = BigMultNonEqualOverflow(CHUNK_SIZE, 2 * CHUNK_NUMBER - 1, CHUNK_NUMBER);
|
||||
mult2.in1 <== add.out;
|
||||
mult2.in2 <== modInv.out;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// ((3 * x * x + a) * 1 / (2 * y)) % p ==> λ
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod.base <== mult2.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
// λ * λ
|
||||
component mult3 = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult3.in[0] <== mod.mod;
|
||||
mult3.in[1] <== mod.mod;
|
||||
mult3.dummy <== dummy;
|
||||
|
||||
// P - x
|
||||
component sub = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub.in1 <== P;
|
||||
sub.in2 <== in[0];
|
||||
sub.modulus <== P;
|
||||
sub.dummy <== dummy;
|
||||
|
||||
// 2 * P - 2 * x
|
||||
component scalarMult3 = ScalarMultOverflow(CHUNK_NUMBER);
|
||||
@@ -378,13 +329,11 @@ template EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component add2 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add2.in1 <== mult3.out;
|
||||
add2.in2 <== scalarMult3.out;
|
||||
add2.dummy <== dummy;
|
||||
|
||||
// (λ * λ + 2 * P - 2 * x) % p ==> x3
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod2.base <== add2.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
out[0] <== mod2.mod;
|
||||
|
||||
@@ -393,32 +342,27 @@ template EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
sub2.in1 <== in[0];
|
||||
sub2.in2 <== out[0];
|
||||
sub2.modulus <== P;
|
||||
sub2.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3)
|
||||
component mult4 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
mult4.in1 <== mod.mod;
|
||||
mult4.in2 <== sub2.out;
|
||||
mult4.dummy <== dummy;
|
||||
|
||||
// P - y
|
||||
component sub3 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub3.in1 <== P;
|
||||
sub3.in2 <== in[1];
|
||||
sub3.modulus <== P;
|
||||
sub3.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3) + P - y
|
||||
component add3 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add3.in1 <== mult4.out;
|
||||
add3.in2 <== sub3.out;
|
||||
add3.dummy <== dummy;
|
||||
|
||||
// (λ * (x1 - x3) + P - y) % P ==> y3
|
||||
component mod3 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod3.base <== add3.out;
|
||||
mod3.modulus <== P;
|
||||
mod3.dummy <== dummy;
|
||||
|
||||
out[1] <== mod3.mod;
|
||||
}
|
||||
@@ -432,78 +376,65 @@ template EllipticCurveAddOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in1[2][CHUNK_NUMBER];
|
||||
signal input in2[2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
// x2 - x1
|
||||
component sub = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub.in1 <== in2[0];
|
||||
sub.in2 <== in1[0];
|
||||
sub.modulus <== P;
|
||||
sub.dummy <== dummy;
|
||||
|
||||
// y2 - y1
|
||||
component sub2 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub2.in1 <== in2[1];
|
||||
sub2.in2 <== in1[1];
|
||||
sub2.modulus <== P;
|
||||
sub2.dummy <== dummy;
|
||||
|
||||
// (x2 - x1) ** -1
|
||||
component modInv = BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
modInv.in <== sub.out;
|
||||
modInv.modulus <== P;
|
||||
modInv.dummy <== dummy;
|
||||
|
||||
// (y2 - y1) * 1 / (x2 - x1)
|
||||
component mult = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== sub2.out;
|
||||
mult.in[1] <== modInv.out;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// (y2 - y1) * 1 / (x2 - x1) % P ==> λ
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod.base <== mult.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
// λ * λ
|
||||
component mult2 = BigMultOptimisedOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult2.in[0] <== mod.mod;
|
||||
mult2.in[1] <== mod.mod;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// P - in1
|
||||
component sub3 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub3.in1 <== P;
|
||||
sub3.in2 <== in1[0];
|
||||
sub3.modulus <== P;
|
||||
sub3.dummy <== dummy;
|
||||
|
||||
// P - in2
|
||||
component sub4 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub4.in1 <== P;
|
||||
sub4.in2 <== in2[0];
|
||||
sub4.modulus <== P;
|
||||
sub4.dummy <== dummy;
|
||||
|
||||
// 2 * P - in1 - in2
|
||||
component add = BigAddOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
add.in[0] <== sub3.out;
|
||||
add.in[1] <== sub4.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// λ * λ + 2 * P - in1 - in2
|
||||
component add2 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add2.in1 <== mult2.out;
|
||||
add2.in2 <== add.out;
|
||||
add2.dummy <== dummy;
|
||||
|
||||
// (λ * λ + 2 * P - in1 - in2) % P ==> x3
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod2.base <== add2.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
out[0] <== mod2.mod;
|
||||
|
||||
@@ -512,32 +443,27 @@ template EllipticCurveAddOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
sub5.in1 <== in1[0];
|
||||
sub5.in2 <== out[0];
|
||||
sub5.modulus <== P;
|
||||
sub5.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3)
|
||||
component mult3 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
mult3.in1 <== mult.out;
|
||||
mult3.in2 <== sub5.out;
|
||||
mult3.dummy <== dummy;
|
||||
|
||||
// P - y1
|
||||
component sub6 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub6.in1 <== P;
|
||||
sub6.in2 <== in1[1];
|
||||
sub6.modulus <== P;
|
||||
sub6.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3) + P - y1
|
||||
component add3 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER);
|
||||
add3.in1 <== mult3.out;
|
||||
add3.in2 <== sub6.out;
|
||||
add3.dummy <== dummy;
|
||||
|
||||
// (λ * (x1 - x3) + P - y1) % P ==> y3
|
||||
component mod3 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod3.base <== add3.out;
|
||||
mod3.modulus <== P;
|
||||
mod3.dummy <== dummy;
|
||||
|
||||
out[1] <== mod3.mod;
|
||||
}
|
||||
@@ -553,7 +479,6 @@ template EllipicCurveScalarGeneratorMultiplicationOptimised(CHUNK_SIZE, CHUNK_NU
|
||||
assert(CHUNK_SIZE == 64 && CHUNK_NUMBER == 4);
|
||||
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
@@ -561,7 +486,6 @@ template EllipicCurveScalarGeneratorMultiplicationOptimised(CHUNK_SIZE, CHUNK_NU
|
||||
|
||||
var parts = CHUNK_NUMBER * CHUNK_SIZE \ STRIDE;
|
||||
|
||||
dummy * dummy === 0;
|
||||
var powers[parts][2 ** STRIDE][2][CHUNK_NUMBER];
|
||||
if (P[0] == 18446744069414583343 && P[1] == 18446744073709551615 && P[2] == 18446744073709551615 && P[3] == 18446744073709551615){
|
||||
powers = get_g_pow_stride8_table_secp256k1(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
@@ -611,7 +535,6 @@ template EllipicCurveScalarGeneratorMultiplicationOptimised(CHUNK_SIZE, CHUNK_NU
|
||||
for (var j = 0; j < 2; j++){
|
||||
for (var axis_idx = 0; axis_idx < CHUNK_NUMBER; axis_idx++){
|
||||
getSumOfNElements[i][j][axis_idx] = GetSumOfNElements(2 ** STRIDE);
|
||||
getSumOfNElements[i][j][axis_idx].dummy <== dummy;
|
||||
for (var stride_idx = 0; stride_idx < 2 ** STRIDE; stride_idx++){
|
||||
getSumOfNElements[i][j][axis_idx].in[stride_idx] <== resultCoordinateComputation[i][stride_idx][j][axis_idx];
|
||||
}
|
||||
@@ -622,7 +545,7 @@ template EllipicCurveScalarGeneratorMultiplicationOptimised(CHUNK_SIZE, CHUNK_NU
|
||||
component isZero[parts];
|
||||
for (var i = 0; i < parts; i++){
|
||||
isZero[i] = IsZero();
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out + dummy * dummy;
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out;
|
||||
}
|
||||
|
||||
signal precomptedDummy[parts][2][CHUNK_NUMBER];
|
||||
@@ -660,7 +583,6 @@ template EllipicCurveScalarGeneratorMultiplicationOptimised(CHUNK_SIZE, CHUNK_NU
|
||||
|
||||
for (var i = 0; i < parts - 1; i++){
|
||||
adders[i] = EllipticCurveAddOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
adders[i].dummy <== dummy;
|
||||
isDummyLeft[i] = IsEqual();
|
||||
isDummyRight[i] = IsEqual();
|
||||
|
||||
@@ -738,7 +660,6 @@ template EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WINDOW_SIZ
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
@@ -748,7 +669,6 @@ template EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WINDOW_SIZ
|
||||
|
||||
component precompute = EllipticCurvePrecomputePipinger(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WINDOW_SIZE);
|
||||
precompute.in <== in;
|
||||
precompute.dummy <== dummy;
|
||||
precompute.out ==> precomputed;
|
||||
|
||||
var DOUBLERS_NUMBER = CHUNK_SIZE * CHUNK_NUMBER - WINDOW_SIZE;
|
||||
@@ -805,7 +725,6 @@ template EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WINDOW_SIZ
|
||||
if (i != 0){
|
||||
for (var j = 0; j < WINDOW_SIZE; j++){
|
||||
doublers[i + j - WINDOW_SIZE] = EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
doublers[i + j - WINDOW_SIZE].dummy <== dummy;
|
||||
|
||||
if (j == 0){
|
||||
for (var axis_idx = 0; axis_idx < 2; axis_idx++){
|
||||
@@ -863,14 +782,12 @@ template EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, WINDOW_SIZ
|
||||
|
||||
adders[i \ WINDOW_SIZE].in1 <== res [i \ WINDOW_SIZE];
|
||||
adders[i \ WINDOW_SIZE].in2 <== tmp2[i \ WINDOW_SIZE];
|
||||
adders[i \ WINDOW_SIZE].dummy <== dummy;
|
||||
res[i \ WINDOW_SIZE + 1] <== tmp2[i \ WINDOW_SIZE];
|
||||
|
||||
} else {
|
||||
|
||||
adders[i \ WINDOW_SIZE].in1 <== doublers[i - 1].out;
|
||||
adders[i \ WINDOW_SIZE].in2 <== tmp2[i \ WINDOW_SIZE];
|
||||
adders[i \ WINDOW_SIZE].dummy <== dummy;
|
||||
|
||||
zeroEquals[i \ WINDOW_SIZE] = IsEqual();
|
||||
|
||||
@@ -920,12 +837,10 @@ template EllipicCurveScalarPrecomputeMultiplicationOptimised(CHUNK_SIZE, CHUNK_N
|
||||
var parts = CHUNK_NUMBER * CHUNK_SIZE \ STRIDE;
|
||||
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input powers[parts][2 ** STRIDE][2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// We don`t use point anywhere, we should add any quadratic constraint for secure issues
|
||||
@@ -974,7 +889,6 @@ template EllipicCurveScalarPrecomputeMultiplicationOptimised(CHUNK_SIZE, CHUNK_N
|
||||
for (var j = 0; j < 2; j++){
|
||||
for (var axis_idx = 0; axis_idx < CHUNK_NUMBER; axis_idx++){
|
||||
getSumOfNElements[i][j][axis_idx] = GetSumOfNElements(2 ** STRIDE);
|
||||
getSumOfNElements[i][j][axis_idx].dummy <== dummy;
|
||||
for (var stride_idx = 0; stride_idx < 2 ** STRIDE; stride_idx++){
|
||||
getSumOfNElements[i][j][axis_idx].in[stride_idx] <== resultCoordinateComputation[i][stride_idx][j][axis_idx];
|
||||
}
|
||||
@@ -985,7 +899,7 @@ template EllipicCurveScalarPrecomputeMultiplicationOptimised(CHUNK_SIZE, CHUNK_N
|
||||
component isZero[parts];
|
||||
for (var i = 0; i < parts; i++){
|
||||
isZero[i] = IsZero();
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out + dummy * dummy;
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out;
|
||||
}
|
||||
|
||||
signal precomptedDummy[parts][2][CHUNK_NUMBER];
|
||||
@@ -1023,7 +937,6 @@ template EllipicCurveScalarPrecomputeMultiplicationOptimised(CHUNK_SIZE, CHUNK_N
|
||||
|
||||
for (var i = 0; i < parts - 1; i++){
|
||||
adders[i] = EllipticCurveAddOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
adders[i].dummy <== dummy;
|
||||
isDummyLeft[i] = IsEqual();
|
||||
isDummyRight[i] = IsEqual();
|
||||
|
||||
@@ -1098,48 +1011,38 @@ template PointOnCurveNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
assert(CHUNK_SIZE == 64);
|
||||
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
component mult = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== in[0];
|
||||
mult.in[1] <== in[0];
|
||||
mult.dummy <== dummy;
|
||||
|
||||
component mult2 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
mult2.in1 <== mult.out;
|
||||
mult2.in2 <== in[0];
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
component mult3 = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult3.in[0] <== in[0];
|
||||
mult3.in[1] <== A;
|
||||
mult3.dummy <== dummy;
|
||||
|
||||
component mult4 = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult4.in[0] <== in[1];
|
||||
mult4.in[1] <== in[1];
|
||||
mult4.dummy <== dummy;
|
||||
|
||||
component add = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER * 2 - 1);
|
||||
add.in1 <== mult2.out;
|
||||
add.in2 <== mult3.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
component add2 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER);
|
||||
add2.in1 <== add.out;
|
||||
add2.in2 <== B;
|
||||
add2.dummy <== dummy;
|
||||
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod.base <== mult4.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod2.base <== add2.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
mod.mod[i] === mod2.mod[i];
|
||||
@@ -1154,14 +1057,11 @@ template PointOnCurveNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
template EllipticCurveDoubleNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
// x * x
|
||||
component mult = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== in[0];
|
||||
mult.in[1] <== in[0];
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// 3 * x * x
|
||||
component scalarMult = ScalarMultOverflow(CHUNK_NUMBER * 2 - 1);
|
||||
@@ -1172,7 +1072,6 @@ template EllipticCurveDoubleNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component add = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add.in1 <== scalarMult.out;
|
||||
add.in2 <== A;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// 2 * y
|
||||
component scalarMult2 = ScalarMultOverflow(CHUNK_NUMBER);
|
||||
@@ -1183,32 +1082,27 @@ template EllipticCurveDoubleNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component modInv = BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
modInv.in <== scalarMult2.out;
|
||||
modInv.modulus <== P;
|
||||
modInv.dummy <== dummy;
|
||||
|
||||
// (3 * x * x + a) * 1 / (2 * y)
|
||||
component mult2 = BigMultNonEqualOverflow(CHUNK_SIZE, 2 * CHUNK_NUMBER - 1, CHUNK_NUMBER);
|
||||
mult2.in1 <== add.out;
|
||||
mult2.in2 <== modInv.out;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// ((3 * x * x + a) * 1 / (2 * y)) % p ==> λ
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod.base <== mult2.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
// λ * λ
|
||||
component mult3 = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult3.in[0] <== mod.mod;
|
||||
mult3.in[1] <== mod.mod;
|
||||
mult3.dummy <== dummy;
|
||||
|
||||
// P - x
|
||||
component sub = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub.in1 <== P;
|
||||
sub.in2 <== in[0];
|
||||
sub.modulus <== P;
|
||||
sub.dummy <== dummy;
|
||||
|
||||
// 2 * P - 2 * x
|
||||
component scalarMult3 = ScalarMultOverflow(CHUNK_NUMBER);
|
||||
@@ -1219,13 +1113,11 @@ template EllipticCurveDoubleNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
component add2 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add2.in1 <== mult3.out;
|
||||
add2.in2 <== scalarMult3.out;
|
||||
add2.dummy <== dummy;
|
||||
|
||||
// (λ * λ + 2 * P - 2 * x) % p ==> x3
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod2.base <== add2.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
out[0] <== mod2.mod;
|
||||
|
||||
@@ -1234,32 +1126,27 @@ template EllipticCurveDoubleNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
sub2.in1 <== in[0];
|
||||
sub2.in2 <== out[0];
|
||||
sub2.modulus <== P;
|
||||
sub2.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3)
|
||||
component mult4 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
mult4.in1 <== mod.mod;
|
||||
mult4.in2 <== sub2.out;
|
||||
mult4.dummy <== dummy;
|
||||
|
||||
// P - y
|
||||
component sub3 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub3.in1 <== P;
|
||||
sub3.in2 <== in[1];
|
||||
sub3.modulus <== P;
|
||||
sub3.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3) + P - y
|
||||
component add3 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add3.in1 <== mult4.out;
|
||||
add3.in2 <== sub3.out;
|
||||
add3.dummy <== dummy;
|
||||
|
||||
// (λ * (x1 - x3) + P - y) % P ==> y3
|
||||
component mod3 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod3.base <== add3.out;
|
||||
mod3.modulus <== P;
|
||||
mod3.dummy <== dummy;
|
||||
|
||||
out[1] <== mod3.mod;
|
||||
}
|
||||
@@ -1273,78 +1160,65 @@ template EllipticCurveAddNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in1[2][CHUNK_NUMBER];
|
||||
signal input in2[2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
// x2 - x1
|
||||
component sub = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub.in1 <== in2[0];
|
||||
sub.in2 <== in1[0];
|
||||
sub.modulus <== P;
|
||||
sub.dummy <== dummy;
|
||||
|
||||
// y2 - y1
|
||||
component sub2 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub2.in1 <== in2[1];
|
||||
sub2.in2 <== in1[1];
|
||||
sub2.modulus <== P;
|
||||
sub2.dummy <== dummy;
|
||||
|
||||
// (x2 - x1) ** -1
|
||||
component modInv = BigModInvOverflow(CHUNK_SIZE, CHUNK_NUMBER, CHUNK_NUMBER);
|
||||
modInv.in <== sub.out;
|
||||
modInv.modulus <== P;
|
||||
modInv.dummy <== dummy;
|
||||
|
||||
// (y2 - y1) * 1 / (x2 - x1)
|
||||
component mult = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult.in[0] <== sub2.out;
|
||||
mult.in[1] <== modInv.out;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// (y2 - y1) * 1 / (x2 - x1) % P ==> λ
|
||||
component mod = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod.base <== mult.out;
|
||||
mod.modulus <== P;
|
||||
mod.dummy <== dummy;
|
||||
|
||||
// λ * λ
|
||||
component mult2 = BigMultOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult2.in[0] <== mod.mod;
|
||||
mult2.in[1] <== mod.mod;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// P - in1
|
||||
component sub3 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub3.in1 <== P;
|
||||
sub3.in2 <== in1[0];
|
||||
sub3.modulus <== P;
|
||||
sub3.dummy <== dummy;
|
||||
|
||||
// P - in2
|
||||
component sub4 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub4.in1 <== P;
|
||||
sub4.in2 <== in2[0];
|
||||
sub4.modulus <== P;
|
||||
sub4.dummy <== dummy;
|
||||
|
||||
// 2 * P - in1 - in2
|
||||
component add = BigAddOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
add.in[0] <== sub3.out;
|
||||
add.in[1] <== sub4.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// λ * λ + 2 * P - in1 - in2
|
||||
component add2 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
add2.in1 <== mult2.out;
|
||||
add2.in2 <== add.out;
|
||||
add2.dummy <== dummy;
|
||||
|
||||
// (λ * λ + 2 * P - in1 - in2) % P ==> x3
|
||||
component mod2 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER, 2);
|
||||
mod2.base <== add2.out;
|
||||
mod2.modulus <== P;
|
||||
mod2.dummy <== dummy;
|
||||
|
||||
out[0] <== mod2.mod;
|
||||
|
||||
@@ -1353,32 +1227,27 @@ template EllipticCurveAddNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
sub5.in1 <== in1[0];
|
||||
sub5.in2 <== out[0];
|
||||
sub5.modulus <== P;
|
||||
sub5.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3)
|
||||
component mult3 = BigMultNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 2 - 1, CHUNK_NUMBER);
|
||||
mult3.in1 <== mult.out;
|
||||
mult3.in2 <== sub5.out;
|
||||
mult3.dummy <== dummy;
|
||||
|
||||
// P - y1
|
||||
component sub6 = BigSubModOverflow(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
sub6.in1 <== P;
|
||||
sub6.in2 <== in1[1];
|
||||
sub6.modulus <== P;
|
||||
sub6.dummy <== dummy;
|
||||
|
||||
// λ * (x1 - x3) + P - y1
|
||||
component add3 = BigAddNonEqualOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER);
|
||||
add3.in1 <== mult3.out;
|
||||
add3.in2 <== sub6.out;
|
||||
add3.dummy <== dummy;
|
||||
|
||||
// (λ * (x1 - x3) + P - y1) % P ==> y3
|
||||
component mod3 = BigModOverflow(CHUNK_SIZE, CHUNK_NUMBER * 3 - 2, CHUNK_NUMBER, 3);
|
||||
mod3.base <== add3.out;
|
||||
mod3.modulus <== P;
|
||||
mod3.dummy <== dummy;
|
||||
|
||||
out[1] <== mod3.mod;
|
||||
}
|
||||
@@ -1394,7 +1263,6 @@ template EllipticCurveAddNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
template EllipicCurveScalarGeneratorMultiplicationNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
@@ -1402,7 +1270,6 @@ template EllipicCurveScalarGeneratorMultiplicationNonOptimised(CHUNK_SIZE, CHUNK
|
||||
|
||||
var parts = CHUNK_NUMBER * CHUNK_SIZE \ STRIDE;
|
||||
|
||||
dummy * dummy === 0;
|
||||
var powers[parts][2 ** STRIDE][2][CHUNK_NUMBER];
|
||||
if (CHUNK_NUMBER == 6){
|
||||
if (P[0] == 9747760000893709395 && P[1] == 12453481191562877553 && P[2] == 1347097566612230435 && P[3] == 1526563086152259252 && P[4] == 1107163671716839903 && P[5] == 10140169582434348328){
|
||||
@@ -1451,7 +1318,6 @@ template EllipicCurveScalarGeneratorMultiplicationNonOptimised(CHUNK_SIZE, CHUNK
|
||||
for (var j = 0; j < 2; j++){
|
||||
for (var axis_idx = 0; axis_idx < CHUNK_NUMBER; axis_idx++){
|
||||
getSumOfNElements[i][j][axis_idx] = GetSumOfNElements(2 ** STRIDE);
|
||||
getSumOfNElements[i][j][axis_idx].dummy <== dummy;
|
||||
for (var stride_idx = 0; stride_idx < 2 ** STRIDE; stride_idx++){
|
||||
getSumOfNElements[i][j][axis_idx].in[stride_idx] <== resultCoordinateComputation[i][stride_idx][j][axis_idx];
|
||||
}
|
||||
@@ -1462,7 +1328,7 @@ template EllipicCurveScalarGeneratorMultiplicationNonOptimised(CHUNK_SIZE, CHUNK
|
||||
component isZero[parts];
|
||||
for (var i = 0; i < parts; i++){
|
||||
isZero[i] = IsZero();
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out + dummy * dummy;
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out;
|
||||
}
|
||||
|
||||
signal precomptedDummy[parts][2][CHUNK_NUMBER];
|
||||
@@ -1500,7 +1366,6 @@ template EllipicCurveScalarGeneratorMultiplicationNonOptimised(CHUNK_SIZE, CHUNK
|
||||
|
||||
for (var i = 0; i < parts - 1; i++){
|
||||
adders[i] = EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
adders[i].dummy <== dummy;
|
||||
isDummyLeft[i] = IsEqual();
|
||||
isDummyRight[i] = IsEqual();
|
||||
|
||||
@@ -1587,12 +1452,10 @@ template EllipicCurveScalarPrecomputeMultiplicationNonOptimised(CHUNK_SIZE, CHUN
|
||||
var parts = CHUNK_NUMBER * CHUNK_SIZE \ STRIDE;
|
||||
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input powers[parts][2 ** STRIDE][2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// We don`t use point anywhere, we should add any quadratic constraint for secure issues
|
||||
@@ -1641,7 +1504,6 @@ template EllipicCurveScalarPrecomputeMultiplicationNonOptimised(CHUNK_SIZE, CHUN
|
||||
for (var j = 0; j < 2; j++){
|
||||
for (var axis_idx = 0; axis_idx < CHUNK_NUMBER; axis_idx++){
|
||||
getSumOfNElements[i][j][axis_idx] = GetSumOfNElements(2 ** STRIDE);
|
||||
getSumOfNElements[i][j][axis_idx].dummy <== dummy;
|
||||
for (var stride_idx = 0; stride_idx < 2 ** STRIDE; stride_idx++){
|
||||
getSumOfNElements[i][j][axis_idx].in[stride_idx] <== resultCoordinateComputation[i][stride_idx][j][axis_idx];
|
||||
}
|
||||
@@ -1652,7 +1514,7 @@ template EllipicCurveScalarPrecomputeMultiplicationNonOptimised(CHUNK_SIZE, CHUN
|
||||
component isZero[parts];
|
||||
for (var i = 0; i < parts; i++){
|
||||
isZero[i] = IsZero();
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out + dummy * dummy;
|
||||
isZero[i].in <== getSumOfNElements[i][0][0].out + getSumOfNElements[i][0][1].out + getSumOfNElements[i][0][2].out + getSumOfNElements[i][0][3].out + getSumOfNElements[i][1][0].out + getSumOfNElements[i][1][1].out + getSumOfNElements[i][1][2].out + getSumOfNElements[i][1][3].out;
|
||||
}
|
||||
|
||||
signal precomptedDummy[parts][2][CHUNK_NUMBER];
|
||||
@@ -1690,7 +1552,6 @@ template EllipicCurveScalarPrecomputeMultiplicationNonOptimised(CHUNK_SIZE, CHUN
|
||||
|
||||
for (var i = 0; i < parts - 1; i++){
|
||||
adders[i] = EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
adders[i].dummy <== dummy;
|
||||
isDummyLeft[i] = IsEqual();
|
||||
isDummyRight[i] = IsEqual();
|
||||
|
||||
@@ -1765,36 +1626,28 @@ template EllipicCurveScalarPrecomputeMultiplicationNonOptimised(CHUNK_SIZE, CHUN
|
||||
|
||||
template PointOnCurve(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
if (CHUNK_NUMBER == 4 && CHUNK_SIZE == 64){
|
||||
component pointOnCurveOptimised = PointOnCurveOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
pointOnCurveOptimised.in <== in;
|
||||
pointOnCurveOptimised.dummy <== dummy;
|
||||
} else {
|
||||
component pointOnCurveNonOptimised = PointOnCurveNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
pointOnCurveNonOptimised.in <== in;
|
||||
pointOnCurveNonOptimised.dummy <== dummy;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
template EllipticCurveDouble(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
if (CHUNK_NUMBER == 4 && CHUNK_SIZE == 64){
|
||||
component ecDoubleOptimised = EllipticCurveDoubleOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
ecDoubleOptimised.in <== in;
|
||||
ecDoubleOptimised.dummy <== dummy;
|
||||
out <== ecDoubleOptimised.out;
|
||||
} else {
|
||||
component ecDoubleNonOptimised = EllipticCurveDoubleNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
ecDoubleNonOptimised.in <== in;
|
||||
ecDoubleNonOptimised.dummy <== dummy;
|
||||
out <== ecDoubleNonOptimised.out;
|
||||
}
|
||||
}
|
||||
@@ -1802,40 +1655,32 @@ template EllipticCurveDouble(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
template EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input in1[2][CHUNK_NUMBER];
|
||||
signal input in2[2][CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
if (CHUNK_NUMBER == 4 && CHUNK_SIZE == 64){
|
||||
component ecAddOptimised = EllipticCurveAddOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
ecAddOptimised.in1 <== in1;
|
||||
ecAddOptimised.in2 <== in2;
|
||||
ecAddOptimised.dummy <== dummy;
|
||||
out <== ecAddOptimised.out;
|
||||
} else {
|
||||
component ecAddNonOptimised = EllipticCurveAddNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
ecAddNonOptimised.in1 <== in1;
|
||||
ecAddNonOptimised.in2 <== in2;
|
||||
ecAddNonOptimised.dummy <== dummy;
|
||||
out <== ecAddNonOptimised.out;
|
||||
}
|
||||
}
|
||||
|
||||
template EllipicCurveScalarGeneratorMultiplication(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
if (CHUNK_SIZE == 64 && CHUNK_NUMBER == 4){
|
||||
component ecGenMultOptimised = EllipicCurveScalarGeneratorMultiplicationOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
ecGenMultOptimised.scalar <== scalar;
|
||||
ecGenMultOptimised.dummy <== dummy;
|
||||
out <== ecGenMultOptimised.out;
|
||||
} else {
|
||||
component ecGenMultNonOptimised = EllipicCurveScalarGeneratorMultiplicationNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
ecGenMultNonOptimised.scalar <== scalar;
|
||||
ecGenMultNonOptimised.dummy <== dummy;
|
||||
out <== ecGenMultNonOptimised.out;
|
||||
}
|
||||
|
||||
@@ -1848,26 +1693,22 @@ template EllipicCurveScalarPrecomputeMultiplication(CHUNK_SIZE, CHUNK_NUMBER, A,
|
||||
var parts = CHUNK_NUMBER * CHUNK_SIZE \ STRIDE;
|
||||
|
||||
signal input scalar[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
signal input in[2][CHUNK_NUMBER];
|
||||
signal input powers[parts][2 ** STRIDE][2][CHUNK_NUMBER];
|
||||
signal output out[2][CHUNK_NUMBER];
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
if (CHUNK_SIZE == 64 && CHUNK_NUMBER == 4){
|
||||
component scalarMultOptimised = EllipicCurveScalarPrecomputeMultiplicationOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
scalarMultOptimised.in <== in;
|
||||
scalarMultOptimised.scalar <== scalar;
|
||||
scalarMultOptimised.powers <== powers;
|
||||
scalarMultOptimised.dummy <== dummy;
|
||||
out <== scalarMultOptimised.out;
|
||||
} else {
|
||||
component scalarMultNonOptimised = EllipicCurveScalarPrecomputeMultiplicationNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
scalarMultNonOptimised.in <== in;
|
||||
scalarMultNonOptimised.scalar <== scalar;
|
||||
scalarMultNonOptimised.powers <== powers;
|
||||
scalarMultNonOptimised.dummy <== dummy;
|
||||
out <== scalarMultNonOptimised.out;
|
||||
|
||||
}
|
||||
|
||||
@@ -36,11 +36,9 @@ template EllipticCurveGetGenerator(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
|
||||
}
|
||||
|
||||
// Get "dummy" point
|
||||
// We can`t "if" signal in circom, so we always need to do all opertions, even we won`t use results of them
|
||||
// For example, in scalar mult we can have case where we shouln`t add anything (bits = [0,0, .. ,0])
|
||||
// We will ignore result, but we still should get it, so we need to pout something anyway
|
||||
// We use this dummy point for such purposes
|
||||
// Dummy point = G * 2**256
|
||||
template EllipticCurveGetDummy(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
assert (CHUNK_SIZE == 64);
|
||||
|
||||
@@ -33,37 +33,31 @@ template ShaHashChunks(BLOCK_NUM, ALGO){
|
||||
BLOCK_SIZE = 1024;
|
||||
}
|
||||
signal input in[BLOCK_SIZE * BLOCK_NUM];
|
||||
signal input dummy;
|
||||
signal output out[ALGO];
|
||||
|
||||
if (ALGO == 160) {
|
||||
component hash160 = Sha1HashChunks(BLOCK_NUM);
|
||||
hash160.in <== in;
|
||||
hash160.dummy <== dummy;
|
||||
hash160.out ==> out;
|
||||
}
|
||||
if (ALGO == 224) {
|
||||
component hash224 = Sha224HashChunks(BLOCK_NUM);
|
||||
hash224.in <== in;
|
||||
hash224.dummy <== dummy;
|
||||
hash224.out ==> out;
|
||||
}
|
||||
if (ALGO == 256) {
|
||||
component hash256 = Sha256HashChunks(BLOCK_NUM);
|
||||
hash256.in <== in;
|
||||
hash256.dummy <== dummy;
|
||||
hash256.out ==> out;
|
||||
}
|
||||
if (ALGO == 384) {
|
||||
component hash384 = Sha384HashChunks(BLOCK_NUM);
|
||||
hash384.in <== in;
|
||||
hash384.dummy <== dummy;
|
||||
hash384.out ==> out;
|
||||
}
|
||||
if (ALGO == 512) {
|
||||
component hash512 = Sha512HashChunks(BLOCK_NUM);
|
||||
hash512.in <== in;
|
||||
hash512.dummy <== dummy;
|
||||
hash512.out ==> out;
|
||||
}
|
||||
}
|
||||
@@ -76,37 +70,31 @@ template ShaHashBits(LEN, ALGO){
|
||||
BLOCK_SIZE = 1024;
|
||||
}
|
||||
signal input in[LEN];
|
||||
signal input dummy;
|
||||
signal output out[ALGO];
|
||||
|
||||
if (ALGO == 160) {
|
||||
component hash160 = Sha1HashBits(LEN);
|
||||
hash160.in <== in;
|
||||
hash160.dummy <== dummy;
|
||||
hash160.out ==> out;
|
||||
}
|
||||
if (ALGO == 224) {
|
||||
component hash224 = Sha224HashBits(LEN);
|
||||
hash224.in <== in;
|
||||
hash224.dummy <== dummy;
|
||||
hash224.out ==> out;
|
||||
}
|
||||
if (ALGO == 256) {
|
||||
component hash256 = Sha256HashBits(LEN);
|
||||
hash256.in <== in;
|
||||
hash256.dummy <== dummy;
|
||||
hash256.out ==> out;
|
||||
}
|
||||
if (ALGO == 384) {
|
||||
component hash384 = Sha384HashBits(LEN);
|
||||
hash384.in <== in;
|
||||
hash384.dummy <== dummy;
|
||||
hash384.out ==> out;
|
||||
}
|
||||
if (ALGO == 512) {
|
||||
component hash512 = Sha512HashBits(LEN);
|
||||
hash512.in <== in;
|
||||
hash512.dummy <== dummy;
|
||||
hash512.out ==> out;
|
||||
}
|
||||
}
|
||||
@@ -121,12 +109,9 @@ template PoseidonHash(LEN){
|
||||
assert (LEN <= 16);
|
||||
assert (LEN > 0);
|
||||
signal input in[LEN];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out;
|
||||
|
||||
component poseidon = Poseidon(LEN);
|
||||
poseidon.in <== in;
|
||||
poseidon.dummy <== dummy;
|
||||
out <== poseidon.out;
|
||||
}
|
||||
|
||||
@@ -31,15 +31,12 @@ template Ark(t, C, r) {
|
||||
|
||||
template Mix(t, M) {
|
||||
signal input in[t];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[t];
|
||||
|
||||
component sum[t];
|
||||
|
||||
for (var i = 0; i < t; i++) {
|
||||
sum[i] = GetSumOfNElements(t);
|
||||
sum[i].dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
sum[i].in[j] <== M[j][i] * in[j];
|
||||
}
|
||||
@@ -49,12 +46,9 @@ template Mix(t, M) {
|
||||
|
||||
template MixLast(t, M, s) {
|
||||
signal input in[t];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out;
|
||||
|
||||
component sum = GetSumOfNElements(t);
|
||||
sum.dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
sum.in[j] <== M[j][s] * in[j];
|
||||
}
|
||||
@@ -63,28 +57,23 @@ template MixLast(t, M, s) {
|
||||
|
||||
template MixS(t, S, r) {
|
||||
signal input in[t];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[t];
|
||||
|
||||
|
||||
component sum = GetSumOfNElements(t);
|
||||
sum.dummy <== dummy;
|
||||
for (var i = 0; i < t; i++) {
|
||||
sum.in[i] <== S[(t * 2 - 1) * r + i] * in[i];
|
||||
}
|
||||
out[0] <== sum.out;
|
||||
|
||||
for (var i = 1; i < t; i++) {
|
||||
out[i] <== in[i] + in[0] * S[(t * 2 - 1) * r + t + i - 1] + dummy * dummy;
|
||||
out[i] <== in[i] + in[0] * S[(t * 2 - 1) * r + t + i - 1];
|
||||
}
|
||||
}
|
||||
|
||||
template PoseidonEx(nInputs, nOuts) {
|
||||
signal input inputs[nInputs];
|
||||
signal input initialState;
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[nOuts];
|
||||
|
||||
@@ -130,7 +119,6 @@ template PoseidonEx(nInputs, nOuts) {
|
||||
}
|
||||
|
||||
mix[r] = Mix(t,M);
|
||||
mix[r].dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
mix[r].in[j] <== ark[r + 1].out[j];
|
||||
}
|
||||
@@ -148,7 +136,6 @@ template PoseidonEx(nInputs, nOuts) {
|
||||
}
|
||||
|
||||
mix[nRoundsF \ 2 - 1] = Mix(t,P);
|
||||
mix[nRoundsF \ 2 - 1].dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
mix[nRoundsF \ 2 - 1].in[j] <== ark[nRoundsF \ 2].out[j];
|
||||
}
|
||||
@@ -163,7 +150,6 @@ template PoseidonEx(nInputs, nOuts) {
|
||||
}
|
||||
|
||||
mixS[r] = MixS(t, S, r);
|
||||
mixS[r].dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
if (j == 0) {
|
||||
mixS[r].in[j] <== sigmaP[r].out + C[(nRoundsF \ 2 + 1) * t + r];
|
||||
@@ -193,7 +179,6 @@ template PoseidonEx(nInputs, nOuts) {
|
||||
}
|
||||
|
||||
mix[nRoundsF \ 2 + r] = Mix(t,M);
|
||||
mix[nRoundsF \ 2 + r].dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
mix[nRoundsF \ 2 + r].in[j] <== ark[nRoundsF \ 2 + r + 1].out[j];
|
||||
}
|
||||
@@ -207,7 +192,6 @@ template PoseidonEx(nInputs, nOuts) {
|
||||
|
||||
for (var i = 0; i < nOuts; i++) {
|
||||
mixLast[i] = MixLast(t,M,i);
|
||||
mixLast[i].dummy <== dummy;
|
||||
for (var j = 0; j < t; j++) {
|
||||
mixLast[i].in[j] <== sigmaF[nRoundsF - 1][j].out;
|
||||
}
|
||||
@@ -221,12 +205,9 @@ template PoseidonEx(nInputs, nOuts) {
|
||||
// Use this template to calculate to calculate Poseidon hash of your vector (1 elememnt array for one num)
|
||||
template Poseidon(nInputs) {
|
||||
signal input in[nInputs];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out;
|
||||
|
||||
component pEx = PoseidonEx(nInputs, 1);
|
||||
pEx.dummy <== dummy;
|
||||
pEx.initialState <== 0;
|
||||
for (var i = 0; i < nInputs; i++) {
|
||||
pEx.inputs[i] <== in[i];
|
||||
|
||||
@@ -5,8 +5,6 @@ include "sha1compression.circom";
|
||||
include "../sha2/sha2Common.circom";
|
||||
|
||||
template Sha1HashChunks(BLOCK_NUM) {
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal input in[BLOCK_NUM * 512];
|
||||
signal output out[160];
|
||||
|
||||
@@ -23,7 +21,6 @@ template Sha1HashChunks(BLOCK_NUM) {
|
||||
|
||||
for (i = 0; i < BLOCK_NUM; i++) {
|
||||
sha1Compression[i] = Sha1compression();
|
||||
sha1Compression[i].dummy <== dummy;
|
||||
|
||||
if (i == 0) {
|
||||
for (k = 0; k < 32; k++) {
|
||||
@@ -56,8 +53,6 @@ template Sha1HashChunks(BLOCK_NUM) {
|
||||
}
|
||||
|
||||
template Sha1HashBits(LEN) {
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal input in[LEN];
|
||||
signal output out[160];
|
||||
|
||||
@@ -79,7 +74,6 @@ template Sha1HashBits(LEN) {
|
||||
|
||||
for (i = 0; i < BLOCK_NUM; i++) {
|
||||
sha1Compression[i] = Sha1compression();
|
||||
sha1Compression[i].dummy <== dummy;
|
||||
|
||||
if (i == 0) {
|
||||
for (k = 0; k < 32; k++) {
|
||||
|
||||
@@ -9,8 +9,6 @@ include "../../bitify/operations.circom";
|
||||
template Sha1compression() {
|
||||
signal input hin[160];
|
||||
signal input inp[512];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[160];
|
||||
|
||||
signal a[81][32];
|
||||
@@ -45,14 +43,12 @@ template Sha1compression() {
|
||||
component tTmp[80];
|
||||
for (i = 0; i <= 79; i++){
|
||||
tTmp[i] = T(i);
|
||||
tTmp[i].dummy <== dummy;
|
||||
|
||||
}
|
||||
|
||||
component fSum[5];
|
||||
for (i = 0; i < 5; i++){
|
||||
fSum[i] = BinSum(2, 32);
|
||||
fSum[i].dummy <== dummy;
|
||||
}
|
||||
|
||||
for (var t = 0; t <= 15; t++) {
|
||||
|
||||
@@ -7,8 +7,6 @@ include "./constants.circom";
|
||||
include "../../int/arithmetic.circom";
|
||||
|
||||
template T(t) {
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal input a[32];
|
||||
signal input b[32];
|
||||
@@ -32,7 +30,6 @@ template T(t) {
|
||||
}
|
||||
|
||||
component sumBinary = BinSum(5, 32);
|
||||
sumBinary.dummy <== dummy;
|
||||
var nout = 35;
|
||||
|
||||
for (k = 0; k < 32; k++) {
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha224InitialValue.circom";
|
||||
template Sha224HashBits(LEN) {
|
||||
|
||||
signal input in[LEN];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[224];
|
||||
|
||||
component addPadding = ShaPadding(LEN, 512);
|
||||
@@ -28,9 +26,7 @@ template Sha224HashBits(LEN) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_224_256Shedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_224_256Rounds(64);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 32; i++) {
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha224InitialValue.circom";
|
||||
template Sha224HashChunks(BLOCK_NUM) {
|
||||
|
||||
signal input in[BLOCK_NUM * 512];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[224];
|
||||
|
||||
signal states[BLOCK_NUM + 1][8][32];
|
||||
@@ -23,9 +21,7 @@ template Sha224HashChunks(BLOCK_NUM) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_224_256Shedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_224_256Rounds(64);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 32; i++) {
|
||||
|
||||
@@ -12,8 +12,6 @@ template Sha2_224_256CompressInner() {
|
||||
|
||||
signal input inp;
|
||||
signal input key;
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal input a[32];
|
||||
signal input b[32];
|
||||
@@ -39,9 +37,7 @@ template Sha2_224_256CompressInner() {
|
||||
outB <== a;
|
||||
|
||||
component dSum = GetSumOfNElements(32);
|
||||
dSum.dummy <== dummy;
|
||||
component hSum = GetSumOfNElements(32);
|
||||
hSum.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 32; i++) {
|
||||
dSum.in[i] <== (1 << i) * c[i];
|
||||
@@ -57,13 +53,9 @@ template Sha2_224_256CompressInner() {
|
||||
component s1Xor[32];
|
||||
|
||||
component s0Sum = GetSumOfNElements(32);
|
||||
s0Sum.dummy <== dummy;
|
||||
component s1Sum = GetSumOfNElements(32);
|
||||
s1Sum.dummy <== dummy;
|
||||
component mjSum = GetSumOfNElements(32);
|
||||
mjSum.dummy <== dummy;
|
||||
component chSum = GetSumOfNElements(32);
|
||||
chSum.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 32; i++) {
|
||||
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha256Rounds.circom";
|
||||
template Sha256HashBits(LEN) {
|
||||
|
||||
signal input in[LEN];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[256];
|
||||
|
||||
@@ -29,9 +27,7 @@ template Sha256HashBits(LEN) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_224_256Shedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_224_256Rounds(64);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 32; i++) {
|
||||
|
||||
@@ -8,12 +8,9 @@ include "sha256Rounds.circom";
|
||||
template Sha256HashChunks(BLOCK_NUM) {
|
||||
|
||||
signal input in[BLOCK_NUM * 512];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[256];
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal states[BLOCK_NUM + 1][8][32];
|
||||
|
||||
@@ -26,9 +23,7 @@ template Sha256HashChunks(BLOCK_NUM) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_224_256Shedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_224_256Rounds(64);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 32; i++) {
|
||||
|
||||
@@ -18,8 +18,6 @@ template Sha2_224_256Rounds(n) {
|
||||
signal input inpHash[8][32];
|
||||
signal output outHash[8][32];
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal a [n + 1][32];
|
||||
signal b [n + 1][32];
|
||||
@@ -43,9 +41,7 @@ template Sha2_224_256Rounds(n) {
|
||||
g[0] <== inpHash[6];
|
||||
|
||||
component sumDd = GetSumOfNElements(32);
|
||||
sumDd.dummy <== dummy;
|
||||
component sumHh = GetSumOfNElements(32);
|
||||
sumHh.dummy <== dummy;
|
||||
for (var i = 0; i < 32; i++) {
|
||||
sumDd.in[i] <== inpHash[3][i] * (1 << i);
|
||||
sumHh.in[i] <== inpHash[7][i] * (1 << i);
|
||||
@@ -57,7 +53,6 @@ template Sha2_224_256Rounds(n) {
|
||||
component sum[8];
|
||||
for (var j = 0; j < 8; j++) {
|
||||
sum[j] = GetSumOfNElements(32);
|
||||
sum[j].dummy <== dummy;
|
||||
for (var i = 0; i < 32; i++) {
|
||||
sum[j].in[i] <== (1 << i) * inpHash[j][i];
|
||||
}
|
||||
@@ -72,7 +67,6 @@ template Sha2_224_256Rounds(n) {
|
||||
|
||||
compress[k].inp <== words[k];
|
||||
compress[k].key <== ROUND_KEYS[k];
|
||||
compress[k].dummy <== dummy;
|
||||
|
||||
compress[k].a <== a [k];
|
||||
compress[k].b <== b [k];
|
||||
@@ -98,17 +92,11 @@ template Sha2_224_256Rounds(n) {
|
||||
modulo[j] = GetLastNBits(32);
|
||||
}
|
||||
component sumA = GetSumOfNElements(32);
|
||||
sumA.dummy <== dummy;
|
||||
component sumB = GetSumOfNElements(32);
|
||||
sumB.dummy <== dummy;
|
||||
component sumC = GetSumOfNElements(32);
|
||||
sumC.dummy <== dummy;
|
||||
component sumE = GetSumOfNElements(32);
|
||||
sumE.dummy <== dummy;
|
||||
component sumF = GetSumOfNElements(32);
|
||||
sumF.dummy <== dummy;
|
||||
component sumG = GetSumOfNElements(32);
|
||||
sumG.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 32; i++) {
|
||||
sumA.in[i] <== (1 << i) * a[n][i];
|
||||
@@ -119,14 +107,14 @@ template Sha2_224_256Rounds(n) {
|
||||
sumG.in[i] <== (1 << i) * g[n][i];
|
||||
}
|
||||
|
||||
modulo[0].in <== hashWords[0] + sumA.out + dummy * dummy;
|
||||
modulo[1].in <== hashWords[1] + sumB.out + dummy * dummy;
|
||||
modulo[2].in <== hashWords[2] + sumC.out + dummy * dummy;
|
||||
modulo[3].in <== hashWords[3] + dd[n] + dummy * dummy;
|
||||
modulo[4].in <== hashWords[4] + sumE.out + dummy * dummy;
|
||||
modulo[5].in <== hashWords[5] + sumF.out + dummy * dummy;
|
||||
modulo[6].in <== hashWords[6] + sumG.out + dummy * dummy;
|
||||
modulo[7].in <== hashWords[7] + hh[n] + dummy * dummy;
|
||||
modulo[0].in <== hashWords[0] + sumA.out;
|
||||
modulo[1].in <== hashWords[1] + sumB.out;
|
||||
modulo[2].in <== hashWords[2] + sumC.out;
|
||||
modulo[3].in <== hashWords[3] + dd[n];
|
||||
modulo[4].in <== hashWords[4] + sumE.out;
|
||||
modulo[5].in <== hashWords[5] + sumF.out;
|
||||
modulo[6].in <== hashWords[6] + sumG.out;
|
||||
modulo[7].in <== hashWords[7] + hh[n];
|
||||
|
||||
for (var j = 0; j < 8; j++) {
|
||||
modulo[j].out ==> outHash[j];
|
||||
|
||||
@@ -13,15 +13,12 @@ template Sha2_224_256Shedule() {
|
||||
signal input chunkBits[16][32];
|
||||
signal output outWords [64];
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal outBits[64][32];
|
||||
|
||||
component sumN[16];
|
||||
for (var k = 0; k < 16; k++) {
|
||||
sumN[k] = GetSumOfNElements(32);
|
||||
sumN[k].dummy <== dummy;
|
||||
for (var i = 0; i < 32; i++) {
|
||||
sumN[k].in[i] <== (1 << i) * chunkBits[k][i];
|
||||
}
|
||||
@@ -43,9 +40,7 @@ template Sha2_224_256Shedule() {
|
||||
var l = m - 2;
|
||||
|
||||
s0Sum[m - 16] = GetSumOfNElements(32);
|
||||
s0Sum[m - 16].dummy <== dummy;
|
||||
s1Sum[m - 16] = GetSumOfNElements(32);
|
||||
s1Sum[m - 16].dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 32; i++) {
|
||||
|
||||
@@ -68,7 +63,7 @@ template Sha2_224_256Shedule() {
|
||||
|
||||
|
||||
modulo[r] = GetLastNBits(32);
|
||||
modulo[r].in <== s1Sum[m - 16].out + outWords[m - 7] + s0Sum[m - 16].out + outWords[m - 16] + dummy * dummy;
|
||||
modulo[r].in <== s1Sum[m - 16].out + outWords[m - 7] + s0Sum[m - 16].out + outWords[m - 16];
|
||||
modulo[r].out ==> outBits[m];
|
||||
bits2Num[r] = Bits2Num(32);
|
||||
bits2Num[r].in <== outBits[m];
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha384InitialValue.circom";
|
||||
template Sha384HashBits(LEN) {
|
||||
|
||||
signal input in[LEN];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out[384];
|
||||
|
||||
component addPadding = ShaPadding(LEN, 1024);
|
||||
@@ -28,9 +26,7 @@ template Sha384HashBits(LEN) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_384_512Schedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_384_512Rounds(80);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 64; i++) {
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha384InitialValue.circom";
|
||||
template Sha384HashChunks(BLOCK_NUM) {
|
||||
|
||||
signal input in[BLOCK_NUM * 1024];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[384];
|
||||
|
||||
@@ -25,9 +23,7 @@ template Sha384HashChunks(BLOCK_NUM) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_384_512Schedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_384_512Rounds(80);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 64; i++) {
|
||||
|
||||
@@ -12,8 +12,6 @@ template Sha2_384_512CompressInner() {
|
||||
|
||||
signal input inp;
|
||||
signal input key;
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal input a[64];
|
||||
signal input b[64];
|
||||
@@ -34,9 +32,7 @@ template Sha2_384_512CompressInner() {
|
||||
signal output outHH;
|
||||
|
||||
component dSum = GetSumOfNElements(64);
|
||||
dSum.dummy <== dummy;
|
||||
component hSum = GetSumOfNElements(64);
|
||||
hSum.dummy <== dummy;
|
||||
for (var i = 0; i < 64; i++) {
|
||||
outG[i] <== f[i];
|
||||
outF[i] <== e[i];
|
||||
@@ -55,13 +51,9 @@ template Sha2_384_512CompressInner() {
|
||||
component s1Xor[64];
|
||||
|
||||
component s0Sum = GetSumOfNElements(64);
|
||||
s0Sum.dummy <== dummy;
|
||||
component s1Sum = GetSumOfNElements(64);
|
||||
s1Sum.dummy <== dummy;
|
||||
component mjSum = GetSumOfNElements(64);
|
||||
mjSum.dummy <== dummy;
|
||||
component chSum = GetSumOfNElements(64);
|
||||
chSum.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 64; i++) {
|
||||
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha512Rounds.circom";
|
||||
template Sha512HashBits(LEN) {
|
||||
|
||||
signal input in[LEN];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[512];
|
||||
|
||||
@@ -29,9 +27,7 @@ template Sha512HashBits(LEN) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_384_512Schedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_384_512Rounds(80);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 64; i++) {
|
||||
|
||||
@@ -8,8 +8,6 @@ include "sha512Rounds.circom";
|
||||
template Sha512HashChunks(BLOCK_NUM) {
|
||||
|
||||
signal input in[BLOCK_NUM * 1024];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal output out[512];
|
||||
|
||||
@@ -24,9 +22,7 @@ template Sha512HashChunks(BLOCK_NUM) {
|
||||
for (var m = 0; m < BLOCK_NUM; m++) {
|
||||
|
||||
sch[m] = Sha2_384_512Schedule();
|
||||
sch[m].dummy <== dummy;
|
||||
rds[m] = Sha2_384_512Rounds(80);
|
||||
rds[m].dummy <== dummy;
|
||||
|
||||
for (var k = 0; k < 16; k++) {
|
||||
for (var i = 0; i < 64; i++) {
|
||||
|
||||
@@ -17,8 +17,6 @@ template Sha2_384_512Rounds(n) {
|
||||
signal input inpHash[8][64];
|
||||
signal output outHash[8][64];
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal a [n + 1][64];
|
||||
signal b [n + 1][64];
|
||||
@@ -42,9 +40,7 @@ template Sha2_384_512Rounds(n) {
|
||||
g[0] <== inpHash[6];
|
||||
|
||||
component sumDd = GetSumOfNElements(64);
|
||||
sumDd.dummy <== dummy;
|
||||
component sumHh = GetSumOfNElements(64);
|
||||
sumHh.dummy <== dummy;
|
||||
for (var i = 0; i < 64; i++) {
|
||||
sumDd.in[i] <== inpHash[3][i] * (1 << i);
|
||||
sumHh.in[i] <== inpHash[7][i] * (1 << i);
|
||||
@@ -56,7 +52,6 @@ template Sha2_384_512Rounds(n) {
|
||||
component sum[8];
|
||||
for (var j = 0; j < 8; j++) {
|
||||
sum[j] = GetSumOfNElements(64);
|
||||
sum[j].dummy <== dummy;
|
||||
for (var i = 0; i < 64; i++) {
|
||||
sum[j].in[i] <== (1 << i) * inpHash[j][i];
|
||||
}
|
||||
@@ -71,7 +66,6 @@ template Sha2_384_512Rounds(n) {
|
||||
|
||||
compress[k].inp <== words[k];
|
||||
compress[k].key <== ROUND_KEYS[k];
|
||||
compress[k].dummy <== dummy;
|
||||
|
||||
|
||||
compress[k].a <== a [k];
|
||||
@@ -99,17 +93,11 @@ template Sha2_384_512Rounds(n) {
|
||||
}
|
||||
|
||||
component sumA = GetSumOfNElements(64);
|
||||
sumA.dummy <== dummy;
|
||||
component sumB = GetSumOfNElements(64);
|
||||
sumB.dummy <== dummy;
|
||||
component sumC = GetSumOfNElements(64);
|
||||
sumC.dummy <== dummy;
|
||||
component sumE = GetSumOfNElements(64);
|
||||
sumE.dummy <== dummy;
|
||||
component sumF = GetSumOfNElements(64);
|
||||
sumF.dummy <== dummy;
|
||||
component sumG = GetSumOfNElements(64);
|
||||
sumG.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 64; i++) {
|
||||
sumA.in[i] <== (1 << i) * a[n][i];
|
||||
@@ -120,14 +108,14 @@ template Sha2_384_512Rounds(n) {
|
||||
sumG.in[i] <== (1 << i) * g[n][i];
|
||||
}
|
||||
|
||||
modulo[0].in <== hashWords[0] + sumA.out + dummy * dummy;
|
||||
modulo[1].in <== hashWords[1] + sumB.out + dummy * dummy;
|
||||
modulo[2].in <== hashWords[2] + sumC.out + dummy * dummy;
|
||||
modulo[3].in <== hashWords[3] + dd[n] + dummy * dummy;
|
||||
modulo[4].in <== hashWords[4] + sumE.out + dummy * dummy;
|
||||
modulo[5].in <== hashWords[5] + sumF.out + dummy * dummy;
|
||||
modulo[6].in <== hashWords[6] + sumG.out + dummy * dummy;
|
||||
modulo[7].in <== hashWords[7] + hh[n] + dummy * dummy;
|
||||
modulo[0].in <== hashWords[0] + sumA.out;
|
||||
modulo[1].in <== hashWords[1] + sumB.out;
|
||||
modulo[2].in <== hashWords[2] + sumC.out;
|
||||
modulo[3].in <== hashWords[3] + dd[n];
|
||||
modulo[4].in <== hashWords[4] + sumE.out;
|
||||
modulo[5].in <== hashWords[5] + sumF.out;
|
||||
modulo[6].in <== hashWords[6] + sumG.out;
|
||||
modulo[7].in <== hashWords[7] + hh[n];
|
||||
|
||||
for (var j = 0; j < 8; j++) {
|
||||
modulo[j].out ==> outHash[j];
|
||||
|
||||
@@ -12,8 +12,6 @@ template Sha2_384_512Schedule() {
|
||||
|
||||
signal input chunkBits[16][64];
|
||||
signal output outWords [80];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
signal outBits[80][64];
|
||||
|
||||
@@ -21,7 +19,6 @@ template Sha2_384_512Schedule() {
|
||||
component sumN[16];
|
||||
for (var k = 0; k < 16; k++) {
|
||||
sumN[k] = GetSumOfNElements(64);
|
||||
sumN[k].dummy <== dummy;
|
||||
for (var i = 0; i < 64; i++) {
|
||||
sumN[k].in[i] <== (1 << i) * chunkBits[k][i];
|
||||
}
|
||||
@@ -44,9 +41,7 @@ template Sha2_384_512Schedule() {
|
||||
var l = m - 2;
|
||||
|
||||
s0Sum[m - 16] = GetSumOfNElements(64);
|
||||
s0Sum[m - 16].dummy <== dummy;
|
||||
s1Sum[m - 16] = GetSumOfNElements(64);
|
||||
s1Sum[m - 16].dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < 64; i++) {
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@ template Sha1General(maxBitsPadded) {
|
||||
for (i=0; i<maxBlocks; i++) {
|
||||
|
||||
sha1compression[i] = Sha1compression();
|
||||
sha1compression[i].dummy <== 0;
|
||||
|
||||
if (i==0) {
|
||||
for (k=0; k<32; k++) {
|
||||
|
||||
@@ -56,14 +56,10 @@ template GetLastNBits(N){
|
||||
|
||||
// Get sum of N elements with 1 constraint.
|
||||
// Use this instead of a + b + ... + c;
|
||||
// Circom will drop linear constaraint because of optimisation
|
||||
// This one adds dummy * dummy (0) to make it quadratic
|
||||
template GetSumOfNElements(N){
|
||||
assert (N >= 2);
|
||||
|
||||
signal input in[N];
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
signal output out;
|
||||
|
||||
signal sum[N - 1];
|
||||
@@ -75,5 +71,5 @@ template GetSumOfNElements(N){
|
||||
sum[i] <== sum[i - 1] + in[i + 1];
|
||||
}
|
||||
}
|
||||
out <== sum[N - 2] + dummy * dummy;
|
||||
out <== sum[N - 2];
|
||||
}
|
||||
@@ -36,7 +36,7 @@ template BinaryMerkleRoot(MAX_DEPTH) {
|
||||
var c[2][2] = [ [nodes[i], siblings[i]], [siblings[i], nodes[i]] ];
|
||||
var childNodes[2] = MultiMux1(2)(c, indices[i]);
|
||||
|
||||
nodes[i + 1] <== PoseidonHash(2)(childNodes, 0);
|
||||
nodes[i + 1] <== PoseidonHash(2)(childNodes);
|
||||
}
|
||||
|
||||
var isDepth = IsEqual()([depth, MAX_DEPTH]);
|
||||
|
||||
@@ -31,7 +31,7 @@ template SMTVerify(nLength) {
|
||||
path <== ct1.out;
|
||||
|
||||
// Closest_key to leaf
|
||||
signal leaf <== PoseidonHash(3)([value, 1, 1], 0); // compute the leaf from the value
|
||||
signal leaf <== PoseidonHash(3)([value, 1, 1]); // compute the leaf from the value
|
||||
signal isClosestZero <== IsEqual()([value,0]); // check if the inital value is 0, in that case the leaf will be 0 too, not Hash(0,1,1);
|
||||
signal leafOrZero <== leaf * (1 - isClosestZero);
|
||||
|
||||
@@ -40,7 +40,7 @@ template SMTVerify(nLength) {
|
||||
signal computedRootIsValid <== IsEqual()([computedRoot,root]);
|
||||
|
||||
// check is leaf equals virtual leaf
|
||||
signal virtualLeaf <== PoseidonHash(3)([virtualValue, 1,1], 0);
|
||||
signal virtualLeaf <== PoseidonHash(3)([virtualValue, 1,1]);
|
||||
signal areLeafAndVirtualLeafEquals <== IsEqual()([virtualLeaf, leaf]);
|
||||
|
||||
signal isInclusionOrNonInclusionValid <== IsEqual()([mode,areLeafAndVirtualLeafEquals]);
|
||||
|
||||
@@ -21,7 +21,6 @@ template verifyECDSABits(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, ALGO){
|
||||
signal input pubkey[2][CHUNK_NUMBER];
|
||||
signal input signature[2][CHUNK_NUMBER];
|
||||
signal input hashed[ALGO];
|
||||
signal input dummy;
|
||||
|
||||
signal hashedChunked[CHUNK_NUMBER];
|
||||
|
||||
@@ -45,7 +44,6 @@ template verifyECDSABits(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, ALGO){
|
||||
|
||||
modInv.in <== signature[1];
|
||||
modInv.modulus <== order;
|
||||
modInv.dummy <== dummy;
|
||||
modInv.out ==> sinv;
|
||||
|
||||
// (s ^ -1 mod n) * h mod n
|
||||
@@ -53,31 +51,26 @@ template verifyECDSABits(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, ALGO){
|
||||
mult.in[0] <== sinv;
|
||||
mult.in[1] <== hashedChunked;
|
||||
mult.in[2] <== order;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// (s ^ -1 mod n) * r mod n
|
||||
component mult2 = BigMultModP(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult2.in[0] <== sinv;
|
||||
mult2.in[1] <== signature[0];
|
||||
mult2.in[2] <== order;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// h * s_inv * G
|
||||
component scalarMult1 = EllipicCurveScalarGeneratorMultiplication(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
scalarMult1.scalar <== mult.out;
|
||||
scalarMult1.dummy <== dummy;
|
||||
|
||||
// r * s_inv * (x, y)
|
||||
component scalarMult2 = EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, 4);
|
||||
scalarMult2.scalar <== mult2.out;
|
||||
scalarMult2.in <== pubkey;
|
||||
scalarMult2.dummy <== dummy;
|
||||
|
||||
// (x1, y1) = h * s_inv * G + r * s_inv * (x, y)
|
||||
component add = EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
add.in1 <== scalarMult1.out;
|
||||
add.in2 <== scalarMult2.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// x1 === r
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
@@ -100,7 +93,6 @@ template verifyECDSABigInt(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input pubkey[2][CHUNK_NUMBER];
|
||||
signal input signature[2][CHUNK_NUMBER];
|
||||
signal input hashed[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
component getOrder = EllipicCurveGetOrder(CHUNK_SIZE,CHUNK_NUMBER, A, B, P);
|
||||
signal order[CHUNK_NUMBER];
|
||||
@@ -113,7 +105,6 @@ template verifyECDSABigInt(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
|
||||
modInv.in <== signature[1];
|
||||
modInv.modulus <== order;
|
||||
modInv.dummy <== dummy;
|
||||
modInv.out ==> sinv;
|
||||
|
||||
// (s ^ -1 mod n) * h mod n
|
||||
@@ -121,31 +112,26 @@ template verifyECDSABigInt(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
mult.in[0] <== sinv;
|
||||
mult.in[1] <== hashed;
|
||||
mult.in[2] <== order;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// (s ^ -1 mod n) * r mod n
|
||||
component mult2 = BigMultModP(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult2.in[0] <== sinv;
|
||||
mult2.in[1] <== signature[0];
|
||||
mult2.in[2] <== order;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// h * s_inv * G
|
||||
component scalarMult1 = EllipicCurveScalarGeneratorMultiplication(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
scalarMult1.scalar <== mult.out;
|
||||
scalarMult1.dummy <== dummy;
|
||||
|
||||
// r * s_inv * (x, y)
|
||||
component scalarMult2 = EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, 4);
|
||||
scalarMult2.scalar <== mult2.out;
|
||||
scalarMult2.in <== pubkey;
|
||||
scalarMult2.dummy <== dummy;
|
||||
|
||||
// (x1, y1) = h * s_inv * G + r * s_inv * (x, y)
|
||||
component add = EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
add.in1 <== scalarMult1.out;
|
||||
add.in2 <== scalarMult2.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// x1 === r
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
|
||||
@@ -40,7 +40,7 @@ template VerifyLargeRsaPkcs1v1_5(signatureAlgorithm, CHUNK_SIZE, CHUNK_NUMBER, E
|
||||
bigPow.base[i] <== signature[i];
|
||||
bigPow.modulus[i] <== modulus[i];
|
||||
}
|
||||
bigPow.dummy <== 0;
|
||||
bigPow.dummy <== dummy;
|
||||
|
||||
var padding[5] = getPadding(signatureAlgorithm);
|
||||
|
||||
|
||||
@@ -9,11 +9,9 @@ template Mgf1Sha384(SEED_LEN, MASK_LEN) { //in bytes
|
||||
var HASH_LEN_BITS = HASH_LEN * 8;//output len of sha function in bits
|
||||
|
||||
signal input seed[SEED_LEN_BITS]; //each represents a bit
|
||||
signal input dummy;
|
||||
|
||||
signal output out[MASK_LEN_BITS];
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
assert(MASK_LEN <= 0xffffffff * HASH_LEN );
|
||||
|
||||
@@ -24,7 +22,6 @@ template Mgf1Sha384(SEED_LEN, MASK_LEN) { //in bytes
|
||||
|
||||
for (var i = 0; i < ITERATIONS; i++) {
|
||||
sha384[i] = ShaHashChunks(1 , 384); //32 bits for counter
|
||||
sha384[i].dummy <== dummy;
|
||||
|
||||
num2Bits[i] = Num2Bits(32);
|
||||
}
|
||||
@@ -80,10 +77,8 @@ template Mgf1Sha256(SEED_LEN, MASK_LEN) { //in bytes
|
||||
var HASH_LEN_BITS = HASH_LEN * 8;//output len of sha function in bits
|
||||
|
||||
signal input seed[SEED_LEN_BITS]; //each represents a bit
|
||||
signal input dummy;
|
||||
|
||||
signal output out[MASK_LEN_BITS];
|
||||
dummy * dummy === 0;
|
||||
|
||||
assert(MASK_LEN <= 0xffffffff * HASH_LEN );
|
||||
var ITERATIONS = (MASK_LEN \ HASH_LEN) + 1; //adding 1, in-case MASK_LEN \ HASH_LEN is 0
|
||||
@@ -93,7 +88,6 @@ template Mgf1Sha256(SEED_LEN, MASK_LEN) { //in bytes
|
||||
|
||||
for (var i = 0; i < ITERATIONS; i++) {
|
||||
sha256[i] = ShaHashChunks(1, 256); //32 bits for counter
|
||||
sha256[i].dummy <== dummy;
|
||||
|
||||
num2Bits[i] = Num2Bits(32);
|
||||
}
|
||||
|
||||
@@ -23,8 +23,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
signal input signature[CHUNK_NUMBER];
|
||||
signal input hashed[HASH_TYPE];
|
||||
|
||||
signal input dummy;
|
||||
dummy * dummy === 0;
|
||||
|
||||
var EM_LEN = (CHUNK_SIZE * CHUNK_NUMBER) \ 8;
|
||||
var HASH_LEN = HASH_TYPE \ 8;
|
||||
@@ -39,7 +37,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
powerMod = PowerMod(CHUNK_SIZE, CHUNK_NUMBER, EXP);
|
||||
powerMod.base <== signature;
|
||||
powerMod.modulus <== pubkey;
|
||||
powerMod.dummy <== dummy;
|
||||
|
||||
signal encoded[CHUNK_NUMBER];
|
||||
encoded <== powerMod.out;
|
||||
@@ -94,7 +91,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
//getting mask
|
||||
if (HASH_TYPE == 256) {
|
||||
component MGF1_256 = Mgf1Sha256(HASH_LEN, DB_MASK_LEN);
|
||||
MGF1_256.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < (HASH_TYPE); i++) {
|
||||
MGF1_256.seed[i] <== hash[i];
|
||||
@@ -106,7 +102,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
}
|
||||
if (HASH_TYPE == 384) {
|
||||
component MGF1_384 = Mgf1Sha384(HASH_LEN, DB_MASK_LEN);
|
||||
MGF1_384.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < (HASH_TYPE); i++) {
|
||||
MGF1_384.seed[i] <== hash[i];
|
||||
@@ -175,7 +170,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
|
||||
//hashing
|
||||
component hDash256 = ShaHashChunks(2, HASH_TYPE);
|
||||
hDash256.dummy <== dummy;
|
||||
hDash256.in <== mDash;
|
||||
|
||||
hDash256.out === hash;
|
||||
@@ -199,7 +193,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
mDash[1014] <== 1;
|
||||
|
||||
component hDash256 = ShaHashChunks(2, HASH_TYPE);
|
||||
hDash256.dummy <== dummy;
|
||||
hDash256.in <== mDash;
|
||||
|
||||
hDash256.out === hash;
|
||||
@@ -226,7 +219,6 @@ template VerifyRsaPssSig(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HASH_TYPE) {
|
||||
|
||||
//hashing mDash
|
||||
component hDash384 = ShaHashChunks(1, HASH_TYPE);
|
||||
hDash384.dummy <== dummy;
|
||||
hDash384.in <== mDash;
|
||||
|
||||
hDash384.out === hash;
|
||||
@@ -251,9 +243,7 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
signal input pubkey[CHUNK_NUMBER];
|
||||
signal input signature[CHUNK_NUMBER];
|
||||
signal input hashed[HASH_TYPE];
|
||||
signal input dummy;
|
||||
|
||||
dummy * dummy === 0;
|
||||
|
||||
var EM_LEN = (CHUNK_SIZE * CHUNK_NUMBER) \ 8;
|
||||
var HASH_LEN = HASH_TYPE \ 8;
|
||||
@@ -268,7 +258,6 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
powerMod = PowerModNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, EXP);
|
||||
powerMod.base <== signature;
|
||||
powerMod.modulus <== pubkey;
|
||||
powerMod.dummy <== dummy;
|
||||
|
||||
signal encoded[CHUNK_NUMBER];
|
||||
encoded <== powerMod.out;
|
||||
@@ -322,7 +311,6 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
//getting mask
|
||||
if (HASH_TYPE == 256) {
|
||||
component MGF1_256 = Mgf1Sha256(HASH_LEN, DB_MASK_LEN);
|
||||
MGF1_256.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < (HASH_TYPE); i++) {
|
||||
MGF1_256.seed[i] <== hash[i];
|
||||
@@ -334,7 +322,6 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
}
|
||||
if (HASH_TYPE == 384) {
|
||||
component MGF1_384 = Mgf1Sha384(HASH_LEN, DB_MASK_LEN);
|
||||
MGF1_384.dummy <== dummy;
|
||||
|
||||
for (var i = 0; i < (HASH_TYPE); i++) {
|
||||
MGF1_384.seed[i] <== hash[i];
|
||||
@@ -404,7 +391,6 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
|
||||
//hashing
|
||||
component hDash256 = ShaHashChunks(2, HASH_TYPE);
|
||||
hDash256.dummy <== dummy;
|
||||
hDash256.in <== mDash;
|
||||
|
||||
hDash256.out === hash;
|
||||
@@ -427,7 +413,6 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
mDash[1014] <== 1;
|
||||
|
||||
component hDash256 = ShaHashChunks(2, HASH_TYPE);
|
||||
hDash256.dummy <== dummy;
|
||||
hDash256.in <== mDash;
|
||||
|
||||
hDash256.out === hash;
|
||||
@@ -454,7 +439,6 @@ template VerifyRsaPssSigNonOptimised(CHUNK_SIZE, CHUNK_NUMBER, SALT_LEN, EXP, HA
|
||||
|
||||
//hashing mDash
|
||||
component hDash384 = ShaHashChunks(1, HASH_TYPE);
|
||||
hDash384.dummy <== dummy;
|
||||
hDash384.in <== mDash;
|
||||
|
||||
hDash384.out === hash;
|
||||
|
||||
@@ -21,7 +21,6 @@ template verifyECDSABits(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, ALGO){
|
||||
signal input pubkey[2][CHUNK_NUMBER];
|
||||
signal input signature[2][CHUNK_NUMBER];
|
||||
signal input hashed[ALGO];
|
||||
signal input dummy;
|
||||
|
||||
signal hashedChunked[CHUNK_NUMBER];
|
||||
|
||||
@@ -45,7 +44,6 @@ template verifyECDSABits(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, ALGO){
|
||||
|
||||
modInv.in <== signature[1];
|
||||
modInv.modulus <== order;
|
||||
modInv.dummy <== dummy;
|
||||
modInv.out ==> sinv;
|
||||
|
||||
// (s ^ -1 mod n) * h mod n
|
||||
@@ -53,31 +51,26 @@ template verifyECDSABits(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, ALGO){
|
||||
mult.in[0] <== sinv;
|
||||
mult.in[1] <== hashedChunked;
|
||||
mult.in[2] <== order;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// (s ^ -1 mod n) * r mod n
|
||||
component mult2 = BigMultModP(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult2.in[0] <== sinv;
|
||||
mult2.in[1] <== signature[0];
|
||||
mult2.in[2] <== order;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// h * s_inv * G
|
||||
component scalarMult1 = EllipicCurveScalarGeneratorMultiplication(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
scalarMult1.scalar <== mult.out;
|
||||
scalarMult1.dummy <== dummy;
|
||||
|
||||
// r * s_inv * (x, y)
|
||||
component scalarMult2 = EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, 4);
|
||||
scalarMult2.scalar <== mult2.out;
|
||||
scalarMult2.in <== pubkey;
|
||||
scalarMult2.dummy <== dummy;
|
||||
|
||||
// (x1, y1) = h * s_inv * G + r * s_inv * (x, y)
|
||||
component add = EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
add.in1 <== scalarMult1.out;
|
||||
add.in2 <== scalarMult2.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// x1 === r
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
@@ -100,7 +93,6 @@ template verifyECDSABigInt(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
signal input pubkey[2][CHUNK_NUMBER];
|
||||
signal input signature[2][CHUNK_NUMBER];
|
||||
signal input hashed[CHUNK_NUMBER];
|
||||
signal input dummy;
|
||||
|
||||
component getOrder = EllipicCurveGetOrder(CHUNK_SIZE,CHUNK_NUMBER, A, B, P);
|
||||
signal order[CHUNK_NUMBER];
|
||||
@@ -113,7 +105,6 @@ template verifyECDSABigInt(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
|
||||
modInv.in <== signature[1];
|
||||
modInv.modulus <== order;
|
||||
modInv.dummy <== dummy;
|
||||
modInv.out ==> sinv;
|
||||
|
||||
// (s ^ -1 mod n) * h mod n
|
||||
@@ -121,31 +112,26 @@ template verifyECDSABigInt(CHUNK_SIZE, CHUNK_NUMBER, A, B, P){
|
||||
mult.in[0] <== sinv;
|
||||
mult.in[1] <== hashed;
|
||||
mult.in[2] <== order;
|
||||
mult.dummy <== dummy;
|
||||
|
||||
// (s ^ -1 mod n) * r mod n
|
||||
component mult2 = BigMultModP(CHUNK_SIZE, CHUNK_NUMBER);
|
||||
mult2.in[0] <== sinv;
|
||||
mult2.in[1] <== signature[0];
|
||||
mult2.in[2] <== order;
|
||||
mult2.dummy <== dummy;
|
||||
|
||||
// h * s_inv * G
|
||||
component scalarMult1 = EllipicCurveScalarGeneratorMultiplication(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
scalarMult1.scalar <== mult.out;
|
||||
scalarMult1.dummy <== dummy;
|
||||
|
||||
// r * s_inv * (x, y)
|
||||
component scalarMult2 = EllipticCurvePipingerMult(CHUNK_SIZE, CHUNK_NUMBER, A, B, P, 4);
|
||||
scalarMult2.scalar <== mult2.out;
|
||||
scalarMult2.in <== pubkey;
|
||||
scalarMult2.dummy <== dummy;
|
||||
|
||||
// (x1, y1) = h * s_inv * G + r * s_inv * (x, y)
|
||||
component add = EllipticCurveAdd(CHUNK_SIZE, CHUNK_NUMBER, A, B, P);
|
||||
add.in1 <== scalarMult1.out;
|
||||
add.in2 <== scalarMult2.out;
|
||||
add.dummy <== dummy;
|
||||
|
||||
// x1 === r
|
||||
for (var i = 0; i < CHUNK_NUMBER; i++){
|
||||
|
||||
@@ -17,7 +17,6 @@ template ComputeCommitment() {
|
||||
poseidon_hasher.in[0] <== secret;
|
||||
poseidon_hasher.in[1] <== attestation_id;
|
||||
poseidon_hasher.in[2] <== leaf;
|
||||
poseidon_hasher.dummy <== 0;
|
||||
|
||||
signal dg1_packed[3] <== PackBytes(93)(dg1);
|
||||
for (var i = 0; i < 3; i++) {
|
||||
|
||||
@@ -10,7 +10,6 @@ template CustomHasher(k) {
|
||||
component hash[rounds];
|
||||
for (var i = 0; i < rounds ; i ++){
|
||||
hash[i] = PoseidonHash(16);
|
||||
hash[i].dummy <== 0;
|
||||
}
|
||||
|
||||
for (var i = 0; i < rounds ; i ++){
|
||||
@@ -27,7 +26,6 @@ template CustomHasher(k) {
|
||||
for (var i = 0 ; i < rounds ; i++) {
|
||||
finalHash.in[i] <== hash[i].out;
|
||||
}
|
||||
finalHash.dummy <== 0;
|
||||
signal output out <== finalHash.out;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,10 +18,9 @@ template OFAC_NAME() {
|
||||
for (var i = 0; i < 13; i++) {
|
||||
poseidon_hasher[j].in[i] <== dg1[10 + 13 * j + i];
|
||||
}
|
||||
poseidon_hasher[j].dummy <== 0;
|
||||
}
|
||||
|
||||
signal name_hash <== PoseidonHash(3)([poseidon_hasher[0].out, poseidon_hasher[1].out, poseidon_hasher[2].out], 0);
|
||||
signal name_hash <== PoseidonHash(3)([poseidon_hasher[0].out, poseidon_hasher[1].out, poseidon_hasher[2].out]);
|
||||
|
||||
signal output ofacCheckResult <== SMTVerify(256)(name_hash, smt_leaf_value, smt_root, smt_siblings, 0);
|
||||
}
|
||||
|
||||
@@ -17,9 +17,8 @@ template OFAC_NAME_DOB() {
|
||||
for (var i = 0; i < 13; i++) {
|
||||
poseidon_hasher[j].in[i] <== dg1[10 + 13 * j + i];
|
||||
}
|
||||
poseidon_hasher[j].dummy <== 0;
|
||||
}
|
||||
signal name_hash <== PoseidonHash(3)([poseidon_hasher[0].out, poseidon_hasher[1].out, poseidon_hasher[2].out], 0);
|
||||
signal name_hash <== PoseidonHash(3)([poseidon_hasher[0].out, poseidon_hasher[1].out, poseidon_hasher[2].out]);
|
||||
|
||||
// Dob hash
|
||||
component pos_dob = PoseidonHash(6);
|
||||
@@ -27,10 +26,9 @@ template OFAC_NAME_DOB() {
|
||||
pos_dob.in[i] <== dg1[62 + i];
|
||||
}
|
||||
|
||||
pos_dob.dummy <== 0;
|
||||
|
||||
// NameDob hash
|
||||
signal name_dob_hash <== PoseidonHash(2)([pos_dob.out, name_hash], 0);
|
||||
signal name_dob_hash <== PoseidonHash(2)([pos_dob.out, name_hash]);
|
||||
|
||||
signal output ofacCheckResult <== SMTVerify(256)(name_dob_hash, smt_leaf_value, smt_root, smt_siblings, 0);
|
||||
}
|
||||
@@ -16,6 +16,5 @@ template OFAC_PASSPORT_NUMBER() {
|
||||
for (var i = 0; i < 9; i++) {
|
||||
poseidon_hasher.in[i] <== dg1[49 + i];
|
||||
}
|
||||
poseidon_hasher.dummy <== 0;
|
||||
signal output ofacCheckResult <== SMTVerify(256)(poseidon_hasher.out, smt_leaf_value, smt_root, smt_siblings, 0);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ template ValidateCountry(nLevels) {
|
||||
for (var i = 0; i < 6; i++) {
|
||||
poseidon_hasher.inputs[i] <== host_user[i];
|
||||
}
|
||||
poseidon_hasher.dummy <== 0;
|
||||
|
||||
SMTVerify(nLevels)(poseidon_hasher.out, smt_leaf_value, smt_root, smt_siblings, 0);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ template PassportVerifier(signatureAlgorithm, n, k, MAX_ECONTENT_LEN, MAX_SIGNED
|
||||
signal input pubKey[kScaled];
|
||||
signal input signature[kScaled];
|
||||
|
||||
signal input dummy;
|
||||
|
||||
// compute hash of DG1
|
||||
signal dg1Bits[93 * 8];
|
||||
@@ -41,7 +40,7 @@ template PassportVerifier(signatureAlgorithm, n, k, MAX_ECONTENT_LEN, MAX_SIGNED
|
||||
}
|
||||
}
|
||||
|
||||
signal dg1Sha[HASH_LEN_BITS] <== ShaHashBits(93 * 8, HASH_LEN_BITS)(dg1Bits, 0);
|
||||
signal dg1Sha[HASH_LEN_BITS] <== ShaHashBits(93 * 8, HASH_LEN_BITS)(dg1Bits);
|
||||
|
||||
|
||||
component dg1ShaBytes[HASH_LEN_BYTES];
|
||||
@@ -78,6 +77,6 @@ template PassportVerifier(signatureAlgorithm, n, k, MAX_ECONTENT_LEN, MAX_SIGNED
|
||||
|
||||
signal signedAttrSha[HASH_LEN_BITS] <== ShaBytesDynamic(HASH_LEN_BITS, MAX_SIGNED_ATTR_LEN)(signed_attr, signed_attr_padded_length);
|
||||
|
||||
SignatureVerifier(signatureAlgorithm, n, k)(signedAttrSha, pubKey, signature, dummy);
|
||||
SignatureVerifier(signatureAlgorithm, n, k)(signedAttrSha, pubKey, signature);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,5 +59,4 @@ template Secp256r1Verifier(signatureAlgorithm, n, k) {
|
||||
ecdsa_verify.pubkey <== pubkey_xy;
|
||||
ecdsa_verify.signature <== [signature_r, signature_s];
|
||||
ecdsa_verify.hashed <== hash;
|
||||
ecdsa_verify.dummy <== 0;
|
||||
}
|
||||
@@ -19,7 +19,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
signal input pubKey[kScaled];
|
||||
signal input signature[kScaled];
|
||||
|
||||
signal input dummy;
|
||||
|
||||
var msg_len = (HASH_LEN_BITS + n) \ n;
|
||||
|
||||
@@ -35,7 +34,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
}
|
||||
rsa.modulus <== pubKey;
|
||||
rsa.signature <== signature;
|
||||
rsa.dummy <== dummy;
|
||||
|
||||
}
|
||||
if (signatureAlgorithm == 3) {
|
||||
@@ -48,7 +46,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
}
|
||||
rsa.modulus <== pubKey;
|
||||
rsa.signature <== signature;
|
||||
rsa.dummy <== dummy;
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -73,7 +70,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
rsaPssShaVerification.pubkey <== pubKey;
|
||||
rsaPssShaVerification.signature <== signature;
|
||||
rsaPssShaVerification.hashed <== hash; // send the raw hash
|
||||
rsaPssShaVerification.dummy <== 0;
|
||||
|
||||
}
|
||||
if (signatureAlgorithm == 7) {
|
||||
@@ -94,7 +90,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
}
|
||||
rsa.modulus <== pubKey;
|
||||
rsa.signature <== signature;
|
||||
rsa.dummy <== dummy;
|
||||
}
|
||||
if (signatureAlgorithm == 11) {
|
||||
component rsa = VerifyRsaPkcs1v1_5(signatureAlgorithm, n, k, 65537, 160);
|
||||
@@ -106,7 +101,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
}
|
||||
rsa.modulus <== pubKey;
|
||||
rsa.signature <== signature;
|
||||
rsa.dummy <== dummy;
|
||||
}
|
||||
if (signatureAlgorithm == 12) {
|
||||
|
||||
@@ -121,7 +115,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
}
|
||||
rsa.modulus <== pubKey;
|
||||
rsa.signature <== signature;
|
||||
rsa.dummy <== dummy;
|
||||
}
|
||||
if (signatureAlgorithm == 14) {
|
||||
component rsa = VerifyRsaPkcs1v1_5(signatureAlgorithm, n, k, 65537, 256);
|
||||
@@ -133,7 +126,6 @@ template SignatureVerifier(signatureAlgorithm, n, k) {
|
||||
}
|
||||
rsa.modulus <== pubKey;
|
||||
rsa.signature <== signature;
|
||||
rsa.dummy <== dummy;
|
||||
}
|
||||
if (signatureAlgorithm == 15) {
|
||||
|
||||
|
||||
@@ -14,12 +14,19 @@ import { max_cert_bytes } from '../../common/src/constants/constants';
|
||||
import { getCircuitName } from '../../common/src/utils/certificates/handleCertificate';
|
||||
|
||||
const sigAlgs = [
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '4096' },
|
||||
];
|
||||
|
||||
const fullSigAlgs = [
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha1', domainParameter: '65537', keyLength: '4096' },
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '4096' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '4096' },
|
||||
];
|
||||
|
||||
sigAlgs.forEach(({ sigAlg, hashFunction, domainParameter, keyLength }) => {
|
||||
// Use environment variable to determine which test suite to run
|
||||
const testSuite = process.env.FULL_TEST_SUITE === 'true' ? fullSigAlgs : sigAlgs;
|
||||
|
||||
testSuite.forEach(({ sigAlg, hashFunction, domainParameter, keyLength }) => {
|
||||
describe(`DSC chain certificate - ${hashFunction.toUpperCase()} ${sigAlg.toUpperCase()}`, function () {
|
||||
this.timeout(0); // Disable timeout
|
||||
let circuit;
|
||||
|
||||
@@ -12,20 +12,28 @@ import { SMT } from '@openpassport/zk-kit-smt';
|
||||
import namejson from '../../common/ofacdata/outputs/nameSMT.json';
|
||||
|
||||
const sigAlgs = [
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha1', domainParameter: '65537', keyLength: '2048' },
|
||||
// { sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '2048' },
|
||||
// { sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '2048' },
|
||||
// { sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '3072' },
|
||||
// { sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '4096' },
|
||||
// { sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '3', keyLength: '4096' },
|
||||
// { sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '3', keyLength: '3072' },
|
||||
// { sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '3', keyLength: '2048' },
|
||||
// { sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '3072' },
|
||||
// { sigAlg: 'ecdsa', hashFunction: 'sha256', domainParameter: 'secp256r1', keyLength: '256' },
|
||||
// { sigAlg: 'ecdsa', hashFunction: 'sha1', domainParameter: 'secp256r1', keyLength: '256' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '3', keyLength: '3072' },
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '3072' },
|
||||
{ sigAlg: 'ecdsa', hashFunction: 'sha1', domainParameter: 'secp256r1', keyLength: '256' },
|
||||
];
|
||||
|
||||
sigAlgs.forEach(({ sigAlg, hashFunction, domainParameter, keyLength }) => {
|
||||
const fullSigAlgs = [
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha1', domainParameter: '65537', keyLength: '2048' },
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '2048' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '2048' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '3072' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '65537', keyLength: '4096' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '3', keyLength: '4096' },
|
||||
{ sigAlg: 'rsapss', hashFunction: 'sha256', domainParameter: '3', keyLength: '3072' },
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '3', keyLength: '2048' },
|
||||
{ sigAlg: 'rsa', hashFunction: 'sha256', domainParameter: '65537', keyLength: '3072' },
|
||||
{ sigAlg: 'ecdsa', hashFunction: 'sha256', domainParameter: 'secp256r1', keyLength: '256' },
|
||||
{ sigAlg: 'ecdsa', hashFunction: 'sha1', domainParameter: 'secp256r1', keyLength: '256' },
|
||||
];
|
||||
|
||||
const testSuite = process.env.FULL_TEST_SUITE === 'true' ? fullSigAlgs : sigAlgs;
|
||||
|
||||
testSuite.forEach(({ sigAlg, hashFunction, domainParameter, keyLength }) => {
|
||||
describe(`Prove - ${hashFunction.toUpperCase()} ${sigAlg.toUpperCase()} ${domainParameter} ${keyLength}`, function () {
|
||||
this.timeout(0);
|
||||
let circuit: any;
|
||||
|
||||
@@ -6,13 +6,13 @@ import { SignatureAlgorithm } from '../../../common/src/utils/types';
|
||||
|
||||
describe('VerifyRsaPkcs1v1_5 Circuit Test', function () {
|
||||
this.timeout(0);
|
||||
|
||||
/** Some tests are disabled to avoid overloading the CI/CD pipeline - the commented rsa verifications will however be tested in prove.test.ts and dsc.test.ts **/
|
||||
const rsaAlgorithms: SignatureAlgorithm[] = [
|
||||
'rsa_sha1_65537_2048',
|
||||
'rsa_sha256_65537_2048',
|
||||
// 'rsa_sha1_65537_2048',
|
||||
// 'rsa_sha256_65537_2048',
|
||||
'rsa_sha256_3_2048',
|
||||
'rsa_sha256_65537_3072',
|
||||
'rsa_sha256_65537_4096',
|
||||
// 'rsa_sha256_65537_3072',
|
||||
// 'rsa_sha256_65537_4096',
|
||||
'rsa_sha512_65537_4096',
|
||||
];
|
||||
|
||||
|
||||
@@ -137,7 +137,6 @@ export function generateCircuitInputsDSC(
|
||||
|
||||
}
|
||||
|
||||
const dummy = 0;
|
||||
|
||||
return {
|
||||
signature_algorithm: `${signatureAlgorithm}_${curve || exponent}_${hashFunction}_${4096}`,
|
||||
|
||||
@@ -246,7 +246,6 @@ export function generateCircuitInputsProve(
|
||||
siblings: smt_siblings,
|
||||
} = generateSMTProof(name_smt, name_leaf);
|
||||
|
||||
const dummy = 0;
|
||||
|
||||
return {
|
||||
selector_mode: formatInput(selector_mode),
|
||||
|
||||
Reference in New Issue
Block a user