commit 0bbaafcd36ce68f95faee0b91738a169848c7a90
parent e2fe2d6db16b422ee6d69ef03f1393e1f0f42749
Author: Florian Dold <florian@dold.me>
Date: Thu, 7 Oct 2021 15:09:40 +0200
anastasis: implement user id derivation
Diffstat:
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/packages/anastasis-core/src/crypto.test.ts b/packages/anastasis-core/src/crypto.test.ts
@@ -1,4 +1,5 @@
import test from "ava";
+import { userIdentifierDerive } from "./crypto.js";
// Vector generated with taler-anastasis-tvg
const userIdVector = {
@@ -12,5 +13,9 @@ const userIdVector = {
};
test("user ID derivation", async (t) => {
- t.fail();
+ const res = await userIdentifierDerive(
+ userIdVector.input_id_data,
+ userIdVector.input_server_salt,
+ );
+ t.is(res, userIdVector.output_id);
});
diff --git a/packages/anastasis-core/src/crypto.ts b/packages/anastasis-core/src/crypto.ts
@@ -1,10 +1,27 @@
+import {
+ canonicalJson,
+ decodeCrock,
+ encodeCrock,
+ stringToBytes,
+} from "@gnu-taler/taler-util";
import { argon2id } from "hash-wasm";
-async function userIdentifierDerive(
+export async function userIdentifierDerive(
idData: any,
serverSalt: string,
): Promise<string> {
- throw Error("not implemented");
+ const canonIdData = canonicalJson(idData);
+ const hashInput = stringToBytes(canonIdData);
+ const result = await argon2id({
+ hashLength: 64,
+ iterations: 3,
+ memorySize: 1024 /* kibibytes */,
+ parallelism: 1,
+ password: hashInput,
+ salt: decodeCrock(serverSalt),
+ outputType: "binary",
+ });
+ return encodeCrock(result);
}
// interface Keypair {