--- /dev/null
+package org.asamk.signal.manager.util;
+
+import org.bouncycastle.crypto.generators.Argon2BytesGenerator;
+import org.bouncycastle.crypto.params.Argon2Parameters;
+import org.whispersystems.signalservice.api.KeyBackupService;
+import org.whispersystems.signalservice.api.kbs.HashedPin;
+import org.whispersystems.signalservice.internal.registrationpin.PinHasher;
+
+public final class PinHashing {
+
+ private PinHashing() {
+ }
+
+ public static HashedPin hashPin(String pin, KeyBackupService.HashSession hashSession) {
+ final Argon2Parameters params = new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id).withParallelism(1)
+ .withIterations(32)
+ .withVersion(13)
+ .withMemoryAsKB(16 * 1024)
+ .withSalt(hashSession.hashSalt())
+ .build();
+
+ final Argon2BytesGenerator generator = new Argon2BytesGenerator();
+ generator.init(params);
+
+ return PinHasher.hashPin(PinHasher.normalize(pin), password -> {
+ byte[] output = new byte[64];
+ generator.generateBytes(password, output);
+ return output;
+ });
+ }
+}