Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 29 additions & 5 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ on:

jobs:
ci:
runs-on: ubuntu-latest
permissions:
packages: write
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand All @@ -19,14 +20,37 @@ jobs:
java-version: |
8
22
25
cache: maven

- name: Run Maven with Java 8
env:
JAVA_HOME: ${{ env.JAVA_HOME_8_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile test
run: mvn -B compile
- name: Run Maven with Java 22
env:
JAVA_HOME: ${{ env.JAVA_HOME_22_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B package
run: mvn -B compile
- name: Run Maven with Java 25
env:
JAVA_HOME: ${{ env.JAVA_HOME_25_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile

- name: Run test on Java 8
env:
JAVA_HOME: ${{ env.JAVA_HOME_8_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B verify
- name: Run test on Java 22
env:
JAVA_HOME: ${{ env.JAVA_HOME_22_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B verify
- name: Run Maven with Java 25
env:
JAVA_HOME: ${{ env.JAVA_HOME_25_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B verify
20 changes: 18 additions & 2 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,10 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 8
java-version: |
8
22
25
cache: maven

# Initializes the CodeQL tools for scanning.
Expand All @@ -62,8 +65,21 @@ jobs:
run: make -C src/native

- if: matrix.language == 'java'
name: Build Java library
name: Build with Java 8
env:
JAVA_HOME: ${{ env.JAVA_HOME_8_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile
- if: matrix.language == 'java'
name: Build with Java 22
env:
JAVA_HOME: ${{ env.JAVA_HOME_22_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile
- if: matrix.language == 'java'
name: Build with Java 25
env:
JAVA_HOME: ${{ env.JAVA_HOME_25_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile

Expand Down
63 changes: 57 additions & 6 deletions .github/workflows/push-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ on:
branches: [master]

jobs:
snapshot-deploy:
runs-on: ubuntu-latest
permissions:
packages: write
check:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand All @@ -19,14 +20,64 @@ jobs:
java-version: |
8
22
25
cache: maven
- name: Run Maven with Java 8
env:
JAVA_HOME: ${{ env.JAVA_HOME_8_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B -DskipTests compile
run: mvn -B compile
- name: Run Maven with Java 22
env:
JAVA_HOME: ${{ env.JAVA_HOME_22_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B -DskipTests deploy
run: mvn -B compile
- name: Run Maven with Java 25
env:
JAVA_HOME: ${{ env.JAVA_HOME_25_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile

- name: Run test on Java 8
env:
JAVA_HOME: ${{ env.JAVA_HOME_8_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B verify
- name: Run test on Java 22
env:
JAVA_HOME: ${{ env.JAVA_HOME_22_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B verify
- name: Run test on Java 25
env:
JAVA_HOME: ${{ env.JAVA_HOME_25_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B verify

- name: Upload source tree
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v6
with:
name: source-tree
path: ${{ github.workspace }}

snapshot-deploy:
needs: [check]
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Download source tree
uses: actions/download-artifact@v7
with:
name: source-tree
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 25
cache: maven
- name: Deploy
env:
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B deploy
8 changes: 7 additions & 1 deletion .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,20 @@ jobs:
java-version: |
8
22
25
cache: maven
- name: Run Maven with Java 8
env:
JAVA_HOME: ${{ env.JAVA_HOME_8_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile test
run: mvn -B compile
- name: Run Maven with Java 22
env:
JAVA_HOME: ${{ env.JAVA_HOME_22_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B compile
- name: Deploy
env:
JAVA_HOME: ${{ env.JAVA_HOME_25_X64 }}
GITHUB_TOKEN: ${{ github.token }}
run: mvn -B deploy
19 changes: 17 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,37 @@ NIST SP 800-90A~Cは [JEP 273: DRBG-Based SecureRandom Implementations](http:/

JDK 22 以降の場合は Foreign Function & Memory API を用いた、RDRAND / RDSEED 各命令のダイレクト呼び出しをサポートします。これは Linux だけでなく Windows でも動作します。

JDK 25 以降の場合は JVMCI を用いた RDRAND / RDSEED の呼び出しもサポートします。これも Windows でも動作しますが利用時には Java 起動オプションの設定が必要です。 `java` 起動引数に `@jvmci.opts` のように [jvmci.opts](jvmci.opts) またはその記述内容を設定する必要があります。

> [!TIP]
> JVMCI の実装には [ffmasm](https://github.com/YaSuenag/ffmasm) 付属の [jvmci-adapter](https://github.com/YaSuenag/ffmasm/packages/2776023) を利用しています。

> [!NOTE]
> jvmci.opts には Unnamed Module の設定が記述されています。名前付きモジュールで HWRand を利用する場合は `jdk.internal.vm.ci` のエクスポート先を `com.yasuenag.ffmasmtools.jvmci` に設定してください。

# ビルド方法

```
JAVA_HOME=/path/to/jdk8 mvn compile test
JAVA_HOME=/path/to/jdk22 mvn package
JAVA_HOME=/path/to/jdk8 mvn compile
JAVA_HOME=/path/to/jdk22 mvn compile
JAVA_HOME=/path/to/jdk25 mvn compile
JAVA_HOME=/path/to/jdk25 mvn package
```

> [!TIP]
> テストは各 JDK バージョンで `mvn verify` を行うことで実施できます。

# 利用方法

* [SecureRandom#getInstance(String)](http://docs.oracle.com/javase/jp/8/docs/api/java/security/SecureRandom.html#getInstance-java.lang.String-) にそれぞれの引数を与えてインスタンスを取得してください。
* RDRAND(NIST SP 800-90A)
* X86RdRand
* FFMX86RdRand
* JVMCIX86RdRand
* RDSEED(NIST SP 800-90B/C)
* X86RdSeed
* FFMX86RdSeed
* JVMCIX86RdSeed
* 具体的な利用方法については [テストコード](test/src/main/java/com/yasuenag/hwrand/test/random/Test.java) もご覧ください。

# 注意
Expand Down
6 changes: 3 additions & 3 deletions benchmark/README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
HWRandベンチマーク
===

NativePRNG、DRBG、X86RdRand、X86RdSeed、FFMX86RdRand、FFMX86RdSeed のパフォーマンスをJMHで測定します。シングルスレッド性能と100スレッド同時実行の2パターンを測定します。
NativePRNG、DRBG、X86RdRand、X86RdSeed、FFMX86RdRand、FFMX86RdSeed、JVMCIX86RdRand、JVMCIX86RdSeed のパフォーマンスをJMHで測定します。シングルスレッド性能と100スレッド同時実行の2パターンを測定します。

# 必要なもの

* JDK 22
* JDK 25
* Maven
* HWRand
* **maven installされている必要あり**
Expand All @@ -21,4 +21,4 @@ mvn exec:exec
# 注意

* -Xmxで8GB設定しています
* ベンチマーク内部でEpsilon GCを設定しています
* すべての起動オプションは [RandomBenchmark.java](src/main/java/com/yasuenag/hwrand/benchmark/RandomBenchmark.java) の `@Fork` 内の `jvmArgsAppend` をご確認ください
19 changes: 10 additions & 9 deletions benchmark/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
<groupId>com.yasuenag</groupId>
<artifactId>hwrand-benchmark</artifactId>
<packaging>jar</packaging>
<version>1.2.0</version>
<version>1.3.0</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
<maven.compiler.source>25</maven.compiler.source>
<maven.compiler.target>25</maven.compiler.target>
<jmh.version>1.37</jmh.version>
</properties>

Expand All @@ -22,12 +22,6 @@
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.yasuenag</groupId>
<artifactId>hwrand</artifactId>
Expand All @@ -45,6 +39,13 @@
<compilerArgs>
<arg>-Xlint:all</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,19 @@

@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@Fork(value = 1, jvmArgsAppend = {"-Xms8g", "-Xmx8g", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseEpsilonGC", "-XX:+AlwaysPreTouch", "--enable-native-access=ALL-UNNAMED"})
@Fork(value = 1, jvmArgsAppend = {
"-Xms8g",
"-Xmx8g",
"-XX:+AlwaysPreTouch",
"-XX:+UnlockExperimentalVMOptions",
"-XX:+EnableJVMCI",
"--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED",
"--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED",
"--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED",
"--add-exports=jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED",
"--add-exports=jdk.internal.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED",
"--enable-native-access=ALL-UNNAMED"
})
@Warmup(iterations = 1, time = 3, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 3, time = 10, timeUnit = TimeUnit.SECONDS)
public class RandomBenchmark{
Expand All @@ -20,7 +32,8 @@ public class RandomBenchmark{
@Param({/* "NativePRNGBlocking", */
"NativePRNG", "DRBG", // built-in
"X86RdRand", "X86RdSeed", // JNI
"FFMX86RdRand", "FFMX86RdSeed" // FFM
"FFMX86RdRand", "FFMX86RdSeed", // FFM
"JVMCIX86RdRand", "JVMCIX86RdSeed" // JVMCI
})
private String algo;

Expand Down
8 changes: 8 additions & 0 deletions jvmci.opts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
--enable-native-access=ALL-UNNAMED
-XX:+UnlockExperimentalVMOptions
-XX:+EnableJVMCI
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED
Loading
Loading