From 98fd87ee9bd4db1afcded474f5623e0ad0924c83 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Thu, 1 Dec 2022 18:33:43 -0800 Subject: [PATCH] Android: Add very basic Curve25519 benchmarks --- .gitignore | 5 +-- java/android/benchmarks/build.gradle | 38 ++++++++++++++++ .../src/androidTest/AndroidManifest.xml | 4 ++ .../src/androidTest/java/ECCBenchmark.java | 43 +++++++++++++++++++ .../benchmarks/src/main/AndroidManifest.xml | 2 + java/gradle.properties | 1 + java/settings.gradle | 2 +- 7 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 java/android/benchmarks/build.gradle create mode 100644 java/android/benchmarks/src/androidTest/AndroidManifest.xml create mode 100644 java/android/benchmarks/src/androidTest/java/ECCBenchmark.java create mode 100644 java/android/benchmarks/src/main/AndroidManifest.xml diff --git a/.gitignore b/.gitignore index 10aadbcb..1ac9212d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,10 +15,7 @@ \#*\# .\#* -java/build -java/android/build/ -java/client/build -java/server/build +java/**/build java/.gradle java/local.properties java/android/src/main/jniLibs diff --git a/java/android/benchmarks/build.gradle b/java/android/benchmarks/build.gradle new file mode 100644 index 00000000..2875d9b8 --- /dev/null +++ b/java/android/benchmarks/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'com.android.library' version '7.0.0' + id 'androidx.benchmark' version '1.1.1' +} + +repositories { + google() + mavenCentral() + mavenLocal() +} + +android { + compileSdkVersion 31 + + defaultConfig { + minSdkVersion 19 + targetSdkVersion 30 + multiDexEnabled true + } + + testBuildType "release" + + compileOptions { + coreLibraryDesugaringEnabled true + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + namespace "org.signal.libsignal.benchmarks" +} + +dependencies { + androidTestImplementation "androidx.test:runner:1.4.0" + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.benchmark:benchmark-junit4:1.1.1' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' + androidTestImplementation project(':android') +} diff --git a/java/android/benchmarks/src/androidTest/AndroidManifest.xml b/java/android/benchmarks/src/androidTest/AndroidManifest.xml new file mode 100644 index 00000000..af7df5ce --- /dev/null +++ b/java/android/benchmarks/src/androidTest/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + diff --git a/java/android/benchmarks/src/androidTest/java/ECCBenchmark.java b/java/android/benchmarks/src/androidTest/java/ECCBenchmark.java new file mode 100644 index 00000000..71326387 --- /dev/null +++ b/java/android/benchmarks/src/androidTest/java/ECCBenchmark.java @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2022 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +import org.signal.libsignal.protocol.ecc.*; + +import androidx.benchmark.BenchmarkState; +import androidx.benchmark.junit4.BenchmarkRule; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class ECCBenchmark { + @Rule + public final BenchmarkRule benchmarkRule = new BenchmarkRule(); + + private final ECKeyPair alicePair = Curve.generateKeyPair(); + private final ECKeyPair bobPair = Curve.generateKeyPair(); + private final byte[] arbitraryData = new byte[] { 0x53, 0x69, 0x67, 0x6E, 0x61, 0x6C }; + + @Test + public void benchmarkKeyAgreement() { + final BenchmarkState state = benchmarkRule.getState(); + + while (state.keepRunning()) { + alicePair.getPrivateKey().calculateAgreement(bobPair.getPublicKey()); + } + } + + @Test + public void benchmarkSignature() { + final BenchmarkState state = benchmarkRule.getState(); + + while (state.keepRunning()) { + final byte[] signature = alicePair.getPrivateKey().calculateSignature(arbitraryData); + alicePair.getPublicKey().verifySignature(arbitraryData, signature); + } + } +} diff --git a/java/android/benchmarks/src/main/AndroidManifest.xml b/java/android/benchmarks/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a2f47b60 --- /dev/null +++ b/java/android/benchmarks/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/java/gradle.properties b/java/gradle.properties index 2d8d1e4d..432d063a 100644 --- a/java/gradle.properties +++ b/java/gradle.properties @@ -1 +1,2 @@ +android.enableAdditionalTestOutput=true android.useAndroidX=true \ No newline at end of file diff --git a/java/settings.gradle b/java/settings.gradle index f6414646..74859238 100644 --- a/java/settings.gradle +++ b/java/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { include ':client', ':server' if (JavaVersion.current().isJava11Compatible()) { - include ':android' + include ':android', ':android:benchmarks' } else if (gradle.startParameter.getTaskNames().any { name -> name.contains('android:') }) { throw new GradleException("building for Android requires JDK 11 or newer") } else if (gradle.startParameter.getTaskNames().any { name -> name.lastIndexOf(':') <= 0 }) {