From 77a5bec6ba179a18249c71e545a0be9b3d763063 Mon Sep 17 00:00:00 2001 From: KimlikDAO-bot Date: Sat, 18 May 2024 13:40:00 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=A5=A3=20Add=20serialization=20methods=20?= =?UTF-8?q?to=20provable=20`HumanIDv1`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib | 2 +- mina/HumanIDv1.ts | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib b/lib index 7993eb0..7c52fe1 160000 --- a/lib +++ b/lib @@ -1 +1 @@ -Subproject commit 7993eb0dc44670383bc2b3796ee84d32740375e6 +Subproject commit 7c52fe15bd66641499bd4c47259dce1e972b509c diff --git a/mina/HumanIDv1.ts b/mina/HumanIDv1.ts index c289585..51a92f0 100644 --- a/mina/HumanIDv1.ts +++ b/mina/HumanIDv1.ts @@ -11,13 +11,52 @@ import { state, } from "o1js"; +const Uint8denHexe: string[] = Array(255); +for (let /** number */ i = 0; i < 256; ++i) + Uint8denHexe[i] = i.toString(16).padStart(2, "0"); + +const hex = (buff: Uint8Array) => { + /** @const {!Array} */ + const ikililer = new Array(buff.length); + for (let /** number */ i = 0; i < buff.length; ++i) + ikililer[i] = Uint8denHexe[buff[i]]; + return ikililer.join(""); +} + +const uint8ArrayBEtoBigInt = (bytes: Uint8Array) => BigInt("0x" + hex(bytes)); + +const readPublicKey = (bytes: Uint8Array) => PublicKey.from({ + x: uint8ArrayBEtoBigInt(bytes.subarray(0, 32)), + isOdd: !!bytes[32] +}); + +const readField = (bytes: Uint8Array) => Field(uint8ArrayBEtoBigInt(bytes.subarray(0, 32))); + +const readSignature = (bytes: Uint8Array) => new Signature( + readField(bytes), + readField(bytes.subarray(32)) +); + class HumanIDv1 extends Struct({ id: Field, commitmentR: Field, sig0: Signature, sig1: Signature, sig2: Signature, -}) { } +}) { + /** + * @param bytes Uint8Array of length 256, where each field is written in BE encoding. + */ + static fromBytes(bytes: Uint8Array) { + return new HumanIDv1({ + id: readField(bytes), + commitmentR: readField(bytes.subarray(32)), + sig0: readSignature(bytes.subarray(64)), + sig1: readSignature(bytes.subarray(128)), + sig2: readSignature(bytes.subarray(192)) + }) + } +} class HumanIDv1Witness extends MerkleWitness(33) { } @@ -94,5 +133,9 @@ export { KPassSigners, PerHumanIDv1Contract, authenticate, + readField, + readPublicKey, + readSignature, requireConsistent }; +