From adaf28a28ce66c363e8147c66dd202fd579c5682 Mon Sep 17 00:00:00 2001 From: Ajitomi Daisuke Date: Sun, 10 Nov 2024 15:34:38 +0900 Subject: [PATCH 1/2] ml-kem: initial commit. --- deno.json | 34 +- deno.lock | 5 + npm/package.json | 1 + packages/ml-kem/CHANGES.md | 1 + packages/ml-kem/LICENSE | 20 + packages/ml-kem/README.md | 317 ++++++ packages/ml-kem/deno.json | 58 + packages/ml-kem/dnt.ts | 82 ++ packages/ml-kem/mod.ts | 1 + packages/ml-kem/samples/deno/deno.json | 5 + packages/ml-kem/samples/deno/main.ts | 37 + packages/ml-kem/samples/node/app.js | 34 + packages/ml-kem/samples/node/package.json | 16 + packages/ml-kem/src/mlKem.ts | 401 +++++++ packages/ml-kem/test/mlKem.test.ts | 998 ++++++++++++++++++ .../test/runtimes/browsers/ml-kem.spec.ts | 11 + .../test/runtimes/browsers/package-lock.json | 75 ++ .../test/runtimes/browsers/package.json | 5 + .../test/runtimes/browsers/pages/index.html | 107 ++ .../test/runtimes/browsers/pages/src/.gitkeep | 0 .../runtimes/browsers/playwright.config.ts | 21 + packages/ml-kem/test/runtimes/bun/.gitignore | 175 +++ packages/ml-kem/test/runtimes/bun/.npmrc | 1 + packages/ml-kem/test/runtimes/bun/README.md | 16 + packages/ml-kem/test/runtimes/bun/bun.lockb | Bin 0 -> 3792 bytes .../ml-kem/test/runtimes/bun/ml-kem.spec.ts | 93 ++ .../ml-kem/test/runtimes/bun/package.json | 15 + .../test/runtimes/cloudflare/ml-kem.spec.ts | 20 + .../test/runtimes/cloudflare/package.json | 23 + .../test/runtimes/cloudflare/src/index.ts | 7 + .../test/runtimes/cloudflare/src/server.ts | 102 ++ .../test/runtimes/cloudflare/tsconfig.json | 106 ++ .../runtimes/cloudflare/vitest.config.mts | 11 + .../test/runtimes/cloudflare/wrangler.toml | 108 ++ packages/ml-kem/tsconfig.json | 16 + test/vectors/kat/kat_MLKEM_1024.rsp | 110 ++ test/vectors/kat/kat_MLKEM_512.rsp | 110 ++ test/vectors/kat/kat_MLKEM_768.rsp | 110 ++ 38 files changed, 3241 insertions(+), 11 deletions(-) create mode 100644 packages/ml-kem/CHANGES.md create mode 100644 packages/ml-kem/LICENSE create mode 100644 packages/ml-kem/README.md create mode 100644 packages/ml-kem/deno.json create mode 100644 packages/ml-kem/dnt.ts create mode 100644 packages/ml-kem/mod.ts create mode 100644 packages/ml-kem/samples/deno/deno.json create mode 100644 packages/ml-kem/samples/deno/main.ts create mode 100644 packages/ml-kem/samples/node/app.js create mode 100644 packages/ml-kem/samples/node/package.json create mode 100644 packages/ml-kem/src/mlKem.ts create mode 100644 packages/ml-kem/test/mlKem.test.ts create mode 100644 packages/ml-kem/test/runtimes/browsers/ml-kem.spec.ts create mode 100644 packages/ml-kem/test/runtimes/browsers/package-lock.json create mode 100644 packages/ml-kem/test/runtimes/browsers/package.json create mode 100644 packages/ml-kem/test/runtimes/browsers/pages/index.html create mode 100644 packages/ml-kem/test/runtimes/browsers/pages/src/.gitkeep create mode 100644 packages/ml-kem/test/runtimes/browsers/playwright.config.ts create mode 100644 packages/ml-kem/test/runtimes/bun/.gitignore create mode 100644 packages/ml-kem/test/runtimes/bun/.npmrc create mode 100644 packages/ml-kem/test/runtimes/bun/README.md create mode 100755 packages/ml-kem/test/runtimes/bun/bun.lockb create mode 100644 packages/ml-kem/test/runtimes/bun/ml-kem.spec.ts create mode 100644 packages/ml-kem/test/runtimes/bun/package.json create mode 100644 packages/ml-kem/test/runtimes/cloudflare/ml-kem.spec.ts create mode 100644 packages/ml-kem/test/runtimes/cloudflare/package.json create mode 100644 packages/ml-kem/test/runtimes/cloudflare/src/index.ts create mode 100644 packages/ml-kem/test/runtimes/cloudflare/src/server.ts create mode 100644 packages/ml-kem/test/runtimes/cloudflare/tsconfig.json create mode 100644 packages/ml-kem/test/runtimes/cloudflare/vitest.config.mts create mode 100644 packages/ml-kem/test/runtimes/cloudflare/wrangler.toml create mode 100644 packages/ml-kem/tsconfig.json create mode 100644 test/vectors/kat/kat_MLKEM_1024.rsp create mode 100644 test/vectors/kat/kat_MLKEM_512.rsp create mode 100644 test/vectors/kat/kat_MLKEM_768.rsp diff --git a/deno.json b/deno.json index 2d4fc2dc6..ae369c7c5 100644 --- a/deno.json +++ b/deno.json @@ -9,6 +9,7 @@ "./packages/hybridkem-x25519-kyber768", "./packages/hybridkem-x-wing", "./packages/hpke-js", + "./packages/ml-kem", "./packages/core/samples/deno", "./packages/chacha20poly1305/samples/deno", "./packages/dhkem-x25519/samples/deno", @@ -16,7 +17,8 @@ "./packages/dhkem-secp256k1/samples/deno", "./packages/hybridkem-x25519-kyber768/samples/deno", "./packages/hybridkem-x-wing/samples/deno", - "./packages/hpke-js/samples/deno" + "./packages/hpke-js/samples/deno", + "./packages/ml-kem/samples/deno" ], "fmt": { "exclude": [ @@ -58,7 +60,8 @@ "test:hybridkem-x25519-kyber768": "cd packages/hybridkem-x25519-kyber768 && deno task test", "test:hybridkem-x-wing": "cd packages/hybridkem-x-wing && deno task test", "test:hpke-js": "cd packages/hpke-js && deno task test", - "test:cloudflare": "deno task test:cloudflare:core && deno task test:cloudflare:chacha20poly1305 && deno task test:cloudflare:dhkem-x25519 && deno task test:cloudflare:dhkem-x448 && deno task test:cloudflare:dhkem-secp256k1 && deno task test:cloudflare:hybridkem-x25519-kyber768 && deno task test:cloudflare:hybridkem-x-wing && deno task test:cloudflare:hpke-js", + "test:ml-kem": "cd packages/ml-kem && deno task test", + "test:cloudflare": "deno task test:cloudflare:core && deno task test:cloudflare:chacha20poly1305 && deno task test:cloudflare:dhkem-x25519 && deno task test:cloudflare:dhkem-x448 && deno task test:cloudflare:dhkem-secp256k1 && deno task test:cloudflare:hybridkem-x25519-kyber768 && deno task test:cloudflare:hybridkem-x-wing && deno task test:cloudflare:hpke-js && deno task test:cloudflare:ml-kem", "test:cloudflare:core": "cd npm && npm run test -w test/core/runtimes/cloudflare", "test:cloudflare:chacha20poly1305": "cd npm && npm run test -w test/chacha20poly1305/runtimes/cloudflare", "test:cloudflare:dhkem-x25519": "cd npm && npm run test -w test/dhkem-x25519/runtimes/cloudflare", @@ -67,7 +70,8 @@ "test:cloudflare:hybridkem-x25519-kyber768": "cd npm && npm run test -w test/hybridkem-x25519-kyber768/runtimes/cloudflare", "test:cloudflare:hybridkem-x-wing": "cd npm && npm run test -w test/hybridkem-x-wing/runtimes/cloudflare", "test:cloudflare:hpke-js": "cd npm && npm run test -w test/hpke-js/runtimes/cloudflare", - "test:bun": "deno task test:bun:core && deno task test:bun:chacha20poly1305 && deno task test:bun:dhkem-x25519 && deno task test:bun:dhkem-x448 && deno task test:bun:dhkem-secp256k1 && deno task test:bun:hybridkem-x25519-kyber768 && deno task test:bun:hybridkem-x-wing && deno task test:bun:hpke-js", + "test:cloudflare:ml-kem": "cd npm && npm run test -w test/ml-kem/runtimes/cloudflare", + "test:bun": "deno task test:bun:core && deno task test:bun:chacha20poly1305 && deno task test:bun:dhkem-x25519 && deno task test:bun:dhkem-x448 && deno task test:bun:dhkem-secp256k1 && deno task test:bun:hybridkem-x25519-kyber768 && deno task test:bun:hybridkem-x-wing && deno task test:bun:hpke-js && deno task test:bun:ml-kem", "test:bun:core": "cd packages/core && deno task test:bun", "test:bun:chacha20poly1305": "cd packages/chacha20poly1305 && deno task test:bun", "test:bun:dhkem-x25519": "cd packages/dhkem-x25519 && deno task test:bun", @@ -76,9 +80,10 @@ "test:bun:hybridkem-x25519-kyber768": "cd packages/hybridkem-x25519-kyber768 && deno task test:bun", "test:bun:hybridkem-x-wing": "cd packages/hybridkem-x-wing && deno task test:bun", "test:bun:hpke-js": "cd packages/hpke-js && deno task test:bun", + "test:bun:ml-kem": "cd packages/ml-kem && deno task test:bun", "cov": "deno coverage ./coverage --lcov --exclude='test'", "npm": "deno task dnt && deno task npm-link && deno task npm-pack && cd npm && npm install", - "dnt": "deno task dnt:common && deno task dnt:core && deno task dnt:chacha20poly1305 && deno task dnt:dhkem-x25519 && deno task dnt:dhkem-x448 && deno task dnt:dhkem-secp256k1 && deno task dnt:hybridkem-x25519-kyber768 && deno task dnt:hybridkem-x-wing && deno task dnt:hpke-js", + "dnt": "deno task dnt:common && deno task dnt:core && deno task dnt:chacha20poly1305 && deno task dnt:dhkem-x25519 && deno task dnt:dhkem-x448 && deno task dnt:dhkem-secp256k1 && deno task dnt:hybridkem-x25519-kyber768 && deno task dnt:hybridkem-x-wing && deno task dnt:hpke-js && deno task dnt:ml-kem", "dnt:common": "cd packages/common && deno task dnt", "dnt:core": "cd packages/core && deno task dnt", "dnt:chacha20poly1305": "cd packages/chacha20poly1305 && deno task dnt", @@ -88,7 +93,8 @@ "dnt:hybridkem-x25519-kyber768": "cd packages/hybridkem-x25519-kyber768 && deno task dnt", "dnt:hybridkem-x-wing": "cd packages/hybridkem-x-wing && deno task dnt", "dnt:hpke-js": "cd packages/hpke-js && deno task dnt", - "npm-link": "deno task npm-link:common && deno task npm-link:core && deno task npm-link:chacha20poly1305 && deno task npm-link:dhkem-x25519 && deno task npm-link:dhkem-x448 && deno task npm-link:dhkem-secp256k1 && deno task npm-link:hybridkem-x25519-kyber768 && deno task npm-link:hybridkem-x-wing && deno task npm-link:hpke-js", + "dnt:ml-kem": "cd packages/ml-kem && deno task dnt", + "npm-link": "deno task npm-link:common && deno task npm-link:core && deno task npm-link:chacha20poly1305 && deno task npm-link:dhkem-x25519 && deno task npm-link:dhkem-x448 && deno task npm-link:dhkem-secp256k1 && deno task npm-link:hybridkem-x25519-kyber768 && deno task npm-link:hybridkem-x-wing && deno task npm-link:hpke-js && deno task npm-link:ml-kem", "npm-link:common": "cd npm/packages/common && npm link", "npm-link:core": "cd npm/packages/core && npm link", "npm-link:chacha20poly1305": "cd npm/packages/chacha20poly1305 && npm link", @@ -98,7 +104,8 @@ "npm-link:hybridkem-x25519-kyber768": "cd npm/packages/hybridkem-x25519-kyber768 && npm link", "npm-link:hybridkem-x-wing": "cd npm/packages/hybridkem-x-wing && npm link", "npm-link:hpke-js": "cd npm/packages/hpke-js && npm link", - "npm-pack": "deno task npm-pack:common && deno task npm-pack:core && deno task npm-pack:chacha20poly1305 && deno task npm-pack:dhkem-x25519 && deno task npm-pack:dhkem-x448 && deno task npm-pack:dhkem-secp256k1 && deno task npm-pack:hybridkem-x25519-kyber768 && deno task npm-pack:hybridkem-x-wing && deno task npm-pack:hpke-js", + "npm-link:ml-kem": "cd npm/packages/ml-kem && npm link", + "npm-pack": "deno task npm-pack:common && deno task npm-pack:core && deno task npm-pack:chacha20poly1305 && deno task npm-pack:dhkem-x25519 && deno task npm-pack:dhkem-x448 && deno task npm-pack:dhkem-secp256k1 && deno task npm-pack:hybridkem-x25519-kyber768 && deno task npm-pack:hybridkem-x-wing && deno task npm-pack:hpke-js && deno task npm-pack:ml-kem", "npm-pack:common": "cd npm/packages/common && npm pack --dry-run", "npm-pack:core": "cd npm/packages/core && npm pack --dry-run", "npm-pack:chacha20poly1305": "cd npm/packages/chacha20poly1305 && npm pack --dry-run", @@ -108,7 +115,8 @@ "npm-pack:hybridkem-x25519-kyber768": "cd npm/packages/hybridkem-x25519-kyber768 && npm pack --dry-run", "npm-pack:hybridkem-x-wing": "cd npm/packages/hybridkem-x-wing && npm pack --dry-run", "npm-pack:hpke-js": "cd npm/packages/hpke-js && npm pack --dry-run", - "bun-link": "deno task bun-link:common && deno task bun-link:core && deno task bun-link:chacha20poly1305 && deno task bun-link:dhkem-x25519 && deno task bun-link:dhkem-x448 && deno task bun-link:dhkem-secp256k1 && deno task bun-link:hybridkem-x25519-kyber768 && deno task bun-link:hybridkem-x-wing && deno task bun-link:hpke-js", + "npm-pack:ml-kem": "cd npm/packages/ml-kem && npm pack --dry-run", + "bun-link": "deno task bun-link:common && deno task bun-link:core && deno task bun-link:chacha20poly1305 && deno task bun-link:dhkem-x25519 && deno task bun-link:dhkem-x448 && deno task bun-link:dhkem-secp256k1 && deno task bun-link:hybridkem-x25519-kyber768 && deno task bun-link:hybridkem-x-wing && deno task bun-link:hpke-js && deno task bun-link:ml-kem", "bun-link:common": "cd npm/packages/common && bun link", "bun-link:core": "cd npm/packages/core && bun link", "bun-link:chacha20poly1305": "cd npm/packages/chacha20poly1305 && bun link", @@ -118,8 +126,9 @@ "bun-link:hybridkem-x25519-kyber768": "cd npm/packages/hybridkem-x25519-kyber768 && bun link", "bun-link:hybridkem-x-wing": "cd npm/packages/hybridkem-x-wing && bun link", "bun-link:hpke-js": "cd npm/packages/hpke-js && bun link", + "bun-link:ml-kem": "cd npm/packages/ml-kem && bun link", "sample": "deno task sample:deno && deno task sample:node", - "sample:deno": "deno task sample:deno:core && deno task sample:deno:chacha20poly1305 && deno task sample:deno:dhkem-x25519 && deno task sample:deno:dhkem-x448 && deno task sample:deno:dhkem-secp256k1 && deno task sample:deno:hybridkem-x25519-kyber768 && deno task sample:deno:hybridkem-x-wing && deno task sample:deno:hpke-js", + "sample:deno": "deno task sample:deno:core && deno task sample:deno:chacha20poly1305 && deno task sample:deno:dhkem-x25519 && deno task sample:deno:dhkem-x448 && deno task sample:deno:dhkem-secp256k1 && deno task sample:deno:hybridkem-x25519-kyber768 && deno task sample:deno:hybridkem-x-wing && deno task sample:deno:hpke-js && deno task sample:deno:ml-kem", "sample:deno:core": "cd packages/core && deno task sample:deno", "sample:deno:chacha20poly1305": "cd packages/chacha20poly1305 && deno task sample:deno", "sample:deno:dhkem-x25519": "cd packages/dhkem-x25519 && deno task sample:deno", @@ -128,7 +137,8 @@ "sample:deno:hybridkem-x25519-kyber768": "cd packages/hybridkem-x25519-kyber768 && deno task sample:deno", "sample:deno:hybridkem-x-wing": "cd packages/hybridkem-x-wing && deno task sample:deno", "sample:deno:hpke-js": "cd packages/hpke-js && deno task sample:deno", - "sample:node": "deno task sample:node:core && deno task sample:node:chacha20poly1305 && deno task sample:node:dhkem-x25519 && deno task sample:node:dhkem-x448 && deno task sample:node:dhkem-secp256k1 && deno task sample:node:hybridkem-x25519-kyber768 && deno task sample:node:hybridkem-x-wing && deno task sample:node:hpke-js", + "sample:deno:ml-kem": "cd packages/ml-kem && deno task sample:deno", + "sample:node": "deno task sample:node:core && deno task sample:node:chacha20poly1305 && deno task sample:node:dhkem-x25519 && deno task sample:node:dhkem-x448 && deno task sample:node:dhkem-secp256k1 && deno task sample:node:hybridkem-x25519-kyber768 && deno task sample:node:hybridkem-x-wing && deno task sample:node:hpke-js && deno task sample:node:ml-kem", "sample:node:core": "cd npm && npm run test -w samples/core", "sample:node:chacha20poly1305": "cd npm && npm run test -w samples/chacha20poly1305", "sample:node:dhkem-x25519": "cd npm && npm run test -w samples/dhkem-x25519", @@ -137,7 +147,8 @@ "sample:node:hybridkem-x25519-kyber768": "cd npm && npm run test -w samples/hybridkem-x25519-kyber768", "sample:node:hybridkem-x-wing": "cd npm && npm run test -w samples/hybridkem-x-wing", "sample:node:hpke-js": "cd npm && npm run test -w samples/hpke-js", - "update:cloudflare": "deno task update:cloudflare:core || deno task update:cloudflare:chacha20poly1305 || deno task update:cloudflare:dhkem-x25519 || deno task update:cloudflare:dhkem-x448 || deno task update:cloudflare:dhkem-secp256k1 || deno task update:cloudflare:hybridkem-x25519-kyber768 || deno task update:cloudflare:hybridkem-x-wing || deno task update:cloudflare:hpke-js", + "sample:node:ml-kem": "cd npm && npm run test -w samples/ml-kem", + "update:cloudflare": "deno task update:cloudflare:core || deno task update:cloudflare:chacha20poly1305 || deno task update:cloudflare:dhkem-x25519 || deno task update:cloudflare:dhkem-x448 || deno task update:cloudflare:dhkem-secp256k1 || deno task update:cloudflare:hybridkem-x25519-kyber768 || deno task update:cloudflare:hybridkem-x-wing || deno task update:cloudflare:hpke-js || deno task update:cloudflare:ml-kem", "update:cloudflare:core": "cd packages/core/test/runtimes/cloudflare && npm audit fix", "update:cloudflare:chacha20poly1305": "cd packages/chacha20poly1305/test/runtimes/cloudflare && npm audit fix", "update:cloudflare:dhkem-x25519": "cd packages/dhkem-x25519/test/runtimes/cloudflare && npm audit fix", @@ -145,6 +156,7 @@ "update:cloudflare:dhkem-secp256k1": "cd packages/dhkem-secp256k1/test/runtimes/cloudflare && npm audit fix", "update:cloudflare:hybridkem-x25519-kyber768": "cd packages/hybridkem-x25519-kyber768/test/runtimes/cloudflare && npm audit fix", "update:cloudflare:hybridkem-x-wing": "cd packages/hybridkem-x-wing/test/runtimes/cloudflare && npm audit fix", - "update:cloudflare:hpke-js": "cd packages/hpke-js/test/runtimes/cloudflare && npm audit fix" + "update:cloudflare:hpke-js": "cd packages/hpke-js/test/runtimes/cloudflare && npm audit fix", + "update:cloudflare:ml-kem": "cd packages/ml-kem/test/runtimes/cloudflare && npm audit fix" } } diff --git a/deno.lock b/deno.lock index b8d606a3c..e560f61b0 100644 --- a/deno.lock +++ b/deno.lock @@ -356,6 +356,11 @@ "dependencies": [ "npm:@noble/hashes@^1.5.0" ] + }, + "packages/ml-kem": { + "dependencies": [ + "jsr:@dajiaji/mlkem@^2.3.0" + ] } } } diff --git a/npm/package.json b/npm/package.json index dc9ce33b0..377bfa1ed 100644 --- a/npm/package.json +++ b/npm/package.json @@ -11,6 +11,7 @@ "packages/hybridkem-x25519-kyber768", "packages/hybridkem-x-wing", "packages/hpke-js", + "packages/ml-kem", "test/**/*/runtimes/cloudflare", "samples/**/*" ] diff --git a/packages/ml-kem/CHANGES.md b/packages/ml-kem/CHANGES.md new file mode 100644 index 000000000..b671f0bbc --- /dev/null +++ b/packages/ml-kem/CHANGES.md @@ -0,0 +1 @@ +# Changes diff --git a/packages/ml-kem/LICENSE b/packages/ml-kem/LICENSE new file mode 100644 index 000000000..95da3b7c7 --- /dev/null +++ b/packages/ml-kem/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2024 Ajitomi Daisuke + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/ml-kem/README.md b/packages/ml-kem/README.md new file mode 100644 index 000000000..96f6e954e --- /dev/null +++ b/packages/ml-kem/README.md @@ -0,0 +1,317 @@ +

@hpke/ml-kem

+ +
+JSR +
+ +
+A TypeScript Hybrid Public Key Encryption (HPKE) module extension for X-Wing: general-purpose hybrid post-quantum KEM. +
+

+ +
+ +Documentation: [jsr.io](https://jsr.io/@hpke/ml-kem/doc) | +[pages (only for the latest ver.)](https://dajiaji.github.io/hpke-js/ml-kem/docs/) + +
+ +An example of use: + +```ts +import { Aes256Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; +import { MlKem768 } from "@hpke/ml-kem"; // MlKem512 and MlKem1024 are also available. + +async function doHpke() { + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha256(), + aead: new Aes256Gcm(), + }); + + // NOTE: The following support for JWKs with the AKP key type is experimental. + // Please be aware that the specifications are subject to change without notice. + const jwkPub = { + kty: "AKP", + kid: "01", + alg: "X-Wing", + pub: + "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + key_ops: [], + }; + const pk = await suite.kem.importKey("jwk", jwkPub, true); + // In addition to importing keys from external sources, you can also generate keys as follows: + // const rkp = await suite.kem.generateKeyPair(); + // const rkp = await suite.kem.deriveKeyPair(random32bytesValue); + + const sender = await suite.createSenderContext({ recipientPublicKey: pk }); + + const jwkPriv = { + kty: "AKP", + kid: "01", + alg: "X-Wing", + priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + key_ops: ["deriveBits"], + }; + const sk = await suite.kem.importKey("jwk", jwkPriv, false); + const recipient = await suite.createRecipientContext({ + recipientKey: sk, + enc: sender.enc, + }); + const encrypted = await sender.seal( + new TextEncoder().encode("Hellow world!"), + ); + const pt = await recipient.open(encrypted); + + // Hello world! + console.log(new TextDecoder().decode(pt)); +} + +try { + doHpke(); +} catch (err: unknown) { + console.log("failed:", (err as Error).message); +} +``` + +## Index + +- [Installation](#installation) + - [Node.js](#nodejs) + - [Deno](#deno) + - [Web Browsers](#web-browsers) +- [Usage](#usage) +- [Contributing](#contributing) + +## Installation + +`@hpke/ml-kem` needs to be used with +[@hpke/core](https://github.com/dajiaji/hpke-js/blob/main/packages/core/README.md), +which can be installed in the same manner as desribed below. + +### Node.js + +You can install the package with npm, yarn or pnpm. + +```sh +# Using npm: +npm install @hpke/ml-kem +yarn add @hpke/ml-kem +pnpm install @hpke/ml-kem +# Using jsr: +npx jsr add @hpke/ml-kem +yarn dlx jsr add @hpke/ml-kem +pnpm dlx jsr add @@hpke/ml-kem +``` + +The above manner can be used with other JavaScript runtimes that support npm, +such as Cloudflare Workers and Bun. + +Then, you can use the module from code like this: + +```ts +import { Aes256Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; +import { MlKem768 } from "@hpke/ml-kem"; +``` + +### Deno + +For Deno, it is recommended to use the jsr.io registry. + +```sh +deno add jsr:@hpke/ml-kem +``` + +### Web Browsers + +Followings are how to use this module with typical CDNs. Other CDNs can be used +as well. + +Using esm.sh: + +```html + + + + + +``` + +Using unpkg: + +```html + + +``` + +## Usage + +This section shows some typical usage examples. + +### Node.js + +```js +import { Aes256Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; +import { MlKem768 } from "@hpke/ml-kem"; + +async function doHpke() { + // setup + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha256(), + aead: new Aes256Gcm(), + }); + + const rkp = await suite.kem.generateKeyPair(); + + // Note that the `ct` (ciphertext) resulting from X-Wing Encapsulate() is set to `sender.enc`. + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + + // encrypt + const encrypted = await sender.seal(new TextEncoder().encode("Hello world!")); + + const recipient = await suite.createRecipientContext({ + recipientKey: rkp.privateKey, + enc: sender.enc, // == `ct` (ciphertext) in the context of X-Wing + }); + + // decrypt + const pt = await recipient.open(encrypted); + + // Hello world! + console.log(new TextDecoder().decode(pt)); +} + +try { + doHpke(); +} catch (err) { + console.log("failed:", err.message); +} +``` + +### Deno + +```ts +import { Aes256Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; +import { MlKem768 } from "@hpke/ml-kem"; + +async function doHpke() { + // setup + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha256(), + aead: new Aes256Gcm(), + }); + + const rkp = await suite.kem.generateKeyPair(); + + // Note that the `ct` (ciphertext) resulting from X-Wing::Encapsulate() is set to `sender.enc`. + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + + // encrypt + const encrypted = await sender.seal(new TextEncoder().encode("Hello world!")); + + const recipient = await suite.createRecipientContext({ + recipientKey: rkp.privateKey, + enc: sender.enc, // == `ct` (ciphertext) in the context of X-Wing + }); + + // decrypt + const pt = await recipient.open(encrypted); + + // Hello world! + console.log(new TextDecoder().decode(pt)); +} + +try { + doHpke(); +} catch (_err: unknown) { + console.log("failed."); +} +``` + +### Web Browsers + +```html + + + + + + + +``` + +## Contributing + +We welcome all kind of contributions, filing issues, suggesting new features or +sending PRs. diff --git a/packages/ml-kem/deno.json b/packages/ml-kem/deno.json new file mode 100644 index 000000000..b035b90e6 --- /dev/null +++ b/packages/ml-kem/deno.json @@ -0,0 +1,58 @@ +{ + "name": "@hpke/ml-kem", + "version": "0.1.0", + "exports": "./mod.ts", + "imports": { + "@dajiaji/mlkem": "jsr:@dajiaji/mlkem@^2.3.0" + }, + "publish": { + "exclude": [ + "dnt.ts", + "samples/", + "test/", + "tsconfig.json" + ] + }, + "fmt": { + "include": [ + "**/*.md", + "**/*.json", + "dnt.ts", + "mod.ts", + "samples/", + "src/", + "test/" + ], + "exclude": [ + "**/*/*.js", + "**/*/npm/", + "coverage/*.json" + ] + }, + "lint": { + "include": [ + "**/*.md", + "**/*.json", + "dnt.ts", + "mod.ts", + "samples/", + "src/", + "test/" + ], + "exclude": [ + "**/*/*.js", + "**/*/npm/", + "coverage/*.json" + ] + }, + "tasks": { + "test": "deno fmt && deno lint && deno test --import-map=../../import_map.json --fail-fast --doc --coverage=coverage --cached-only --parallel --allow-read", + "test:cloudflare": "cd test/runtimes/cloudflare && npm install && npm link @hpke/common @hpke/ml-kem && npm run test", + "test:bun": "cd test/runtimes/bun && bun install && bun test", + "cov": "deno coverage ./coverage --lcov --exclude='test'", + "dnt": "deno run --import-map=../../npm/import_map.json -A dnt.ts", + "sample:deno": "cd samples/deno && deno run main.ts", + "sample:node": "cd samples/node && npm install && node app.js", + "minify": "esbuild ../../npm/packages/ml-kem/esm/mod.js --bundle --format=esm --minify" + } +} diff --git a/packages/ml-kem/dnt.ts b/packages/ml-kem/dnt.ts new file mode 100644 index 000000000..1d37e19f4 --- /dev/null +++ b/packages/ml-kem/dnt.ts @@ -0,0 +1,82 @@ +import { build, emptyDir } from "@deno/dnt"; +import { copySync } from "@std/fs"; + +await emptyDir("../../npm/packages/ml-kem"); +await emptyDir("../../npm/samples/ml-kem"); +await emptyDir("../../npm/test/ml-kem/runtimes/cloudflare"); + +await emptyDir("test/runtimes/browsers/node_modules"); +await emptyDir("test/runtimes/bun/node_modules"); + +const denoPkg = JSON.parse(await Deno.readTextFile("./deno.json")); + +await build({ + entryPoints: ["./mod.ts"], + outDir: "../../npm/packages/ml-kem", + typeCheck: "both", + test: true, + declaration: true, + scriptModule: "umd", + importMap: "../../npm/import_map.json", + compilerOptions: { + lib: ["ES2022", "DOM"], + }, + shims: { + deno: "dev", + }, + testPattern: "test/**/*.test.ts", + package: { + name: denoPkg.name, + version: denoPkg.version, + description: + "A Hybrid Public Key Encryption (HPKE) module extension for ML-KEM.", + repository: { + type: "git", + url: "git+https://github.com/dajiaji/hpke-js.git", + }, + homepage: "https://github.com/dajiaji/hpke-js#readme", + license: "MIT", + module: "./esm/mod.js", + main: "./script/mod.js", + types: "./esm/mod.d.ts", + sideEffects: false, + exports: { + ".": { + "import": "./esm/mod.js", + "require": "./script/mod.js", + }, + "./package.json": "./package.json", + }, + keywords: [ + "hpke", + "ml-kem", + "kyber", + "post-quantum", + "pqc", + "security", + "encryption", + ], + engines: { + "node": ">=16.0.0", + }, + author: "Ajitomi Daisuke", + bugs: { + url: "https://github.com/dajiaji/hpke-js/issues", + }, + }, +}); + +copySync( + "samples/node", + "../../npm/samples/ml-kem", + { overwrite: true }, +); +copySync( + "test/runtimes/cloudflare", + "../../npm/test/ml-kem/runtimes/cloudflare", + { overwrite: true }, +); + +// post build steps +Deno.copyFileSync("LICENSE", "../../npm/packages/ml-kem/LICENSE"); +Deno.copyFileSync("README.md", "../../npm/packages/ml-kem/README.md"); diff --git a/packages/ml-kem/mod.ts b/packages/ml-kem/mod.ts new file mode 100644 index 000000000..7d407bead --- /dev/null +++ b/packages/ml-kem/mod.ts @@ -0,0 +1 @@ +export { MlKem1024, MlKem512, MlKem768 } from "./src/mlKem.ts"; diff --git a/packages/ml-kem/samples/deno/deno.json b/packages/ml-kem/samples/deno/deno.json new file mode 100644 index 000000000..3c5130f1d --- /dev/null +++ b/packages/ml-kem/samples/deno/deno.json @@ -0,0 +1,5 @@ +{ + "tasks": { + "dev": "deno run --watch main.ts" + } +} diff --git a/packages/ml-kem/samples/deno/main.ts b/packages/ml-kem/samples/deno/main.ts new file mode 100644 index 000000000..b7dc76c4e --- /dev/null +++ b/packages/ml-kem/samples/deno/main.ts @@ -0,0 +1,37 @@ +import { Aes256Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; +import { MlKem768 } from "@hpke/ml-kem"; + +async function doHpke() { + // setup + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha256(), + aead: new Aes256Gcm(), + }); + + const rkp = await suite.kem.generateKeyPair(); + + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + + const recipient = await suite.createRecipientContext({ + recipientKey: rkp.privateKey, + enc: sender.enc, + }); + + // encrypt + const ct = await sender.seal(new TextEncoder().encode("Hello world!")); + + // decrypt + const pt = await recipient.open(ct); + + // Hello world! + console.log(new TextDecoder().decode(pt)); +} + +try { + doHpke(); +} catch (err: unknown) { + console.log("Error: ", err as Error); +} diff --git a/packages/ml-kem/samples/node/app.js b/packages/ml-kem/samples/node/app.js new file mode 100644 index 000000000..ce53c62f5 --- /dev/null +++ b/packages/ml-kem/samples/node/app.js @@ -0,0 +1,34 @@ +import { Aes256Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; +import { MlKem768 } from "@hpke/ml-kem"; + +async function doHpke() { + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha256(), + aead: new Aes256Gcm(), + }); + + const rkp = await suite.kem.generateKeyPair(); + + // A sender encrypts a message. + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const ct = await sender.seal(new TextEncoder().encode("Hello world!")); + + // A recipient decrypts it. + const recipient = await suite.createRecipientContext({ + recipientKey: rkp.privateKey, + enc: sender.enc, + }); + const pt = await recipient.open(ct); + + // Hello world! + console.log(new TextDecoder().decode(pt)); +} + +try { + doHpke(); +} catch (e) { + console.log("Error: ", e.message); +} diff --git a/packages/ml-kem/samples/node/package.json b/packages/ml-kem/samples/node/package.json new file mode 100644 index 000000000..65e64a714 --- /dev/null +++ b/packages/ml-kem/samples/node/package.json @@ -0,0 +1,16 @@ +{ + "name": "samples-node-hpke-ml-kem", + "version": "1.0.0", + "description": "A sample code of @hpke/ml-kem.", + "type": "module", + "main": "app.js", + "author": "Ajitomi Daisuke (https://github.com/dajiaji)", + "license": "MIT", + "scripts": { + "test": "node app.js" + }, + "dependencies": { + "@hpke/core": "^1.7.1", + "@hpke/ml-kem": "^0.1.0" + } +} diff --git a/packages/ml-kem/src/mlKem.ts b/packages/ml-kem/src/mlKem.ts new file mode 100644 index 000000000..f657cc52d --- /dev/null +++ b/packages/ml-kem/src/mlKem.ts @@ -0,0 +1,401 @@ +import { + MlKem1024 as MlKem1024Native, + MlKem512 as MlKem512Native, + MlKem768 as MlKem768Native, + // @ts-ignore: Unreachable code error +} from "@dajiaji/mlkem"; + +import type { + JsonWebKeyExtended, + KemInterface, + RecipientContextParams, + SenderContextParams, +} from "@hpke/common"; + +import { + base64UrlToBytes, + concat, + DecapError, + DeriveKeyPairError, + DeserializeError, + EncapError, + InvalidParamError, + isCryptoKeyPair, + KEM_USAGES, + KemId, + loadCrypto, + NotSupportedError, + SerializeError, + XCryptoKey, +} from "@hpke/common"; + +interface MlKemInterface { + generateKeyPair(): Promise<[Uint8Array, Uint8Array]>; + deriveKeyPair(seed: Uint8Array): Promise<[Uint8Array, Uint8Array]>; + encap(pk: Uint8Array, seed?: Uint8Array): Promise<[Uint8Array, Uint8Array]>; + decap(ct: Uint8Array, sk: Uint8Array): Promise; +} + +/** + * The base class of ML-KEM. + */ +export class MlKemBase implements KemInterface { + public readonly id: KemId = 0; + public readonly name: string = ""; + public readonly secretSize: number = 0; + public readonly encSize: number = 0; + public readonly publicKeySize: number = 0; + public readonly privateKeySize: number = 0; + public readonly auth: boolean = false; + protected _prim: MlKemInterface | undefined = undefined; + private _api: Crypto | undefined = undefined; + + constructor() {} + + public async serializePublicKey(key: CryptoKey): Promise { + try { + return await this._serializePublicKey(key as XCryptoKey); + } catch (e: unknown) { + throw new SerializeError(e); + } + } + + public async deserializePublicKey(key: ArrayBuffer): Promise { + try { + return await this._deserializePublicKey(key); + } catch (e: unknown) { + throw new DeserializeError(e); + } + } + + public async serializePrivateKey(key: CryptoKey): Promise { + try { + return await this._serializePrivateKey(key as XCryptoKey); + } catch (e: unknown) { + throw new SerializeError(e); + } + } + + public async deserializePrivateKey(key: ArrayBuffer): Promise { + try { + return await this._deserializePrivateKey(key); + } catch (e: unknown) { + throw new DeserializeError(e); + } + } + + public async generateKeyPair(): Promise { + await this._setup(); + const d = new Uint8Array(32); + const z = new Uint8Array(32); + try { + (this._api as Crypto).getRandomValues(d); + (this._api as Crypto).getRandomValues(z); + } catch (e: unknown) { + throw new NotSupportedError(e); + } + try { + const sk = concat(d, z); + const [pk, _sk] = await (this._prim as MlKemInterface).deriveKeyPair(sk); + const dSk = await this.deserializePrivateKey(sk); + const dPk = await this.deserializePublicKey(pk); + return { privateKey: dSk, publicKey: dPk }; + } catch (e: unknown) { + throw new DeriveKeyPairError(e); + } + } + + public async deriveKeyPair(ikm: ArrayBuffer): Promise { + try { + const [pk, _] = await (this._prim as MlKemInterface).deriveKeyPair( + new Uint8Array(ikm), + ); + const dSk = await this.deserializePrivateKey(ikm); + const dPk = await this.deserializePublicKey(pk); + return { privateKey: dSk, publicKey: dPk }; + } catch (e: unknown) { + throw new DeriveKeyPairError(e); + } + } + + public async importKey( + format: "raw" | "jwk", + key: ArrayBuffer | JsonWebKeyExtended, + isPublic = true, + ): Promise { + await this._setup(); + try { + let ret: Uint8Array; + if (format === "jwk") { + if (key instanceof ArrayBuffer || key instanceof Uint8Array) { + throw new Error("Invalid jwk key format"); + } + ret = await this._importJWK(key as JsonWebKey, isPublic); + } else { + if (key instanceof ArrayBuffer) { + ret = new Uint8Array(key); + } else if (key instanceof Uint8Array) { + ret = key; + } else { + throw new Error("Invalid key format"); + } + } + if (isPublic && ret.byteLength !== this.publicKeySize) { + throw new Error("Invalid length of the key"); + } + if (!isPublic && ret.byteLength !== this.privateKeySize) { + throw new Error("Invalid length of the key"); + } + return new XCryptoKey( + this.name, + ret, + isPublic ? "public" : "private", + isPublic ? [] : KEM_USAGES, + ); + } catch (e: unknown) { + throw new DeserializeError(e); + } + } + + public async encap( + params: SenderContextParams, + ): Promise<{ sharedSecret: ArrayBuffer; enc: ArrayBuffer }> { + let ekm: Uint8Array | undefined = undefined; + if (params.ekm !== undefined) { + if (params.ekm instanceof ArrayBuffer) { + ekm = new Uint8Array(params.ekm); + } else if (params.ekm instanceof Uint8Array) { + ekm = params.ekm; + } else { + throw new InvalidParamError("ekm must be 32 bytes in length"); + } + } + const pk = new Uint8Array( + await this.serializePublicKey(params.recipientPublicKey), + ); + if (pk.byteLength !== this.publicKeySize) { + throw new InvalidParamError("Invalid length of recipientKey"); + } + try { + const [ct, ss] = await (this._prim as MlKemInterface).encap(pk, ekm); + return { sharedSecret: ss, enc: ct }; + } catch (e: unknown) { + throw new EncapError(e); + } + } + + public async decap(params: RecipientContextParams): Promise { + const rSk = isCryptoKeyPair(params.recipientKey) + ? params.recipientKey.privateKey + : params.recipientKey; + if (params.enc.byteLength !== this.encSize) { + throw new InvalidParamError("Invalid length of enc"); + } + const ct = new Uint8Array(params.enc); + const sk = new Uint8Array(await this.serializePrivateKey(rSk)); + if (sk.byteLength !== this.privateKeySize) { + throw new InvalidParamError("Invalid length of recipientKey"); + } + try { + const [_, exSk] = await (this._prim as MlKemInterface).deriveKeyPair(sk); + return await (this._prim as MlKemInterface).decap(ct, exSk); + } catch (e: unknown) { + throw new DecapError(e); + } + } + + private async _setup() { + if (this._api !== undefined) { + return; + } + this._api = await loadCrypto(); + } + + private _serializePublicKey(k: XCryptoKey): Promise { + return new Promise((resolve, reject) => { + if (k.type !== "public") { + reject(new Error("Not public key")); + } + if (k.algorithm.name !== this.name) { + reject(new Error(`Invalid algorithm name: ${k.algorithm.name}`)); + } + if (k.key.byteLength !== this.publicKeySize) { + reject(new Error(`Invalid key length: ${k.key.byteLength}`)); + } + resolve(k.key.buffer); + }); + } + + private _deserializePublicKey(k: ArrayBuffer): Promise { + return new Promise((resolve, reject) => { + if (k.byteLength !== this.publicKeySize) { + reject(new Error(`Invalid key length: ${k.byteLength}`)); + } + resolve(new XCryptoKey(this.name, new Uint8Array(k), "public")); + }); + } + + private _serializePrivateKey(k: XCryptoKey): Promise { + return new Promise((resolve, reject) => { + if (k.type !== "private") { + reject(new Error("Not private key")); + } + if (k.algorithm.name !== this.name) { + reject(new Error(`Invalid algorithm name: ${k.algorithm.name}`)); + } + if (k.key.byteLength !== this.privateKeySize) { + reject(new Error(`Invalid key length: ${k.key.byteLength}`)); + } + resolve(k.key.buffer); + }); + } + + private _deserializePrivateKey(k: ArrayBuffer): Promise { + return new Promise((resolve, reject) => { + if (k.byteLength !== this.privateKeySize) { + reject(new Error(`Invalid key length: ${k.byteLength}`)); + } + resolve( + new XCryptoKey(this.name, new Uint8Array(k), "private", ["deriveBits"]), + ); + }); + } + + private _importJWK( + key: JsonWebKeyExtended, + isPublic: boolean, + ): Promise { + return new Promise((resolve, reject) => { + if (typeof key.kty === "undefined" || key.kty !== "AKP") { + reject(new Error(`Invalid kty: ${key.kty}`)); + } + if (typeof key.alg === "undefined" || key.alg !== this.name) { + reject(new Error(`Invalid alg: ${key.alg}`)); + } + if (!isPublic) { + if (typeof key.priv === "undefined") { + reject(new Error("Invalid key: `priv` not found")); + } + if ( + typeof key.key_ops !== "undefined" && + (key.key_ops.length !== 1 || key.key_ops[0] !== "deriveBits") + ) { + reject(new Error("Invalid key: `key_ops` should be ['deriveBits']")); + } + resolve(base64UrlToBytes(key.priv as string)); + } + if (typeof key.priv !== "undefined") { + reject(new Error("Invalid key: `priv` should not be set")); + } + if (typeof key.pub === "undefined") { + reject(new Error("Invalid key: `pub` not found")); + } + if (typeof key.key_ops !== "undefined" && key.key_ops.length > 0) { + reject(new Error("Invalid key: `key_ops` should not be set")); + } + resolve(base64UrlToBytes(key.pub as string)); + }); + } +} + +/** + * The ML-KEM-512 for HPKE KEM implementing {@link KemInterface}. + * + * The instance of this class can be specified to the + * {@link https://jsr.io/@hpke/core/doc/~/CipherSuiteParams | CipherSuiteParams} as follows: + * + * @example + * + * ```ts + * import { Aes128Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; + * import { MlKem768 } from "@hpke/ml-kem"; + * const suite = new CipherSuite({ + * kem: new MlKem512(), + * kdf: new HkdfSha256(), + * aead: new Aes128Gcm(), + * }); + * ``` + */ +export class MlKem512 extends MlKemBase { + override id: KemId = KemId.MlKem512; + override name: string = "ML-KEM-512"; + override secretSize: number = 32; + override encSize: number = 768; + override publicKeySize: number = 800; + override privateKeySize: number = 64; + override auth = false; + override _prim: MlKemInterface | undefined = undefined; + + constructor() { + super(); + this._prim = new MlKem512Native(); + } +} + +/** + * The ML-KEM-768 for HPKE KEM implementing {@link KemInterface}. + * + * The instance of this class can be specified to the + * {@link https://jsr.io/@hpke/core/doc/~/CipherSuiteParams | CipherSuiteParams} as follows: + * + * @example + * + * ```ts + * import { Aes256Gcm, CipherSuite, HkdfSha384 } from "@hpke/core"; + * import { MlKem768 } from "@hpke/ml-kem"; + * const suite = new CipherSuite({ + * kem: new MlKem768(), + * kdf: new HkdfSha384(), + * aead: new Aes256Gcm(), + * }); + * ``` + */ +export class MlKem768 extends MlKemBase { + override id: KemId = KemId.MlKem768; + override name: string = "ML-KEM-768"; + override secretSize: number = 32; + override encSize: number = 1088; + override publicKeySize: number = 1184; + override privateKeySize: number = 64; + override auth = false; + override _prim: MlKemInterface | undefined = undefined; + + constructor() { + super(); + this._prim = new MlKem768Native(); + } +} + +/** + * The ML-KEM-1024 for HPKE KEM implementing {@link KemInterface}. + * + * The instance of this class can be specified to the + * {@link https://jsr.io/@hpke/core/doc/~/CipherSuiteParams | CipherSuiteParams} as follows: + * + * @example + * + * ```ts + * import { Aes256Gcm, CipherSuite, HkdfSha512 } from "@hpke/core"; + * import { MlKem768 } from "@hpke/ml-kem"; + * const suite = new CipherSuite({ + * kem: new MlKem1024(), + * kdf: new HkdfSha512(), + * aead: new Aes256Gcm(), + * }); + * ``` + */ +export class MlKem1024 extends MlKemBase { + override id: KemId = KemId.MlKem1024; + override name: string = "ML-KEM-1024"; + override secretSize: number = 32; + override encSize: number = 1568; + override publicKeySize: number = 1568; + override privateKeySize: number = 64; + override auth = false; + override _prim: MlKemInterface | undefined = undefined; + + constructor() { + super(); + this._prim = new MlKem1024Native(); + } +} diff --git a/packages/ml-kem/test/mlKem.test.ts b/packages/ml-kem/test/mlKem.test.ts new file mode 100644 index 000000000..5a9cd4eb9 --- /dev/null +++ b/packages/ml-kem/test/mlKem.test.ts @@ -0,0 +1,998 @@ +// import { assertEquals, assertRejects } from "@std/assert"; +import { assertEquals } from "@std/assert"; +import { dirname, fromFileUrl, join } from "@std/path"; +import { describe, it } from "@std/testing/bdd"; + +import { concat, hexToBytes, isDeno, loadCrypto } from "@hpke/common"; +import { + Aes128Gcm, + Aes256Gcm, + CipherSuite, + HkdfSha256, + HkdfSha384, + HkdfSha512, + KemId, +} from "@hpke/core"; +import { MlKem1024, MlKem512, MlKem768 } from "../mod.ts"; + +function getPath(name: string): string { + const currentPath = dirname(fromFileUrl(import.meta.url)); + if (isDeno()) { + return join(currentPath, name); + } + return join(currentPath, "../../", name); +} + +function parseKAT(data: string) { + const textByLine = data.trim().split("\n"); + const parsed: { [label: string]: Uint8Array[] } = {}; + + for (let i = 0; i < textByLine.length; i++) { + const [label, hexValue] = textByLine[i].split(" = "); + if (label === "count") continue; + const value = hexToBytes(hexValue); + if (parsed[label]) { + parsed[label].push(value); + } else { + parsed[label] = [value]; + } + } + + return parsed; +} + +describe("MlKem", () => { + describe("constructor - MlKem512", () => { + it("should have a correct ciphersuite", () => { + const kem = new MlKem512(); + assertEquals(kem.secretSize, 32); + assertEquals(kem.encSize, 768); + assertEquals(kem.publicKeySize, 800); + assertEquals(kem.privateKeySize, 64); + assertEquals(kem.id, KemId.MlKem512); + assertEquals(kem.id, 0x0040); + }); + }); + + describe("constructor - MlKem768", () => { + it("should have a correct ciphersuite", () => { + const kem = new MlKem768(); + assertEquals(kem.secretSize, 32); + assertEquals(kem.encSize, 1088); + assertEquals(kem.publicKeySize, 1184); + assertEquals(kem.privateKeySize, 64); + assertEquals(kem.id, KemId.MlKem768); + assertEquals(kem.id, 0x0041); + }); + }); + + describe("constructor - MlKem1024", () => { + it("should have a correct ciphersuite", () => { + const kem = new MlKem1024(); + assertEquals(kem.secretSize, 32); + assertEquals(kem.encSize, 1568); + assertEquals(kem.publicKeySize, 1568); + assertEquals(kem.privateKeySize, 64); + assertEquals(kem.id, KemId.MlKem1024); + assertEquals(kem.id, 0x0042); + }); + }); + + describe("official test vectors", () => { + it("kat_MLKEM_512.rsp", async () => { + const katData = await Deno.readTextFile( + getPath("../../../test/vectors/kat/kat_MLKEM_512.rsp"), + ); + const { z, d, ct, ss, msg, pk } = parseKAT(katData); + + for (let i = 0; i < z.length; i++) { + const recipient = new MlKem512(); + const sk = concat(d[i], z[i]); + const kp = await recipient.deriveKeyPair(sk); + assertEquals( + new Uint8Array(await recipient.serializePrivateKey(kp.privateKey)), + sk, + ); + assertEquals( + new Uint8Array(await recipient.serializePublicKey(kp.publicKey)), + pk[i], + ); + const sender = new MlKem512(); + const res = await sender.encap({ + recipientPublicKey: kp.publicKey, + ekm: msg[i], + }); + const ssR = await recipient.decap({ + enc: res.enc, + recipientKey: kp.privateKey, + }); + assertEquals(res.enc, ct[i]); + assertEquals(res.sharedSecret, ss[i]); + assertEquals(ssR, ss[i]); + } + }); + + it("kat_MLKEM_768.rsp", async () => { + const katData = await Deno.readTextFile( + getPath("../../../test/vectors/kat/kat_MLKEM_768.rsp"), + ); + const { z, d, ct, ss, msg, pk } = parseKAT(katData); + + for (let i = 0; i < z.length; i++) { + const recipient = new MlKem768(); + const sk = concat(d[i], z[i]); + const kp = await recipient.deriveKeyPair(sk); + assertEquals( + new Uint8Array(await recipient.serializePrivateKey(kp.privateKey)), + sk, + ); + assertEquals( + new Uint8Array(await recipient.serializePublicKey(kp.publicKey)), + pk[i], + ); + const sender = new MlKem768(); + const res = await sender.encap({ + recipientPublicKey: kp.publicKey, + ekm: msg[i], + }); + const ssR = await recipient.decap({ + enc: res.enc, + recipientKey: kp.privateKey, + }); + assertEquals(res.enc, ct[i]); + assertEquals(res.sharedSecret, ss[i]); + assertEquals(ssR, ss[i]); + } + }); + + it("kat_MLKEM_1024.rsp", async () => { + const katData = await Deno.readTextFile( + getPath("../../../test/vectors/kat/kat_MLKEM_1024.rsp"), + ); + const { z, d, ct, ss, msg, pk } = parseKAT(katData); + + for (let i = 0; i < z.length; i++) { + const recipient = new MlKem1024(); + const sk = concat(d[i], z[i]); + const kp = await recipient.deriveKeyPair(sk); + assertEquals( + new Uint8Array(await recipient.serializePrivateKey(kp.privateKey)), + sk, + ); + assertEquals( + new Uint8Array(await recipient.serializePublicKey(kp.publicKey)), + pk[i], + ); + const sender = new MlKem1024(); + const res = await sender.encap({ + recipientPublicKey: kp.publicKey, + ekm: msg[i], + }); + const ssR = await recipient.decap({ + enc: res.enc, + recipientKey: kp.privateKey, + }); + assertEquals(res.enc, ct[i]); + assertEquals(res.sharedSecret, ss[i]); + assertEquals(ssR, ss[i]); + } + }); + }); + + // describe("official test vectors", () => { + // it("should match the results", async () => { + // for (const v of TEST_VECTORS) { + // const seed = hexToBytes(v.seed); + // const sk = hexToBytes(v.sk); + // const pk = hexToBytes(v.pk); + // const eseed = hexToBytes(v.eseed); + // const ct = hexToBytes(v.ct); + // const ss = hexToBytes(v.ss); + // assertEquals(seed.length, 32); + // assertEquals(sk.length, 32); + // assertEquals(pk.length, 1216); + // assertEquals(eseed.length, 64); + // assertEquals(ct.length, 1120); + // assertEquals(ss.length, 32); + + // const recipient = new MlKem768(); + // const kp = await recipient.generateKeyPairDerand(seed); + // assertEquals( + // (await recipient.serializePublicKey(kp.publicKey)).byteLength, + // 1216, + // ); + // assertEquals( + // new Uint8Array(await recipient.serializePrivateKey(kp.privateKey)), + // sk, + // ); + // assertEquals( + // new Uint8Array(await recipient.serializePublicKey(kp.publicKey)), + // pk, + // ); + // const sender = new MlKem768(); + // const res = await sender.encap({ + // recipientPublicKey: kp.publicKey, + // ekm: eseed, + // }); + // const ssR = await recipient.decap({ + // enc: res.enc, + // recipientKey: kp.privateKey, + // }); + // assertEquals(res.enc.byteLength, 1120); + // assertEquals(res.sharedSecret.byteLength, 32); + // assertEquals(res.enc, ct); + // assertEquals(res.sharedSecret, ssR); + // assertEquals(res.sharedSecret, ss); + // // assertEquals(ssR, ss); + // } + // }); + // }); + + // describe("importKey", () => { + // it("with valid raw - as ArrayBuffer", async () => { + // const kem = new MlKem768(); + // const pkR = await kem.importKey( + // "raw", + // hexToBytes( + // "e2236b35a8c24b39b10aa1323a96a919a2ced88400633a7b07131713fc14b2b5b19cfc3da5fa1a92c49f25513e0fd30d6b1611c9ab9635d7086727a4b7d21d34244e66969cf15b3b2a785329f61b096b277ea037383479a6b556de7231fe4b7fa9c9ac24c0699a0018a5253401bacfa905ca816573e56a2d2e067e9b7287533ba13a937dedb31fa44baced40769923610034ae31e619a170245199b3c5c39864859fe1b4c9717a07c30495bdfb98a0a002ccf56c1286cef5041dede3c44cf16bf562c7448518026b3d8b9940680abd38a1575fd27b58da063bfac32c39c30869374c05c1aeb1898b6b303cc68be455346ee0af699636224a148ca2aea10463111c709f69b69c70ce8538746698c4c60a9aef0030c7924ceec42a5d36816f545eae13293460b3acb37ea0e13d70e4aa78686da398a8397c08eaf96882113fe4f7bad4da40b0501e1c753efe73053c87014e8661c33099afe8bede414a5b1aa27d8392b3e131e9a70c1055878240cad0f40d5fe3cdf85236ead97e2a97448363b2808caafd516cd25052c5c362543c2517e4acd0e60ec07163009b6425fc32277acee71c24bab53ed9f29e74c66a0a3564955998d76b96a9a8b50d1635a4d7a67eb42df5644d330457293a8042f53cc7a69288f17ed55827e82b28e82665a86a14fbd96645eca8172c044f83bc0d8c0b4c8626985631ca87af829068f1358963cb333664ca482763ba3b3bb208577f9ba6ac62c25f76592743b64be519317714cb4102cb7b2f9a25b2b4f0615de31decd9ca55026d6da0b65111b16fe52feed8a487e144462a6dba93728f500b6ffc49e515569ef25fed17aff520507368253525860f58be3be61c964604a6ac814e6935596402a520a4670b3d284318866593d15a4bb01c35e3e587ee0c67d2880d6f2407fb7a70712b838deb96c5d7bf2b44bcf6038ccbe33fbcf51a54a584fe90083c91c7a6d43d4fb15f48c60c2fd66e0a8aad4ad64e5c42bb8877c0ebec2b5e387c8a988fdc23beb9e16c8757781e0a1499c61e138c21f216c29d076979871caa6942bafc090544bee99b54b16cb9a9a364d6246d9f42cce53c66b59c45c8f9ae9299a75d15180c3c952151a91b7a10772429dc4cbae6fcc622fa8018c63439f890630b9928db6bb7f9438ae4065ed34d73d486f3f52f90f0807dc88dfdd8c728e954f1ac35c06c000ce41a0582580e3bb57b672972890ac5e7988e7850657116f1b57d0809aaedec0bede1ae148148311c6f7e317346e5189fb8cd635b986f8c0bdd27641c584b778b3a911a80be1c9692ab8e1bbb12839573cce19df183b45835bbb55052f9fc66a1678ef2a36dea78411e6c8d60501b4e60592d13698a943b509185db912e2ea10be06171236b327c71716094c964a68b03377f513a05bcd99c1f346583bb052977a10a12adfc758034e5617da4c1276585e5774e1f3b9978b09d0e9c44d3bc86151c43aad185712717340223ac381d21150a04294e97bb13bbda21b5a182b6da969e19a7fd072737fa8e880a53c2428e3d049b7d2197405296ddb361912a7bcf4827ced611d0c7a7da104dde4322095339f64a61d5bb108ff0bf4d780cae509fb22c256914193ff7349042581237d522828824ee3bdfd07fb03f1f942d2ea179fe722f06cc03de5b69859edb06eff389b27dce59844570216223593d4ba32d9abac8cd049040ef6534", + // ).buffer, + // true, + // ); + // const skR = await kem.importKey( + // "raw", + // hexToBytes( + // "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26", + // ).buffer, + // false, + // ); + // const res = await kem.encap({ recipientPublicKey: pkR }); + // const ssR = await kem.decap({ enc: res.enc, recipientKey: skR }); + // assertEquals(res.sharedSecret, ssR); + // }); + + // it("with valid raw - as Uint8Array", async () => { + // const kem = new MlKem768(); + // const pkR = await kem.importKey( + // "raw", + // hexToBytes( + // "e2236b35a8c24b39b10aa1323a96a919a2ced88400633a7b07131713fc14b2b5b19cfc3da5fa1a92c49f25513e0fd30d6b1611c9ab9635d7086727a4b7d21d34244e66969cf15b3b2a785329f61b096b277ea037383479a6b556de7231fe4b7fa9c9ac24c0699a0018a5253401bacfa905ca816573e56a2d2e067e9b7287533ba13a937dedb31fa44baced40769923610034ae31e619a170245199b3c5c39864859fe1b4c9717a07c30495bdfb98a0a002ccf56c1286cef5041dede3c44cf16bf562c7448518026b3d8b9940680abd38a1575fd27b58da063bfac32c39c30869374c05c1aeb1898b6b303cc68be455346ee0af699636224a148ca2aea10463111c709f69b69c70ce8538746698c4c60a9aef0030c7924ceec42a5d36816f545eae13293460b3acb37ea0e13d70e4aa78686da398a8397c08eaf96882113fe4f7bad4da40b0501e1c753efe73053c87014e8661c33099afe8bede414a5b1aa27d8392b3e131e9a70c1055878240cad0f40d5fe3cdf85236ead97e2a97448363b2808caafd516cd25052c5c362543c2517e4acd0e60ec07163009b6425fc32277acee71c24bab53ed9f29e74c66a0a3564955998d76b96a9a8b50d1635a4d7a67eb42df5644d330457293a8042f53cc7a69288f17ed55827e82b28e82665a86a14fbd96645eca8172c044f83bc0d8c0b4c8626985631ca87af829068f1358963cb333664ca482763ba3b3bb208577f9ba6ac62c25f76592743b64be519317714cb4102cb7b2f9a25b2b4f0615de31decd9ca55026d6da0b65111b16fe52feed8a487e144462a6dba93728f500b6ffc49e515569ef25fed17aff520507368253525860f58be3be61c964604a6ac814e6935596402a520a4670b3d284318866593d15a4bb01c35e3e587ee0c67d2880d6f2407fb7a70712b838deb96c5d7bf2b44bcf6038ccbe33fbcf51a54a584fe90083c91c7a6d43d4fb15f48c60c2fd66e0a8aad4ad64e5c42bb8877c0ebec2b5e387c8a988fdc23beb9e16c8757781e0a1499c61e138c21f216c29d076979871caa6942bafc090544bee99b54b16cb9a9a364d6246d9f42cce53c66b59c45c8f9ae9299a75d15180c3c952151a91b7a10772429dc4cbae6fcc622fa8018c63439f890630b9928db6bb7f9438ae4065ed34d73d486f3f52f90f0807dc88dfdd8c728e954f1ac35c06c000ce41a0582580e3bb57b672972890ac5e7988e7850657116f1b57d0809aaedec0bede1ae148148311c6f7e317346e5189fb8cd635b986f8c0bdd27641c584b778b3a911a80be1c9692ab8e1bbb12839573cce19df183b45835bbb55052f9fc66a1678ef2a36dea78411e6c8d60501b4e60592d13698a943b509185db912e2ea10be06171236b327c71716094c964a68b03377f513a05bcd99c1f346583bb052977a10a12adfc758034e5617da4c1276585e5774e1f3b9978b09d0e9c44d3bc86151c43aad185712717340223ac381d21150a04294e97bb13bbda21b5a182b6da969e19a7fd072737fa8e880a53c2428e3d049b7d2197405296ddb361912a7bcf4827ced611d0c7a7da104dde4322095339f64a61d5bb108ff0bf4d780cae509fb22c256914193ff7349042581237d522828824ee3bdfd07fb03f1f942d2ea179fe722f06cc03de5b69859edb06eff389b27dce59844570216223593d4ba32d9abac8cd049040ef6534", + // ), + // true, + // ); + // const skR = await kem.importKey( + // "raw", + // hexToBytes( + // "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26", + // ), + // false, + // ); + // const res = await kem.encap({ recipientPublicKey: pkR }); + // const ssR = await kem.decap({ enc: res.enc, recipientKey: skR }); + // assertEquals(res.sharedSecret, ssR); + // }); + + // it("with valid jwk", async () => { + // const kem = new MlKem768(); + + // const jwkPkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // const pkR = await kem.importKey("jwk", jwkPkR, true); + + // const jwkSkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + + // const skR = await kem.importKey("jwk", jwkSkR, false); + // const res = await kem.encap({ recipientPublicKey: pkR }); + // const ssR = await kem.decap({ enc: res.enc, recipientKey: skR }); + // assertEquals(res.sharedSecret, ssR); + // }); + + // it("with valid jwk - private key with pub", async () => { + // const kem = new MlKem768(); + + // const jwkPkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // const pkR = await kem.importKey("jwk", jwkPkR, true); + + // const jwkSkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + + // const skR = await kem.importKey("jwk", jwkSkR, false); + // const res = await kem.encap({ recipientPublicKey: pkR }); + // const ssR = await kem.decap({ enc: res.enc, recipientKey: skR }); + // assertEquals(res.sharedSecret, ssR); + // }); + + // it("with valid jwk - public key without key_ops", async () => { + // const kem = new MlKem768(); + + // const jwkPkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // // key_ops: [], + // }; + // const pkR = await kem.importKey("jwk", jwkPkR, true); + + // const jwkSkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + + // const skR = await kem.importKey("jwk", jwkSkR, false); + // const res = await kem.encap({ recipientPublicKey: pkR }); + // const ssR = await kem.decap({ enc: res.enc, recipientKey: skR }); + // assertEquals(res.sharedSecret, ssR); + // }); + + // it("with invalid raw - public key with valid jwk", async () => { + // const kem = new MlKem768(); + // const jwkPkR = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // await assertRejects( + // () => + // kem.importKey( + // "raw", + // jwkPkR, + // true, + // ), + // DeserializeError, + // ); + // }); + + // it("with invalid raw - public key with invalid length of the key", async () => { + // const kem = new MlKem768(); + // await assertRejects( + // () => + // kem.importKey( + // "raw", + // hexToBytes( + // "236b35a8c24b39b10aa1323a96a919a2ced88400633a7b07131713fc14b2b5b19cfc3da5fa1a92c49f25513e0fd30d6b1611c9ab9635d7086727a4b7d21d34244e66969cf15b3b2a785329f61b096b277ea037383479a6b556de7231fe4b7fa9c9ac24c0699a0018a5253401bacfa905ca816573e56a2d2e067e9b7287533ba13a937dedb31fa44baced40769923610034ae31e619a170245199b3c5c39864859fe1b4c9717a07c30495bdfb98a0a002ccf56c1286cef5041dede3c44cf16bf562c7448518026b3d8b9940680abd38a1575fd27b58da063bfac32c39c30869374c05c1aeb1898b6b303cc68be455346ee0af699636224a148ca2aea10463111c709f69b69c70ce8538746698c4c60a9aef0030c7924ceec42a5d36816f545eae13293460b3acb37ea0e13d70e4aa78686da398a8397c08eaf96882113fe4f7bad4da40b0501e1c753efe73053c87014e8661c33099afe8bede414a5b1aa27d8392b3e131e9a70c1055878240cad0f40d5fe3cdf85236ead97e2a97448363b2808caafd516cd25052c5c362543c2517e4acd0e60ec07163009b6425fc32277acee71c24bab53ed9f29e74c66a0a3564955998d76b96a9a8b50d1635a4d7a67eb42df5644d330457293a8042f53cc7a69288f17ed55827e82b28e82665a86a14fbd96645eca8172c044f83bc0d8c0b4c8626985631ca87af829068f1358963cb333664ca482763ba3b3bb208577f9ba6ac62c25f76592743b64be519317714cb4102cb7b2f9a25b2b4f0615de31decd9ca55026d6da0b65111b16fe52feed8a487e144462a6dba93728f500b6ffc49e515569ef25fed17aff520507368253525860f58be3be61c964604a6ac814e6935596402a520a4670b3d284318866593d15a4bb01c35e3e587ee0c67d2880d6f2407fb7a70712b838deb96c5d7bf2b44bcf6038ccbe33fbcf51a54a584fe90083c91c7a6d43d4fb15f48c60c2fd66e0a8aad4ad64e5c42bb8877c0ebec2b5e387c8a988fdc23beb9e16c8757781e0a1499c61e138c21f216c29d076979871caa6942bafc090544bee99b54b16cb9a9a364d6246d9f42cce53c66b59c45c8f9ae9299a75d15180c3c952151a91b7a10772429dc4cbae6fcc622fa8018c63439f890630b9928db6bb7f9438ae4065ed34d73d486f3f52f90f0807dc88dfdd8c728e954f1ac35c06c000ce41a0582580e3bb57b672972890ac5e7988e7850657116f1b57d0809aaedec0bede1ae148148311c6f7e317346e5189fb8cd635b986f8c0bdd27641c584b778b3a911a80be1c9692ab8e1bbb12839573cce19df183b45835bbb55052f9fc66a1678ef2a36dea78411e6c8d60501b4e60592d13698a943b509185db912e2ea10be06171236b327c71716094c964a68b03377f513a05bcd99c1f346583bb052977a10a12adfc758034e5617da4c1276585e5774e1f3b9978b09d0e9c44d3bc86151c43aad185712717340223ac381d21150a04294e97bb13bbda21b5a182b6da969e19a7fd072737fa8e880a53c2428e3d049b7d2197405296ddb361912a7bcf4827ced611d0c7a7da104dde4322095339f64a61d5bb108ff0bf4d780cae509fb22c256914193ff7349042581237d522828824ee3bdfd07fb03f1f942d2ea179fe722f06cc03de5b69859edb06eff389b27dce59844570216223593d4ba32d9abac8cd049040ef6534", + // ), + // true, + // ), + // DeserializeError, + // ); + // }); + + // it("with invalid raw - private key with invalid length of the key", async () => { + // const kem = new MlKem768(); + // await assertRejects( + // () => + // kem.importKey( + // "raw", + // hexToBytes( + // "9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26", + // ), + // false, + // ), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with valid raw key", async () => { + // const kem = new MlKem768(); + // await assertRejects( + // () => + // kem.importKey( + // "jwk", + // hexToBytes( + // "e2236b35a8c24b39b10aa1323a96a919a2ced88400633a7b07131713fc14b2b5b19cfc3da5fa1a92c49f25513e0fd30d6b1611c9ab9635d7086727a4b7d21d34244e66969cf15b3b2a785329f61b096b277ea037383479a6b556de7231fe4b7fa9c9ac24c0699a0018a5253401bacfa905ca816573e56a2d2e067e9b7287533ba13a937dedb31fa44baced40769923610034ae31e619a170245199b3c5c39864859fe1b4c9717a07c30495bdfb98a0a002ccf56c1286cef5041dede3c44cf16bf562c7448518026b3d8b9940680abd38a1575fd27b58da063bfac32c39c30869374c05c1aeb1898b6b303cc68be455346ee0af699636224a148ca2aea10463111c709f69b69c70ce8538746698c4c60a9aef0030c7924ceec42a5d36816f545eae13293460b3acb37ea0e13d70e4aa78686da398a8397c08eaf96882113fe4f7bad4da40b0501e1c753efe73053c87014e8661c33099afe8bede414a5b1aa27d8392b3e131e9a70c1055878240cad0f40d5fe3cdf85236ead97e2a97448363b2808caafd516cd25052c5c362543c2517e4acd0e60ec07163009b6425fc32277acee71c24bab53ed9f29e74c66a0a3564955998d76b96a9a8b50d1635a4d7a67eb42df5644d330457293a8042f53cc7a69288f17ed55827e82b28e82665a86a14fbd96645eca8172c044f83bc0d8c0b4c8626985631ca87af829068f1358963cb333664ca482763ba3b3bb208577f9ba6ac62c25f76592743b64be519317714cb4102cb7b2f9a25b2b4f0615de31decd9ca55026d6da0b65111b16fe52feed8a487e144462a6dba93728f500b6ffc49e515569ef25fed17aff520507368253525860f58be3be61c964604a6ac814e6935596402a520a4670b3d284318866593d15a4bb01c35e3e587ee0c67d2880d6f2407fb7a70712b838deb96c5d7bf2b44bcf6038ccbe33fbcf51a54a584fe90083c91c7a6d43d4fb15f48c60c2fd66e0a8aad4ad64e5c42bb8877c0ebec2b5e387c8a988fdc23beb9e16c8757781e0a1499c61e138c21f216c29d076979871caa6942bafc090544bee99b54b16cb9a9a364d6246d9f42cce53c66b59c45c8f9ae9299a75d15180c3c952151a91b7a10772429dc4cbae6fcc622fa8018c63439f890630b9928db6bb7f9438ae4065ed34d73d486f3f52f90f0807dc88dfdd8c728e954f1ac35c06c000ce41a0582580e3bb57b672972890ac5e7988e7850657116f1b57d0809aaedec0bede1ae148148311c6f7e317346e5189fb8cd635b986f8c0bdd27641c584b778b3a911a80be1c9692ab8e1bbb12839573cce19df183b45835bbb55052f9fc66a1678ef2a36dea78411e6c8d60501b4e60592d13698a943b509185db912e2ea10be06171236b327c71716094c964a68b03377f513a05bcd99c1f346583bb052977a10a12adfc758034e5617da4c1276585e5774e1f3b9978b09d0e9c44d3bc86151c43aad185712717340223ac381d21150a04294e97bb13bbda21b5a182b6da969e19a7fd072737fa8e880a53c2428e3d049b7d2197405296ddb361912a7bcf4827ced611d0c7a7da104dde4322095339f64a61d5bb108ff0bf4d780cae509fb22c256914193ff7349042581237d522828824ee3bdfd07fb03f1f942d2ea179fe722f06cc03de5b69859edb06eff389b27dce59844570216223593d4ba32d9abac8cd049040ef6534", + // ), + // true, + // ), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with invalid kty", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "OKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key without kty", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with invalid alg", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wind", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key without alg", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with invalid length of the key", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "NrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with priv", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key without pub", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // x: "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: [], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with invalid key_ops including deriveBits", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - public key with invalid key_ops including encrypt", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // key_ops: ["encrypt"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key with invalid kty", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "OKP", + // kid: "01", + // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key without kty", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key with invalid alg", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wind", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key without alg", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key with invalid length of the key", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // priv: "wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, false), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key without priv", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // pub: + // "4iNrNajCSzmxCqEyOpapGaLO2IQAYzp7BxMXE_wUsrWxnPw9pfoaksSfJVE-D9MNaxYRyauWNdcIZyekt9IdNCROZpac8Vs7KnhTKfYbCWsnfqA3ODR5prVW3nIx_kt_qcmsJMBpmgAYpSU0AbrPqQXKgWVz5WotLgZ-m3KHUzuhOpN97bMfpEus7UB2mSNhADSuMeYZoXAkUZmzxcOYZIWf4bTJcXoHwwSVvfuYoKACzPVsEobO9QQd7ePETPFr9WLHRIUYAms9i5lAaAq9OKFXX9J7WNoGO_rDLDnDCGk3TAXBrrGJi2swPMaL5FU0buCvaZY2IkoUjKKuoQRjERxwn2m2nHDOhTh0ZpjExgqa7wAwx5JM7sQqXTaBb1RerhMpNGCzrLN-oOE9cOSqeGhto5ioOXwI6vloghE_5Pe61NpAsFAeHHU-_nMFPIcBToZhwzCZr-i-3kFKWxqifYOSs-Ex6acMEFWHgkDK0PQNX-PN-FI26tl-KpdEg2OygIyq_VFs0lBSxcNiVDwlF-Ss0OYOwHFjAJtkJfwyJ3rO5xwkurU-2fKedMZqCjVklVmY12uWqai1DRY1pNemfrQt9WRNMwRXKTqAQvU8x6aSiPF-1Vgn6Cso6CZlqGoU-9lmReyoFywET4O8DYwLTIYmmFYxyoevgpBo8TWJY8szNmTKSCdjujs7sghXf5umrGLCX3ZZJ0O2S-UZMXcUy0ECy3svmiWytPBhXeMd7NnKVQJtbaC2URGxb-Uv7tikh-FERiptupNyj1ALb_xJ5RVWnvJf7Rev9SBQc2glNSWGD1i-O-YclkYEpqyBTmk1WWQCpSCkZws9KEMYhmWT0VpLsBw14-WH7gxn0ogNbyQH-3pwcSuDjeuWxde_K0S89gOMy-M_vPUaVKWE_pAIPJHHptQ9T7FfSMYML9ZuCoqtStZOXEK7iHfA6-wrXjh8ipiP3CO-ueFsh1d4HgoUmcYeE4wh8hbCnQdpeYccqmlCuvwJBUS-6ZtUsWy5qaNk1iRtn0LM5TxmtZxFyPmukpmnXRUYDDyVIVGpG3oQdyQp3Ey65vzGIvqAGMY0OfiQYwuZKNtrt_lDiuQGXtNNc9SG8_UvkPCAfciN_djHKOlU8aw1wGwADOQaBYJYDju1e2cpcokKxeeYjnhQZXEW8bV9CAmq7ewL7eGuFIFIMRxvfjFzRuUYn7jNY1uYb4wL3SdkHFhLd4s6kRqAvhyWkquOG7sSg5VzzOGd8YO0WDW7tVBS-fxmoWeO8qNt6nhBHmyNYFAbTmBZLRNpipQ7UJGF25EuLqEL4GFxI2syfHFxYJTJZKaLAzd_UToFvNmcHzRlg7sFKXehChKt_HWANOVhfaTBJ2WF5XdOHzuZeLCdDpxE07yGFRxDqtGFcScXNAIjrDgdIRUKBClOl7sTu9ohtaGCttqWnhmn_QcnN_qOiApTwkKOPQSbfSGXQFKW3bNhkSp7z0gnztYR0Men2hBN3kMiCVM59kph1bsQj_C_TXgMrlCfsiwlaRQZP_c0kEJYEjfVIoKIJO4739B_sD8flC0uoXn-ci8GzAPeW2mFntsG7_OJsn3OWYRFcCFiI1k9S6MtmrrIzQSQQO9lNA", + // // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key with invalid key_ops", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["encrypt"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + + // it("with invalid jwk - private key with invalid key_ops including a valid value", async () => { + // const kem = new MlKem768(); + + // const jwk = { + // kty: "AKP", + // kid: "01", + // alg: "X-Wing", + // priv: "f5wrpOiPgn1hYEVQdgWFPtc7gJP277yI6xpurPpm7yY", + // key_ops: ["deriveBits", "encrypt"], + // }; + // // assert + // await assertRejects( + // () => kem.importKey("jwk", jwk, true), + // DeserializeError, + // ); + // }); + // }); +}); + +describe("README examples", () => { + describe("MlKem512/HkdfShar256/Aes256Gcm", () => { + it("should work normally with generateKeyPair", async () => { + const suite = new CipherSuite({ + kem: new MlKem512(), + kdf: new HkdfSha256(), + aead: new Aes128Gcm(), + }); + const rkp = await suite.kem.generateKeyPair(); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + assertEquals(sender.enc.byteLength, suite.kem.encSize); + const ct = await sender.seal( + new TextEncoder().encode("Hello world!"), + ); + const pt = await recipient.open(ct); + assertEquals(new TextDecoder().decode(pt), "Hello world!"); + }); + + it("should work normally with deriveKeyPair", async () => { + const suite = new CipherSuite({ + kem: new MlKem512(), + kdf: new HkdfSha256(), + aead: new Aes128Gcm(), + }); + const cryptoApi = await loadCrypto(); + const ikm = new Uint8Array(64); + cryptoApi.getRandomValues(ikm); + const rkp = await suite.kem.deriveKeyPair(ikm.buffer); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + assertEquals(sender.enc.byteLength, suite.kem.encSize); + const ct = await sender.seal( + new TextEncoder().encode("Hello world!"), + ); + const pt = await recipient.open(ct); + assertEquals(new TextDecoder().decode(pt), "Hello world!"); + }); + + it("should work normally with JWK", async () => { + const suite = new CipherSuite({ + kem: new MlKem512(), + kdf: new HkdfSha256(), + aead: new Aes128Gcm(), + }); + + // NOTE: The following support for JWKs with the AKP key type is experimental. + // Please be aware that the specifications are subject to change without notice. + const jwkPub = { + kty: "AKP", + kid: "01", + alg: "ML-KEM-512", + pub: + "gLcBAIMdfuFo9HOSSDEZ-Thj7LC8YFMS01coh2sA9fV69Mhe2pcoHVdDkLxyVhk2aNyYYlNUq1K5vOeBxXccwmCZ9vusvuF4TRlIh3MfCXyH4ILL6sV9MLe5opOHLIQUZvIkTMZf9LplPWdR36IgUdVTNplCwxwp-RMHr1cyktaXqMMWEuB7UzXPCDKf0ka_KjIgCoywxLA7nQnFuhw5GVOekinGlpJDSCgvaWsVJeVgOAa022GLPchjDLKG5DEXIbxQMfJXqpJb-AlgRFqo2OaXiOmdqVwdEMw76FhSjbDP6gA8dGk3gKZaNuYoQ7O-FUBlQ9Itg1B8h7J4Z5LID6VihFSjEDlN2kwqtZSThQJX1tO8EHGG2QYnB_NU6BoaEPy3Y9MaTsQJqiQ-0uWbsYmFXrFlYma7N1AHheoIzYjCIqjFOod3yrQsnCOKANWTaUJQJumdKuYECvZwkCnKh4nIl7Mp-6dI1pyKcUjJWrsMcXh8WPEvIfIhPjiSQqp_vTIMEqxCxhFgbLjB0bRiWIahRaU1vWW9DZlrMwwWV9Yah-kEFwAyJXWYIKO77FBc2vERkyKarhc80SutIqejCnap-nY2w9WqSOF4QBKgEvFBaLeFPSoW-QygLMM7IAbAjybBX8opYSzHkuHPAuEyGnWoEIkZhmZ9QUivNuZeGlkliQKWF3NMMVwOObdRjIZgzcJl0MgT7yCgQzF_rluOQFRu7PcdbAVPpmtJQBMJvvMP1RpVGXVdqRBGibJvCDkVTIR77yNllDwCSUg6rZpzZ8mAo9HORtIAihUnXKO8pINOb5owNsDNgLoijTS5eAJE1cDL6QfG-0OCSpwHRkcWOcuGGIxgw7JTIVzJFpK80Uk9akRNU2RG4CloE4ABzCh-DlGPOqJdjDuVs8NcWfSBnUhJdgKa8FomPDUzayYfd7LNwpOJ8ITATLs3DEhWK1tQdxwPuBaQjhmN1tU_duSL8ELCsfgqOkC42vUfRtdvpLzJ08iU_4UMD6oy4KwzkBpMeROfXyBBfsGhkGBwRPGLuCTPNQx4qz3fPCyGylVD9xU", + key_ops: [], + }; + const pk = await suite.kem.importKey("jwk", jwkPub, true); + const sender = await suite.createSenderContext({ + recipientPublicKey: pk, + }); + + const jwkPriv = { + kty: "AKP", + kid: "01", + alg: "ML-KEM-512", + priv: + "bbvEN1E23zsH98cOY54iPhd-f9U7Fhs_TVd5F5TxJiT2lkhASOwh-Wz1ClbQdZxEjzd5dS8Dg9N0SWkGlM96aA", + key_ops: ["deriveBits"], + }; + const sk = await suite.kem.importKey("jwk", jwkPriv, false); + const recipient = await suite.createRecipientContext({ + recipientKey: sk, + enc: sender.enc, + }); + const encrypted = await sender.seal( + new TextEncoder().encode("Hellow world!"), + ); + const pt = await recipient.open(encrypted); + assertEquals(new TextDecoder().decode(pt), "Hellow world!"); + }); + }); + + describe("MlKem768/HkdfShar256/Aes256Gcm", () => { + it("should work normally with generateKeyPair", async () => { + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha384(), + aead: new Aes256Gcm(), + }); + const rkp = await suite.kem.generateKeyPair(); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + assertEquals(sender.enc.byteLength, suite.kem.encSize); + const ct = await sender.seal( + new TextEncoder().encode("Hello world!"), + ); + const pt = await recipient.open(ct); + assertEquals(new TextDecoder().decode(pt), "Hello world!"); + }); + + it("should work normally with deriveKeyPair", async () => { + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha384(), + aead: new Aes256Gcm(), + }); + const cryptoApi = await loadCrypto(); + const ikm = new Uint8Array(64); + cryptoApi.getRandomValues(ikm); + const rkp = await suite.kem.deriveKeyPair(ikm.buffer); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + assertEquals(sender.enc.byteLength, suite.kem.encSize); + const ct = await sender.seal( + new TextEncoder().encode("Hello world!"), + ); + const pt = await recipient.open(ct); + assertEquals(new TextDecoder().decode(pt), "Hello world!"); + }); + + it("should work normally with JWK", async () => { + const suite = new CipherSuite({ + kem: new MlKem768(), + kdf: new HkdfSha384(), + aead: new Aes256Gcm(), + }); + + // NOTE: The following support for JWKs with the AKP key type is experimental. + // Please be aware that the specifications are subject to change without notice. + const jwkPub = { + kty: "AKP", + kid: "01", + alg: "ML-KEM-768", + pub: + "PxuKXPWqDLFIz6x2ajCnggmjzpfLQnqegTJU4LapmuJTcLWDwnU1fOO01sYKr9oD6Zc04OmOulau74IekrjB20OUKnw3yZd9eZRv4EdN8nuc87EsqUuwZAHQkVBTC_gq38RiO9evl0JZhLjFP1GWnrwC2bQarOeVNuMoKvWt7bY2PUp727BqaeJMiSiI9nEAVbtkTbYLo7iEIEwDsHwqisoCSawp6td9XIeaeQoJuFClXvYUzHPPf3JyI7oNY1MpXACMmGqpIANJoKxQDjR-4XlaGoNpq2FRwnsTQcrOVoUu52xtPMuDMbI83osiSvmy3uQC2WBbv6hAGXZBnFerFoa9oJayjLZUzUpdt8MlmOAUkeIbjNVEl_YP4rwx14OSjjgr-_MzK3VM-WmxKqWPQ4tKVwZBKdRFYAmhcqWas7d8yEx2lEuZpTRFpSmsCmKtSQF0pHMkpdNLgaaCppwKjddfDek8IOQwJmwjsAxIafU8b9CFTtPK9FRJUrBe07Ow1so08PKX8umnwRh4BKN6Ehpq0qtQ2vR1qjol5smg1qKd72LL0pgFD1swfAU6XIg4tMM1fzN2ZTwzZvpv4QJdGWDHW6ZDJlwVeoTJFNVZ9UDGfsFYc5Sve9F4MNUInVBZBvqfdmqbk5CfW2YnzAWgshksv8InGwsi13oHzlUe2qZSLUArAAA3I8EVk2yX9UyIqlE0gqBVVMYo5pRI62oO9vNGNByAK9q5sDugryl9nouTi5yr76RnIkIaM4qHLZqIuIyfDuxGkyw2fMWLg1c9JgNqr1J25RWw8jBZtAyEj2OKzjcD7mwn2WaZDHcC7SOgzZukz2Fppmih8LtYawdmkuHCFXVP9nhL2RokjLkPAIo-ylmFLAV5ZpM6Goa24FsvrZGyi8YWSLBBp6wEargRK2rCy5APtcCYIdxLBxa1CeEi3JfG7XNC9vSftlVZcpw4R2O6LSu4z1auNvOyaZcKxUhBITskt5LJSfPHdecKyPfMU3Y_9jitxRE-xgB1waeSdspHPBE4MpVKviB76_DNBCbA4pczlHJWx3Vr-bUNghkaB_C6XVoVSwhm4pNHO0B2oemV-dCGpHLBGKwiwhaoOZIGYKMx7uGY31saFZUjnVeAzadfc8Z2WkauSqNAAZOd-tkvfhJKXyxiiyWd6VYLv0cMxpzGUtwpuTuoakmQ3OCvGkUkwZmmkmcMr3SNFmEv7tcR-IpQXVUqZECqBCJibxhfaSGoLvklCGAoroVi_HYQ4bFknvAJTZa1Bfu38RKJbvrA0ZKvRdkDrHmSu-m_MOJXfiRYHLxPc7GA0Epp9UCznhmkrjauxPIa3ndJZTkbyuvAr4actjYxMntCG-xnJmUbh1i_7nPFkSEtT_mB9mhMWLNZwtB_oeYB1sXL_clksxkJzKN__5YgT7VojZLKWoV1jPFg6bBu0YMgpLGwyOgZaudqb2IZctF6TWSn3wTFpMMzw7wayqs3cJFJo7jKCCqPvKEyaKGwIiMOLWMCcsuf8uZlWvFzJ_O5gHCV9YK-GL0_Tgu3I-ztabBYVimYZUjXIrA7W70Vesmd7hwKmqE", + key_ops: [], + }; + const pk = await suite.kem.importKey("jwk", jwkPub, true); + const sender = await suite.createSenderContext({ + recipientPublicKey: pk, + }); + + const jwkPriv = { + kty: "AKP", + kid: "01", + alg: "ML-KEM-768", + priv: + "1pz8ZPhNTzPkxU4Wa3_5KDo5SYalObI5h6EPOdLZaJtt5i40ZaVcnHigfSZb6FQLPliwgBoSTQf_ErQ41SAuoA", + key_ops: ["deriveBits"], + }; + const sk = await suite.kem.importKey("jwk", jwkPriv, false); + const recipient = await suite.createRecipientContext({ + recipientKey: sk, + enc: sender.enc, + }); + const encrypted = await sender.seal( + new TextEncoder().encode("Hellow world!"), + ); + const pt = await recipient.open(encrypted); + assertEquals(new TextDecoder().decode(pt), "Hellow world!"); + }); + }); + + describe("MlKem1024/HkdfShar512/Aes256Gcm", () => { + it("should work normally with generateKeyPair", async () => { + const suite = new CipherSuite({ + kem: new MlKem1024(), + kdf: new HkdfSha512(), + aead: new Aes256Gcm(), + }); + const rkp = await suite.kem.generateKeyPair(); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + assertEquals(sender.enc.byteLength, suite.kem.encSize); + const ct = await sender.seal( + new TextEncoder().encode("Hello world!"), + ); + const pt = await recipient.open(ct); + assertEquals(new TextDecoder().decode(pt), "Hello world!"); + }); + + it("should work normally with deriveKeyPair", async () => { + const suite = new CipherSuite({ + kem: new MlKem1024(), + kdf: new HkdfSha512(), + aead: new Aes256Gcm(), + }); + const cryptoApi = await loadCrypto(); + const ikm = new Uint8Array(64); + cryptoApi.getRandomValues(ikm); + const rkp = await suite.kem.deriveKeyPair(ikm.buffer); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + assertEquals(sender.enc.byteLength, suite.kem.encSize); + const ct = await sender.seal( + new TextEncoder().encode("Hello world!"), + ); + const pt = await recipient.open(ct); + assertEquals(new TextDecoder().decode(pt), "Hello world!"); + }); + + it("should work normally with JWK", async () => { + const suite = new CipherSuite({ + kem: new MlKem1024(), + kdf: new HkdfSha512(), + aead: new Aes256Gcm(), + }); + + // NOTE: The following support for JWKs with the AKP key type is experimental. + // Please be aware that the specifications are subject to change without notice. + const jwkPub = { + kty: "AKP", + kid: "01", + alg: "ML-KEM-1024", + pub: + "_-qbP8sQI-m4OLtIUDODHFVkKGyQz9gL2OiV9hB45akvc_SCkTfFBUjJvBsJ8vxHanB0TeI1RdtC7sGqJjhD4ABZB8Gh_lq59oqr0Hs8CugzoQWHHVSdizRktTxm5dFl_HXJuGZEVSbC-BQTzvwmKjZdL1u-5bl7IYdsA0UWv-xooyV7mnKUaOWbPovLOWU4SFgrCEGRg6s5hcqXqphn7ooSGUcv0kM_JleI7hSrX2mSaQNihNhxcbwszXS9mnl2jRRZOVEWxyzDh5yU8WYFGTyWOsPBzoRf_uCTLOh7__FKf7CBnTEiAkLIV9A13_AAPOdIt4iuNAw4PvNr9Tp73YoDgfKEZDAXfYcEJ4hA-Xan3slvF1m0CjEobkhzC5m94II-CSldRDfF2nhzAyBfbhYXUqFTEwDQ5CiXilrKIHk77DC1d2w6YVm6kFsfyYnP6osioZnCgBUOn-TMAfw_R-iJZ9FpzEEmCZw6_2MxZlM4BKJX6MeYhqEaCTUGLts8pUyYX9IgdoNooErAk2qxXZR-ECQt75taKKZzGIGnLfsHlzieqIW2VdacJJs_xWMCo9gHf3kHY0U7xXUvk6i9tSoiaLMhvIYkNkkLXwimfaYpm_IAQkFuRjgx3elW7NJkNDFq1bcTDnGIJ5eyJpOxn4onsuhXJfiVCLoCJVx6rDwbOVlO5sokqzJ3RyVo_JElwkolGpqylHxOBIpcJUau8keZsmXEpnaVwoJiHIsewKtb3jo-UZU2nVVVCeY4ZBISzOCSngsOtkKLPTNNeMV3XeYk0hCvbZYdLPGHsxijBQx7CwJinjMf2RYXFwxSNWatjEQzSaPPO8iqpxN8wTcFNTxp5qZbpqB-z0GvTiyTRsAV-vUUkdUe08NpLScCcWW2-wGdicYJnLSPQ6pQUmEPcawgwmGAeXzB09pSEqu2srMMX_U0M4hIJiadb8trn8vKSJcfGgrQGvx2ayQFqSOdIEYrQdQAFaS6gRQUnjNjFBSQQCLJ_rkHv8aX5Wg_F5NXiMO7oNdit3mJGFt1hwmSDFOeTuxY7fsZiLGdwvjJW7mtQER5-ccj8Ge1iAYMVXh3H2cTukfAlfBexZIl_MI-CaVkU_yZuoQN2BxhnzxvQoMSzKq-16J8m7wkLtesFOIN5xqF-TmACVVRm5stojYvOdYEbkhmpguAiooG-9vDNzROXctzi0wda8SvyRi9_ZwI50SJ-himfUJMYpl87SK4JdQSzfQRqHwDWhInY_u-zLR_woRWnypZwFRtsdy1TKw0l4VJKtcH1CYq0jt114kKisARlwN5vWmQpmxx8wBgeDdNkFRtSNAItJLPakxiK8U5R8hparcKBCIJxyk0M-SISdpmn5MaWFcMo5EqEjMx6tNIYBVzVcpoKBqVbgCKX9hYm2EF0jdekWcXyRVhXOA3xcyTxmNDL1SCfPpg97c7JHSaUwoy14UxjBI_afYYA0WjDrV9LiKkquWUNDF31zZxMfIabHICf_F-UbJqXpSw0aQfo9JM7CCRAhh2y7NJPDtVkeaVNKcsl-YavYkEnHWJCua9nPe6c9A3iulEFMVFwvQgMNSwT7yWGMOIdSSp5jREqLmHKakjXAJbQ9rKVHW4hceU8xeU-9hT1RGeCsUC9vuRFiHHMGqYCWNx_vE0_JdzWsUeiLGke2JkESZjf-kcSwlMuTFSD2mCnYAM6PZIX0I8hbLL8FtAuGSkptG8I_GttmeQTxMTRryuzwgp6WdNrEKugaEfJvBCLGNehWsvBNpBrizOEVqj-fucJqMMfBAyteu1EyRu3OIFCPZ96zyhjslGooOVXFtyZcZ3eklr0ZNTIiYLMxF8FLeLx2cd29Ci-ZmF-_zC_5sW_5a-p0EloqCekxCxDKmegROt5NuEL6wRxnGYPtslVRUmxHiIK2SqWksIYZVeBqIs6vKFcLKyxnqMsdlaKqo-9LqBFZcnz1uhbaA6sXS0NfiTVSwa7dlRwqpGmmt9vUnE7LMjEPWRcSRomtzF4omBHyrOxOC7iSIuo-tBkIct5eEXJsQQuANWXdvcA_mCkgz-O7f1W5byWwqe0HHzsELQUZtBmoe-254", + key_ops: [], + }; + const pk = await suite.kem.importKey("jwk", jwkPub, true); + const sender = await suite.createSenderContext({ + recipientPublicKey: pk, + }); + + const jwkPriv = { + kty: "AKP", + kid: "01", + alg: "ML-KEM-1024", + priv: + "Y0cDVxEIKPJbI-3IDtKA7NOYqfUyUcMzJ1TeKvCxXpAequa7kbJ810jEAsQREUDVqULPPJX_eXf4jS71Fbsm0A", + key_ops: ["deriveBits"], + }; + const sk = await suite.kem.importKey("jwk", jwkPriv, false); + const recipient = await suite.createRecipientContext({ + recipientKey: sk, + enc: sender.enc, + }); + const encrypted = await sender.seal( + new TextEncoder().encode("Hellow world!"), + ); + const pt = await recipient.open(encrypted); + assertEquals(new TextDecoder().decode(pt), "Hellow world!"); + }); + }); +}); diff --git a/packages/ml-kem/test/runtimes/browsers/ml-kem.spec.ts b/packages/ml-kem/test/runtimes/browsers/ml-kem.spec.ts new file mode 100644 index 000000000..10dde4602 --- /dev/null +++ b/packages/ml-kem/test/runtimes/browsers/ml-kem.spec.ts @@ -0,0 +1,11 @@ +import { expect, test } from "@playwright/test"; + +test("basic test", async ({ page }) => { + await page.goto( + "https://dajiaji.github.io/hpke-js/ml-kem", + ); + await page.click("text=run"); + await page.waitForTimeout(5000); + await expect(page.locator("id=pass")).toHaveText("6"); + await expect(page.locator("id=fail")).toHaveText("0"); +}); diff --git a/packages/ml-kem/test/runtimes/browsers/package-lock.json b/packages/ml-kem/test/runtimes/browsers/package-lock.json new file mode 100644 index 000000000..ebefb12d9 --- /dev/null +++ b/packages/ml-kem/test/runtimes/browsers/package-lock.json @@ -0,0 +1,75 @@ +{ + "name": "browsers", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@playwright/test": "^1.45.3" + } + }, + "node_modules/@playwright/test": { + "version": "1.45.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.3.tgz", + "integrity": "sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.45.3" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.45.3", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.3.tgz", + "integrity": "sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.45.3" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.45.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.3.tgz", + "integrity": "sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/packages/ml-kem/test/runtimes/browsers/package.json b/packages/ml-kem/test/runtimes/browsers/package.json new file mode 100644 index 000000000..fd7ee5572 --- /dev/null +++ b/packages/ml-kem/test/runtimes/browsers/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "@playwright/test": "^1.45.3" + } +} diff --git a/packages/ml-kem/test/runtimes/browsers/pages/index.html b/packages/ml-kem/test/runtimes/browsers/pages/index.html new file mode 100644 index 000000000..9e9acd4b0 --- /dev/null +++ b/packages/ml-kem/test/runtimes/browsers/pages/index.html @@ -0,0 +1,107 @@ + + @hpke/ml-kem test + + + +

+ @hpke/ml-kem + test +

+ +
+ + +
+ +
+ +
+ + + + + + + + + +
pass:-
fail:-
+
+ + diff --git a/packages/ml-kem/test/runtimes/browsers/pages/src/.gitkeep b/packages/ml-kem/test/runtimes/browsers/pages/src/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/ml-kem/test/runtimes/browsers/playwright.config.ts b/packages/ml-kem/test/runtimes/browsers/playwright.config.ts new file mode 100644 index 000000000..5d2c4e047 --- /dev/null +++ b/packages/ml-kem/test/runtimes/browsers/playwright.config.ts @@ -0,0 +1,21 @@ +// playwright.config.ts +import { devices } from "@playwright/test"; +import type { PlaywrightTestConfig } from "@playwright/test"; + +const config: PlaywrightTestConfig = { + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + { + name: "webkit", + use: { ...devices["Desktop Safari"] }, + }, + ], +}; +export default config; diff --git a/packages/ml-kem/test/runtimes/bun/.gitignore b/packages/ml-kem/test/runtimes/bun/.gitignore new file mode 100644 index 000000000..9b1ee42e8 --- /dev/null +++ b/packages/ml-kem/test/runtimes/bun/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/ml-kem/test/runtimes/bun/.npmrc b/packages/ml-kem/test/runtimes/bun/.npmrc new file mode 100644 index 000000000..41583e36c --- /dev/null +++ b/packages/ml-kem/test/runtimes/bun/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/packages/ml-kem/test/runtimes/bun/README.md b/packages/ml-kem/test/runtimes/bun/README.md new file mode 100644 index 000000000..10da54492 --- /dev/null +++ b/packages/ml-kem/test/runtimes/bun/README.md @@ -0,0 +1,16 @@ +# bunx + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.22. [Bun](https://bun.sh) +is a fast all-in-one JavaScript runtime. diff --git a/packages/ml-kem/test/runtimes/bun/bun.lockb b/packages/ml-kem/test/runtimes/bun/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..558dbfccee637f47b004a441369a8b98d1b01aa8 GIT binary patch literal 3792 zcmdT{Yj6`)6yAgsN&v&7WgHzK1?oY)1uY2gV1qfC>u8bSR#?*-IA3mV$K#&&3=H!a=1f55(RuTje)m*+I zcG9*kjcr3o#-!Doez>CAyfb5TmSVVKYowz2Ygv2Pej*4jbB9yuEC!wfto1oV3Q!^*7RU z7q>?{jt-34lcrz#$Kor6$5xEIJie03c{}p+X;TI}Elr&nt9GsZy4Jg9;b~^gGrriE z*Xewq|5uhGq49nmmJH+ZIXo;LRSB63h6&CI?FS8937Gb37{3XkrpoY7^@<8EV*DMr zl?eDS@K7&8YK&lD4>OFP0ZC5>dt)~Z^5#+~em`qaZ_Epc5D8oJ)Aj^Ea) z$z=rNp^>}KOiS0UbFrN=UR-BHuUfP7;Np#MZ632XJAL@?x2xMW{5b8SjnUb6ziak) zKDnc|;lzovn!2%X&bj{6rOK;uyWU^8Keh4J`KqjuqdG5_+V}fqyz;(RZTafp#a3oP zvb(7?X1cPeBE2zlOKWmMIbD>uGHlg3q3%HZNq$LEgHRNap+BssJjf^cYniwKN$-Y~ zEXs*lCF30^KZnR!E2m!kKzLTYK4Ve!hvTw*VOd3!uO6P-oP6PiM`%b`wSkX&lT%Ui1=Ze92yE!@^wRwv^{eT_}k-g2ty&U4#SI*w->W5!$R>;nrF z{t@-4`PJPPzG8DwEmKa_U5A+o!jXt;lmVjMyEupS$(m}esOq+V2cqSC{PE>!8r3#dn|m9XYhh9K3U0T!&n zuqsrB=wM|ctki>tn;RbSj~eG`YVic)Hj_b7X3%Kyz%KW46FCY+;ht5Ii{ZeFrD- zR*`jIS6Dq)QxS#)J-Vl9Uu*eg%%Vnt=V=ZY=eB5;8XOF3PfRIt*=fq^RJU92lL znoNc%I=eTY<`Uw~f#@EWiv+>NCsGtg7c#uSc}dn)ypSiITp<-qfYPBfbf}VMQYb7# z7h-n3pzp;;WbFe!N$(8w=! uVq=*Q*@M$4;Q?L3>%;~&ibo>$MW7dY!3WC=1i=e { + for (const kem of [0x0040, 0x0041, 0x0042]) { + for (const kdf of [0x0001, 0x0002, 0x0003]) { + for (const aead of [0x0001, 0x0002]) { + try { + const suite = new CipherSuite({ + kem: createKem(kem), + kdf: createKdf(kdf), + aead: createAead(aead), + }); + const rkp = await suite.kem.generateKeyPair(); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + const ct = await sender.seal( + new TextEncoder().encode("hello world!"), + ); + const pt = await recipient.open(ct); + expect(new TextDecoder().decode(pt)).toBe("hello world!"); + } catch (e: unknown) { + expect().fail("ng: " + (e as Error).message); + } + } + } + } +}); diff --git a/packages/ml-kem/test/runtimes/bun/package.json b/packages/ml-kem/test/runtimes/bun/package.json new file mode 100644 index 000000000..234ffc556 --- /dev/null +++ b/packages/ml-kem/test/runtimes/bun/package.json @@ -0,0 +1,15 @@ +{ + "name": "test", + "module": "src/index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@hpke/core": "link:@hpke/core", + "@hpke/ml-kem": "link:@hpke/ml-kem" + } +} diff --git a/packages/ml-kem/test/runtimes/cloudflare/ml-kem.spec.ts b/packages/ml-kem/test/runtimes/cloudflare/ml-kem.spec.ts new file mode 100644 index 000000000..4615d6b44 --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/ml-kem.spec.ts @@ -0,0 +1,20 @@ +import { SELF } from "cloudflare:test"; +import { describe, expect, it } from "vitest"; + +describe("Cloudflare Workers", () => { + describe("GET /test", () => { + it("should return ok", async () => { + for (const kem of ["0x0040", "0x0041", "0x0042"]) { + for (const kdf of ["0x0001", "0x0002", "0x0003"]) { + for (const aead of ["0x0001", "0x0002"]) { + const res = await SELF.fetch( + `https://example.com/test?kem=${kem}&kdf=${kdf}&aead=${aead}`, + ); + expect(res.status).toBe(200); + expect(await res.text()).toBe("ok"); + } + } + } + }); + }); +}); diff --git a/packages/ml-kem/test/runtimes/cloudflare/package.json b/packages/ml-kem/test/runtimes/cloudflare/package.json new file mode 100644 index 000000000..efcf0b8ea --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/package.json @@ -0,0 +1,23 @@ +{ + "name": "test-cloudflare-hpke-ml-kem", + "version": "0.0.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev", + "start": "wrangler dev", + "test": "vitest run", + "cf-typegen": "wrangler types" + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.4.5", + "@cloudflare/workers-types": "^4.20240903.0", + "typescript": "^5.5.2", + "vitest": "1.5.0", + "wrangler": "^3.60.3" + }, + "dependencies": { + "@hpke/core": "^1.7.1", + "@hpke/ml-kem": "^0.1.0" + } +} diff --git a/packages/ml-kem/test/runtimes/cloudflare/src/index.ts b/packages/ml-kem/test/runtimes/cloudflare/src/index.ts new file mode 100644 index 000000000..ee122f05b --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/src/index.ts @@ -0,0 +1,7 @@ +import { testServer } from "./server.ts"; + +export default { + async fetch(request: Request): Promise { + return await testServer(request); + }, +}; diff --git a/packages/ml-kem/test/runtimes/cloudflare/src/server.ts b/packages/ml-kem/test/runtimes/cloudflare/src/server.ts new file mode 100644 index 000000000..7a5628e02 --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/src/server.ts @@ -0,0 +1,102 @@ +import type { AeadInterface, KdfInterface, KemInterface } from "@hpke/core"; + +import { + AeadId, + Aes128Gcm, + Aes256Gcm, + CipherSuite, + ExportOnly, + HkdfSha256, + HkdfSha384, + HkdfSha512, + KdfId, + KemId, +} from "@hpke/core"; + +import { MlKem1024, MlKem512, MlKem768 } from "@hpke/ml-kem"; + +function createKem(id: number): KemInterface { + switch (id) { + case KemId.MlKem512: + return new MlKem512(); + case KemId.MlKem768: + return new MlKem768(); + case KemId.MlKem1024: + return new MlKem1024(); + default: + break; + } + throw new Error("ng: invalid kdf"); +} + +function createKdf(id: number): KdfInterface { + switch (id) { + case KdfId.HkdfSha256: + return new HkdfSha256(); + case KdfId.HkdfSha384: + return new HkdfSha384(); + case KdfId.HkdfSha512: + return new HkdfSha512(); + default: + break; + } + throw new Error("ng: invalid kdf"); +} + +function createAead(id: number): AeadInterface { + switch (id) { + case AeadId.Aes128Gcm: + return new Aes128Gcm(); + case AeadId.Aes256Gcm: + return new Aes256Gcm(); + case AeadId.ExportOnly: + return new ExportOnly(); + default: + break; + } + throw new Error("ng: invalid aead"); +} + +export async function testServer(request: Request): Promise { + const url = new URL(request.url); + if (url.pathname !== "/test") { + return new Response("ng: invalid path"); + } + const params = url.searchParams; + const kemStr = params.get("kem"); + const kdfStr = params.get("kdf"); + const aeadStr = params.get("aead"); + if (kemStr === null || kdfStr === null || aeadStr === null) { + return new Response("ng: invalid params"); + } + const kem = Number.parseInt(kemStr); + const kdf = Number.parseInt(kdfStr); + const aead = Number.parseInt(aeadStr); + if (Number.isNaN(kdf) || Number.isNaN(aead)) { + return new Response("ng: invalid params"); + } + + try { + const suite = new CipherSuite({ + kem: createKem(kem), + kdf: createKdf(kdf), + aead: createAead(aead), + }); + const rkp = await suite.kem.generateKeyPair(); + const sender = await suite.createSenderContext({ + recipientPublicKey: rkp.publicKey, + }); + const recipient = await suite.createRecipientContext({ + recipientKey: rkp, + enc: sender.enc, + }); + const ct = await sender.seal(new TextEncoder().encode("hello world!")); + const pt = await recipient.open(ct); + if ("hello world!" !== new TextDecoder().decode(pt)) { + return new Response("ng"); + } + } catch (e: unknown) { + return new Response("ng: " + (e as Error).message); + } + return new Response("ok"); +} diff --git a/packages/ml-kem/test/runtimes/cloudflare/tsconfig.json b/packages/ml-kem/test/runtimes/cloudflare/tsconfig.json new file mode 100644 index 000000000..50a352e37 --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/tsconfig.json @@ -0,0 +1,106 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": [ + "es2021" + ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "jsx": "react-jsx", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "es2022", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "Bundler", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": [ + "@cloudflare/workers-types/2023-07-01" + ], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + "checkJs": false, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/ml-kem/test/runtimes/cloudflare/vitest.config.mts b/packages/ml-kem/test/runtimes/cloudflare/vitest.config.mts new file mode 100644 index 000000000..973627c26 --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/vitest.config.mts @@ -0,0 +1,11 @@ +import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; + +export default defineWorkersConfig({ + test: { + poolOptions: { + workers: { + wrangler: { configPath: "./wrangler.toml" }, + }, + }, + }, +}); diff --git a/packages/ml-kem/test/runtimes/cloudflare/wrangler.toml b/packages/ml-kem/test/runtimes/cloudflare/wrangler.toml new file mode 100644 index 000000000..4abfd028c --- /dev/null +++ b/packages/ml-kem/test/runtimes/cloudflare/wrangler.toml @@ -0,0 +1,108 @@ +#:schema node_modules/wrangler/config-schema.json +name = "cloudflare" +main = "src/index.ts" +compatibility_date = "2024-08-21" +compatibility_flags = ["nodejs_compat"] + +# Automatically place your workloads in an optimal location to minimize latency. +# If you are running back-end logic in a Worker, running it closer to your back-end infrastructure +# rather than the end user may result in better performance. +# Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement +# [placement] +# mode = "smart" + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Docs: +# - https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables +# Note: Use secrets to store sensitive data. +# - https://developers.cloudflare.com/workers/configuration/secrets/ +# [vars] +# MY_VARIABLE = "production_value" + +# Bind the Workers AI model catalog. Run machine learning models, powered by serverless GPUs, on Cloudflare’s global network +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#workers-ai +# [ai] +# binding = "AI" + +# Bind an Analytics Engine dataset. Use Analytics Engine to write analytics within your Pages Function. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#analytics-engine-datasets +# [[analytics_engine_datasets]] +# binding = "MY_DATASET" + +# Bind a headless browser instance running on Cloudflare's global network. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#browser-rendering +# [browser] +# binding = "MY_BROWSER" + +# Bind a D1 database. D1 is Cloudflare’s native serverless SQL database. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#d1-databases +# [[d1_databases]] +# binding = "MY_DB" +# database_name = "my-database" +# database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a dispatch namespace. Use Workers for Platforms to deploy serverless functions programmatically on behalf of your customers. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#dispatch-namespace-bindings-workers-for-platforms +# [[dispatch_namespaces]] +# binding = "MY_DISPATCHER" +# namespace = "my-namespace" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#durable-objects +# [[durable_objects.bindings]] +# name = "MY_DURABLE_OBJECT" +# class_name = "MyDurableObject" + +# Durable Object migrations. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#migrations +# [[migrations]] +# tag = "v1" +# new_classes = ["MyDurableObject"] + +# Bind a Hyperdrive configuration. Use to accelerate access to your existing databases from Cloudflare Workers. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#hyperdrive +# [[hyperdrive]] +# binding = "MY_HYPERDRIVE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#kv-namespaces +# [[kv_namespaces]] +# binding = "MY_KV_NAMESPACE" +# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Bind an mTLS certificate. Use to present a client certificate when communicating with another service. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#mtls-certificates +# [[mtls_certificates]] +# binding = "MY_CERTIFICATE" +# certificate_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues +# [[queues.consumers]] +# queue = "my-queue" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#r2-buckets +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# Bind a Vectorize index. Use to store and query vector embeddings for semantic search, classification and other vector search use-cases. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#vectorize-indexes +# [[vectorize]] +# binding = "MY_INDEX" +# index_name = "my-index" diff --git a/packages/ml-kem/tsconfig.json b/packages/ml-kem/tsconfig.json new file mode 100644 index 000000000..5a7fecfcf --- /dev/null +++ b/packages/ml-kem/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "es2022", + "target": "es2022", + "paths": { + "@hpke/common": ["../common/mod.ts"], + "@hpke/core": ["../core/mod.ts"] + }, + "noEmit": true, + "allowImportingTsExtensions": true + }, + "include": [ + "mod.ts", + "src/**/*" + ] +} diff --git a/test/vectors/kat/kat_MLKEM_1024.rsp b/test/vectors/kat/kat_MLKEM_1024.rsp new file mode 100644 index 000000000..0576a4a14 --- /dev/null +++ b/test/vectors/kat/kat_MLKEM_1024.rsp @@ -0,0 +1,110 @@ +count = 0 +z = f696484048ec21f96cf50a56d0759c448f3779752f0383d37449690694cf7a68 +d = 6dbbc4375136df3b07f7c70e639e223e177e7fd53b161b3f4d57791794f12624 +msg = 20a7b7e10f70496cc38220b944def699bf14d14e55cf4c90a12c1b33fc80ffff +seed = 23f1c88bd0e65f2c891ce865bd3275a7ffdbe4f9036e75b96aad0412650e9cd2ea4591d4ab7131ea971b34c23a4ed245 +pk = a8122f376b3f5d355263eba522c43995044beca78b9ba9924b87035490ae78a94d523c7ba588a386eb49bf652fdf12716373187a1ca047cc6138627aaeab8f6cebbf87a176b86c9f7f093c8f5b0bdc147399e839ae737038d0bd0142369f9c9d46b25b9ae540b80023d5d757e76b3fdd3064dd2b44cd06b44369277147b615654b325044e1bc606fa629055a2e6a4b02b2f1b1aa98a69391c91bd98f1058aa18d9019ddbb6dce60a070bad4bec3df37a0d4dda8410288830e9ae509880a02b248e1bba8edb1cc520517c11b64d68cc00c69475a2a2d9c56a2773a02424b2bef17ddfb4c4cc503d05c888946579e4027dbf8a89370c74fa66c8a325c2342963994c202fa05179352f92a18630822892151a7b8b163eea685c2c4f026015fee782f1c53ca573807afc6bc766be008796fbb906e9e1abd1cc845f60423f0978df89924aa118a2b41c7f458308e87b190a27002ba7f773cb65ec87165a6530a0971a752069a42afbd271e1e236fc155aeff759ec762551e5bcdf3a66d6a9af92b4ce14a29ed410cf72a808e90c81a46074611059802391006c52c5994519718a84f445e8d9c3c6616e0268b2e1d5af48b091c6053b7477740fea361853364de642a44b83364235b6a865037878074b37400c82591794a09055d5b34a9f186e1574ccb3848f4b620016d807b945485bc4c9e17644fea65f5345c862d83aa1a4cd1b676409fa545c5712613c267b80447df08c87e532bd77500c14b08d7ac00dc7c2fa50b1b5c26d27dca74ad41f9b0761426321a9b3a992a4c3fa151021bc2d17c88faab7274e65cc23d283ab55a951495872455bcce806a9e803c2d9b566a6addebb78120ba9361ca9b8b10323f682cc5b9131d44f262501ed861c866c9e31d09789f81dc3c773a4464c4cc9c4cb838b9bdb16ff26227a9871c57734b5c59c27e77f061a7b56963296f48ae58a85e34063aaf644fee4178b3a9647191c4f022356cc5b17e247644a809be0c04ca57df1dbbcaf1c2b1645217a615b98aa048ca48ad7254f5b859249066abf6a33d59521b07cc684a1ac23089101c80dfacb82094445d3358e6eb6461cf614cbc22248259ed19ab0d6498f3f20c660e9aa5ae877d2973611a377b14860f9398408575af51819936883d080218ab0acafbb639a3019a38878a45a1264b30f709c46a3fa5e2d571f8f594d3ba90c432813b78005e1d20b72551f87e978fcd8487bb584a4e97a66a058a9a750d15c479919c81ed235803b8a657a8e08804f8c109f8dd16074124df22b0c4b276d2ac865b55a538d73826226216ba21ec7368f30c638e3f201288a23c2861c3c88599f9027120b0dd7575a8855c5411554f699b47ec667a3b2a62f828b2458965130126f29b7525205ef335d4740020a61c9c742aa3be0048eac3aa69b7d9a18846e5498e66b8ed550cdbd91bbe0d0482347bfc39964f3f63cf4967ea9321418c377b8262e63225e17621ffea466a6335e822059e46a8a5eb16ff321b3a043588c0bb6e5d2b4f3a8c100b05bf2715523433dbab50491216b9cdc2d526aae3bd218404c33beba959719b48cc9ae4753512b171c75763b38fb4ddca82750abb505b8c3fc519e7536560d639ef2476953b7bd7966c13bd09e8af17a542ab4927151ad4a46e8843c055591e78ca8b4e5956822815a3c98eff1b9cc49aea06bcd24f9c70941a3d3f0810de25afc154dd76069f2c2c367bb52a2c309ccf1708d514d3f871cc4e3bafe91549b44bbf4b24c5525a19bb6abd50c693407851e1a7632883f783a08e5483e7ca7876e4b2889417d7ec147e8624e4c83b8bb56bdef29aa47a5735034b48beb8c36c6223f184502ecb3f8072d61e41cc8a21784a24be3c652f2d697a5a28ad605cbf0cb1f928a25a13a9933700481f341b2a3c279021ed2d701303699aab12df4886303d3b3e2949341b577f85ac326284a85f2494976790e762ec51c1a88faa2f5e03c0fab44e399735374502f0029cfdb74e9e1517263654262320ff3c15ff48067c701df8436507373fdc7a475f13d961a45718ba1a4b56f02d0095030194a5cb34838728387a33a310561e73d18c2af34116384879cfd2c70aae0400eec2bd667c2a4c5a051e643c7d8ae8d1bab4352b9bd27b3e647259bb1cccb2304d725cb2e73c6718b5abc88800949b2c1d03f159fbf396adca8526f1b476f80fe91c13308d645 +sk = 4b8ac400218a249150aff2339367484a6bcbf637646cf750156a7b35a936d05a25647a3368e4891a030beba99ff9d550ca830ebf9b4aae231fc2dc4073aa98411a188bc2442c5349f20140c5a378037679840b23a795bd0ed5949d0b5d663bb01c575d7ff34594f4007053194ca6c4ecf90458e64f80e98ecfc9b062945eb12922c5813fd1b9370b7ace2cb5707d72846274af203cc6bfb18a2fb35265b1160c33393ab658d712434a9149616bca8b839c8ffa85c7054d6e697e6f181b310858774c94fb4089804b989cc91cb3dca5da8b31b4733271b412cc38477b46836b088373a5338d6816e7f8993ceb16e260086203c465a769be7968a9189c5e0283de590d5c61c5b1a383d1635bedd47ba4c86d803c625f22ba8a86093f03baa8c638958805b5367e1b793705d0c5aaf36f2a52c01c803516b0c38e8407b3e61332453cc37b73ea629117d069b937038fe99f3e069766b491a503540a585382619d25590f2ba31fd125a24fe066b63a215cb6cfa581381b0b91c3ec4ee5e15f6f566330da146f32652343afcbc56293b30ebe399bd08327b1f656b15baefde61f7a551932c9b4d2c88eef799b3bf85c2886b7dc31b81cda27c0b73bf4cb22715482979974887aad36297f3e0365d8c6164ae974d0ecb0997250a7e92a74fc3d5abc3d78d23076639f9dd74374ec54ec0a32f6bac11ce8acc2eb70ec4c93ace48688e65b084725fc3899dc7ac1469cbb00588782e2792c30c4fee8ac44168d8abc8c535a3987970c9c706aef78b8de590569791cc1c9b3e8f72a49cc478ff2abb0e5616132693dfb7cb5386fcf6ac7747ab328d12d88496764fcb8ee682c886462da1ac8b028aeb65b6c77fc94f6511ef6c20f66485ca6ea27b7ba339f8865fa10957ef2c7efb46ca5841976d6b3dccc7537152f8e142cb18c93e232124a426f0b0288a3045c94f5a9450156d8f590a497995f68c7b23799be486163b261e933b1c161b148db3d0634241810b92df78d18989f25c79f9d081fa13b2607e099cfa15567e83faa94b4dd5c3aaef8672f533e1d643c19500b20b55fb4107b97e64409e8910ffc052a91b55a90206aa23901761be9e8577ff6277d087c10d54cc611259dc3a5bf094556a6542d5508de81a528a2c1c2da3bfc821894f22de933007a4b0291a46b655986859b183fa5393c4c6acb74876159a86a797f14646bb85612bbc3ba9af491b180b3097896c1ea7164e148b3a2b37fbbc049c2cefe8863faf4779bc0a3d2203c4d6578b4680ed2510f7039783a6a771a7b97287a511158c4eb6455a1ebb8fc983c780bb28891644f360a98b4b954b8a283470f472096360703ae9a63358703a00365da3ba05e0244820663d15784ae793772116b24f3201ec799a030aacdb433d11409eb98b1db93a04a9c654a6188cb8474c280b4dbd43f386a3f4499ab7529556a38449d30181088aa323846c2db45a1d9359ed40d0429a250b66015173b2aaa532523606737a1f823258529393d28c9fc213b376207d9c539a2a4908aa96230f2c13801a6b36925b4166196373ec7f743031acd723b631232458abaaa019365d48915d62b4f30a1bcee39334cf9959f168e0b6baf63519cd2584ce780ca7c280f3c395725b03a0a518353d2b2fddc563ba28ebcc2101153841e5a17ae302bbde2b800dbb2bd60ad294439384154967274fe142b437b64a4f0a6a7a06c96ac837d488d9868ca00f3bf189ac2172873d65b284a07c3d88ac626da319e534031ccb825ba60c55210638b74a57ac598c550ae17ab4ae272eae28e3b560cd2622734e3661ec325bad6451ae1abe5e748a34c3b14ba7d13fb9bb3705a17b704e6d49ba064641bcccb29d27e1544cd1878b37b4944e56527ec854c8d06cd30da9614032779b705c40216b4b76333c757b09c8ccf1190471397600356dc7422f2f5569de11f6a6542b1e12a8e7277172402204571230a0885c41dc89004e7c5cbc2973b9640cf710b72bdf3acfc0550788b296c4249ce30a0be86632b9b973a77b53d363133d007d04a99a879587d155073171bf4992e2d989fab06aa6799493b7868c92a58b68b7df4238630da07fe443c49c149beb058d0d6403957be71c5475c46c866c1c1859a14301681f772cd780962534153d7e91e39862466e99fa8122f376b3f5d355263eba522c43995044beca78b9ba9924b87035490ae78a94d523c7ba588a386eb49bf652fdf12716373187a1ca047cc6138627aaeab8f6cebbf87a176b86c9f7f093c8f5b0bdc147399e839ae737038d0bd0142369f9c9d46b25b9ae540b80023d5d757e76b3fdd3064dd2b44cd06b44369277147b615654b325044e1bc606fa629055a2e6a4b02b2f1b1aa98a69391c91bd98f1058aa18d9019ddbb6dce60a070bad4bec3df37a0d4dda8410288830e9ae509880a02b248e1bba8edb1cc520517c11b64d68cc00c69475a2a2d9c56a2773a02424b2bef17ddfb4c4cc503d05c888946579e4027dbf8a89370c74fa66c8a325c2342963994c202fa05179352f92a18630822892151a7b8b163eea685c2c4f026015fee782f1c53ca573807afc6bc766be008796fbb906e9e1abd1cc845f60423f0978df89924aa118a2b41c7f458308e87b190a27002ba7f773cb65ec87165a6530a0971a752069a42afbd271e1e236fc155aeff759ec762551e5bcdf3a66d6a9af92b4ce14a29ed410cf72a808e90c81a46074611059802391006c52c5994519718a84f445e8d9c3c6616e0268b2e1d5af48b091c6053b7477740fea361853364de642a44b83364235b6a865037878074b37400c82591794a09055d5b34a9f186e1574ccb3848f4b620016d807b945485bc4c9e17644fea65f5345c862d83aa1a4cd1b676409fa545c5712613c267b80447df08c87e532bd77500c14b08d7ac00dc7c2fa50b1b5c26d27dca74ad41f9b0761426321a9b3a992a4c3fa151021bc2d17c88faab7274e65cc23d283ab55a951495872455bcce806a9e803c2d9b566a6addebb78120ba9361ca9b8b10323f682cc5b9131d44f262501ed861c866c9e31d09789f81dc3c773a4464c4cc9c4cb838b9bdb16ff26227a9871c57734b5c59c27e77f061a7b56963296f48ae58a85e34063aaf644fee4178b3a9647191c4f022356cc5b17e247644a809be0c04ca57df1dbbcaf1c2b1645217a615b98aa048ca48ad7254f5b859249066abf6a33d59521b07cc684a1ac23089101c80dfacb82094445d3358e6eb6461cf614cbc22248259ed19ab0d6498f3f20c660e9aa5ae877d2973611a377b14860f9398408575af51819936883d080218ab0acafbb639a3019a38878a45a1264b30f709c46a3fa5e2d571f8f594d3ba90c432813b78005e1d20b72551f87e978fcd8487bb584a4e97a66a058a9a750d15c479919c81ed235803b8a657a8e08804f8c109f8dd16074124df22b0c4b276d2ac865b55a538d73826226216ba21ec7368f30c638e3f201288a23c2861c3c88599f9027120b0dd7575a8855c5411554f699b47ec667a3b2a62f828b2458965130126f29b7525205ef335d4740020a61c9c742aa3be0048eac3aa69b7d9a18846e5498e66b8ed550cdbd91bbe0d0482347bfc39964f3f63cf4967ea9321418c377b8262e63225e17621ffea466a6335e822059e46a8a5eb16ff321b3a043588c0bb6e5d2b4f3a8c100b05bf2715523433dbab50491216b9cdc2d526aae3bd218404c33beba959719b48cc9ae4753512b171c75763b38fb4ddca82750abb505b8c3fc519e7536560d639ef2476953b7bd7966c13bd09e8af17a542ab4927151ad4a46e8843c055591e78ca8b4e5956822815a3c98eff1b9cc49aea06bcd24f9c70941a3d3f0810de25afc154dd76069f2c2c367bb52a2c309ccf1708d514d3f871cc4e3bafe91549b44bbf4b24c5525a19bb6abd50c693407851e1a7632883f783a08e5483e7ca7876e4b2889417d7ec147e8624e4c83b8bb56bdef29aa47a5735034b48beb8c36c6223f184502ecb3f8072d61e41cc8a21784a24be3c652f2d697a5a28ad605cbf0cb1f928a25a13a9933700481f341b2a3c279021ed2d701303699aab12df4886303d3b3e2949341b577f85ac326284a85f2494976790e762ec51c1a88faa2f5e03c0fab44e399735374502f0029cfdb74e9e1517263654262320ff3c15ff48067c701df8436507373fdc7a475f13d961a45718ba1a4b56f02d0095030194a5cb34838728387a33a310561e73d18c2af34116384879cfd2c70aae0400eec2bd667c2a4c5a051e643c7d8ae8d1bab4352b9bd27b3e647259bb1cccb2304d725cb2e73c6718b5abc88800949b2c1d03f159fbf396adca8526f1b476f80fe91c13308d6452fd626053c941502e28d796cd655a3cd49df9f15ca02ad626e486f6a4921106bf696484048ec21f96cf50a56d0759c448f3779752f0383d37449690694cf7a68 +ct_n = 96ac6243c9b1272be77b975a4048bf00ff2c48f94a3483362449273880d45e54bda15729682bf591a74382a708beb78118cab29ad74ac2f405ba720076dfb57188dc168487cd20081f6bf412f257dea03406b23a6a752e478ba4ef9c7c0f4810921fa32545be64dc5d9f18d4e1320efc6508154cda35ab912d059e0291a1150ae0a10da5e3d7bd221a851c598df4d0b18daa920976556099d1c0de4e222d5304d44fa9cb9bd4ffe15769dd6c4793fa809f5264cf0febca4b5975ba287639783aa1f4b645ff7a00d46ee7b19fec17b3e83bcaf4361d5349e30ceab60c386b6b0d1b90d8b336ee6a627ad2a38670cb5113b0fb4ac2ddc4250097483fefd182670ea40f0f45cce90b9ed58dafaef657d64e25fd6692a69721994e7d00b4949205ebe4c4f9c46ee5a1018b220a26d80ae2d2b486372e974d75b20a005b1616ad1e13d162915cc24f274670d1e5e8bd345874a7e7c9759c8e43ff33689200739a613395f7ae78d73c6a7b90f65ab511f0df3c5dca85d0b9430b4e97098715ff823b617321799aea0ab9c72234780339ec7b541d5e6f8c1551146c24a65411811b23674c26123356cf233351382c3994cba5dc6c25a07e1ba9af33eca18bba3e97935e3abdf07e9fa32cecf241e7cafc6592db4ee487ff2b98a4a47805dee17fd93448dc98457b753ed4995ee6b1bfa9ff1d386c91f396ca8f48cab5b09a782ec3b616a87a6448a96236c4655413af755323d36a8db2e16509454489e6ec83629130cd2a54817918af362c83183494b4b590dbaf69cf399d3e2dc3e9c0c1224f148e65ef68287341ab72ad58adfc69b28e27e91ebbf830fac53b94f762f01cc9b1561ae35f16edabf51ff164c1309d1fdb52cd2bfedb5a492eb65cb9fc86b8f05ed26d13233fb0a3eb33a9dce2cf98e6516cee42fbe1e97e20ab6c9965f58a377dc73e530667ab8f45e6a70b23db50f0df411732d8acdabe50c51adb886c0e5a5296d4aa1b13a336f0c17812f79fc69418a7d8901c568f410eff2af74baaeb8336f46ca17e14e060ce2d45cdb376286eec8b8befa5ab8025802720a1e7393af579db13e8867d43d711e61b2ee395077984a450a8e2513040068a931796bc3d0069b56d1f062fc3dd61b1b194b6e1f1d1c0596d453db7b7592a6f9f8ac5576a855906512200234c40fc9bd9de9c3d6291c31b5e6b7ade473a3787aab0c958b3df76188a86ecf9e3ab06f96d1ec518c1bf3366bef94465d9e1a69eb26db9e0f0856d27be50a52bb0a3a17075d66080fe1d3bd42122d656ccc3a556e04f913faf9641143931a640e72fab9d003038c982cac8142e5613dbaab9d41390577afe73ac623f7c1920cbf1feb5c85cc433300c1c5579d020d5491edd6c503117b9c4d598438938831e5c341e9c86cd00dd8d4320b656f9aba9f0e552724e3828fc2e00946121663ad3ad98a25e7d308da1a0347c4dcfc798e395270ad07cfdf0ff8e3278dae20ab2664cdf30a5d0ebfe7a1e799ec44b514e02f2be9738d4e28036b4776bd404086cfc785d32f87a4155622644b131185d170fa06eff42d6b5b5a1030c9409932ce892b6225bc7b3901a5a31785a47a9fda2208d4d8ef19f16da0a6e9e7129ad08efc861c63e2ce2123848f33f35e598b4bab73051d24568ebf435a14f795fdfc036e1a607e576fb215b4faf3370c19bd18c5884f7501161e125b4138e0bd23a68e3bf0f88b01a6a6872c4866169fed0e6d16c754254710c036c6545b2536ae617c3fb86fca6de90e397dd7c0844522b02245365d625ff0ec26b84bf5834269a90e2d22be2b80ee9a8af7bf4bca4be6f18f99f6dc69edcc85f570198705e4d0ff4d232e1cfb0e725fcacd179aaace16ff6481ed206d56e6f8c5832de0a8114014bbf05b69ae56a31a49eab09732072d46ac21f7103c8008d697c8ad6cdf4719785cf99d69895a77675635d7a472d4a5bbcaa24dc49b215351bed3718b2d4dbafc54c077ec5b56bd36bbb7d1dfd968d187f7ea18a413d7bba1db60122565c342ee2b4c3ba649af42ed05d0b1070359a20a56e2011285485da039e07b69de47a392ca3abe779282fb0e0321df0aa70dc8da57bbf75737ea5492c7df17433a9a60e30549f40ec3e14662030fbc9683f2f912b992ff3456662b044ac4d483fd0a2af018f64f1abafc2008eb800554ada70fc55a79ead88a82fc2ff01aa2dc77ed715df +ss_n = 247d3fed8cacdb06bde637c749fee689a2cc0a1425e9c5b8ec90192ef4bda180 +ct = 707d18cabcf89670c80003b47d2b8678ad0da4aaad781a3351e82ac3e447e7019af5cb86020fb2ac727e79654155835b45de9b8af5e5c7efa01295da8988131dc8d6edb0645c3e4116aab080c5a571e760416fe8e299c89811963cf9776e0c828751701f90e26435897f8fdf7a7afaad987009c0eb12fb914dfaab1fce9264f55ee0cb4d89449385dd081b02dace9b179a54513d281529b8fd61c53e3bcfc9e2c3ae72339a6197119f97d44b05d3f36a5abe0a3f7ccbdbb91d24b25856462a649b6c1d46ae6e05e999274da9239e674525a522f6141cb95de96b93b39f0f7d090d4b1c0546ef6fc3fd08e90b228f657af31eb933c9cfce634af6bf820d5e185f3157efbc926a8ae420f29300513baf30236cc11447e74aed4e262799d77a5cf22b0a7da1264225fcd68cf07670bbf5b04f3173d6142dc9426d9006ddedc5d59443a11c8d20453c2867c10434ab6b05b4f0b467b67a4203037c16ea720945de474102e168d5f79d7f530f61d6b7973ed6457e877fb2b45e321ded8ffd30368259b3ea60b4cf9d11c5a0087f27ed40d5365c3d0b8ba2e8cdea59afa35149970488cea9e07c9434923e96e6a99cf3a0be11016a86dc9eaa539fecbddc6cfd597a28aecae2757234340194f4fac7e5a204821382d5928c8e035833c7cad49bba4304e826d5c024c7cca2acf95c6cbbd68c3848554a855695c248add50c87dae4a49d11cdbc7c757ab1e00b8fd21e7854a897dc21b40f087b3dfb131773d9d87401e5d5017ab1f86430f889ff66cc9e04be863e7e38ad527e7644c8ce93d0bc2e255cdc3be2d3784ed0c12649f5febbabac0c8e4c917c8bef29775fa3db1ea23feddc609539c23354dce722aee71c45407b34da006f24452ea05e766e6b5dcac937ef743aa908a7b7cf2f3ed8931c61cdd343dfdf6c588d1b1f4099ba5be53e7691099660877463c4310a36767ee27e0dbd3132acf6888421e1012edf383d4eec9643e8a10b50e10527c5a1474458b35e54b841fc02599ed07c190154525c47b85e69b09e8208dcf36f7e38d9f1090b8daf0a324d7cb48ace08dac11be460585dba9061abe7ef724343a4baf1c74090e8d7918648d0ddc43743bc031eec9e3a2912d870f50edcdb6e292456c400006ef65eb2c24e038ca3ddf975e2a2611a8b187e33e52aaddc119ef9e6403c61924a7cf229f6619ef9baceee7c04f2675996174c938078f50ccaf6d6580fced01564723d2979b33b77f689951b7c77b650e48a840853932612c080f9b55bfc78de641e0902c5503b2f6cc450664771b94d5590957b669ea08b96f368e11eb905427e2650ed185d6003ab704e23889300cdd920060d3934b44074783db397172838c9be318b5f892058e67d9ec94019870d758229e63018cd85d4492e0eb8c0a90d3a666e7616ddab331601ec9611572929ee74bce8d3bfb8a708858fdbf661bea1f0927f6e5192a86151fd03b001936c82da6d8c147a1af2e91b22a402ce758fd743226a870f3e3635231a390a20c6aee172818979dcc4db5e8bd9802bc5c0bffda35c288d027cbade7d615996879a09292bb3ca2c9720e741e51959d818c9df6903bb711a93ba67b845397dd1d578c6b937f8c3eee4675046f3c3004ab104a436c551352e70d5179c43ce48c5ee710744de4596b3c4cdb12181d0d96ac0ec69aa1451159fabcf3fb8899809aecc4d4f097e86b4b735215c89d13b0dafe75df0020b22bef4973b457f548b4a8998dff79232ec446951aa7ebc92212bae1a06f782be9925a532e10dd02aada8948766c427ed5a579936ebbf5c7a2c9762fdbfe14c70b2c0118378acd644056fec83c774b54867e3889c2af117661086aa5abdc1bd1be41c0f66343e0ec517a7a59849b2b5a37a990ce4487b098dbdd9178b288411f4373654c873ee8ed018156bb3401153b096f853aa14c365b2c3215413ebce8dc07c4bafdd02613e1659056a4d010e970b38dc7e10072403d8c9622eebf4030b6ab640f7022d5c2c938c0ca2156bc16164b2320663de1f904a5c0d9f63d46eb413081c809af2cbc247d26bb6cb74c58022cbc9b7d60b17d03255e736024b6146ab9f1c1c6d648b9fdf256a602b7c469da04bffb6b7355728a05308b9336a49a1522d7e7ee0ad2fd2472bb9cf882a4851f5ba5b433def666fb0bfed4358afdf5b6005051e74c16244f4579288a0da8c2f49598f74 +ss = 23f211b84a6ee20c8c29f6e5314c91b414e940513d380add17bd724ab3a13a52 +count = 1 +z = 6de62e3465a55c9c78a07d265be8540b3e58b0801a124d07ff12b438d5202ea0 +d = d69cfc64f84d4f33e4c54e166b7ff9283a394986a539b23987a10f39d2d9689b +msg = 0121cb32acd1871135cb34e29c1a0e26ccc001b939eafaacc28f13f1938dbf91 +seed = 6fb79c668eb6e0f65a09135cdd243ce205d7065a0924f86024adcd111f654a6dfe2e398a12369064c2a217229113e570 +pk = f3e043e5aa7e4e62cbd5117548832092eb7091942b9a81c9d70739ff681642f63f97ec482a564a0c144d44901d302ccf0d1b34175bbad9c64e15399ac0b4bb959576bab3cdcb8a6ec78349d1856af878bb650153c2a029b6a0b89ba584a3e43e482650c915883ac01f8a5078493972cfe8a4b5260f64bc41d93c4d4db93c43b791c8047a6ed07becf708cef27b4014c59eb8bb83177dbf7284ae302286ab0bafa80983790be12b0c4613763429cb7f8cb16e800f5b96c84e403fe98a414b9c60dbb96147b7aa6128b44be9c8d21068240556bc7c94ad0ca273329113dc42a464ad62c4323a1788f0274940b26a2cc263f1088992943ab7b3b0eae52065ecb7cb91783904196a6932514160b7929f50068a61579d1ba609e2b245ad485645ea5803d37725525b7b31ac80c8a17102727b0834369448641a38ede9896b882b7a6ba239337573c85dc2355f3ecc8baf285dc94097935844498bce0927cc5b184f83d043ce7b027e0744f767c540652fe1132668b4a3f0983d630a904639a97e3a2a4ed81e7c31013ea7a427388134163c94211137c0185fd76f4f6ba724b4cb0eb957ca1a6d8bea4e9323a923c2881aa178a9a995f275711302926a0c9c0ad69383612a58b7a979cb398b18b1f5d17c9b881c50f4bef41720f7d38edd3274f6fa8be5935b1ef33739d8077cd75935240d37b1b209a06209f489fdf2c3f8b5738558ca2d2444ebcb4e889ca014332505519bfdab36ca2065fda8928732624e035d12683cdcd5186b961232d15b4678c51b2b2112a938203985e9a0b0e701b52a8c538624608b51bd66f0298c798f4ad23ac9d958f64417cd6945e8b7aecd489430d33337790369e659e906c9f40b9354ea297fdc36975919551705a59b695101362fb0a94ad28ed132bd5521584fb76a43f1c4a74547d9167d9c88b7b2c0a2181c4aeb08a8cd4b60d8a7bd7167c016e1a8fd8b38004630124478d4c0153d5b5f940998aec74a43f337aed4bfcb135a8a9a0fb86a1aca94b9b1c635e5a309a4072b94432bb41a676905474fea5495644f243144b646ad154580ec005ff8c38aeb660bffd90d2a7a8cb2e0858be31bbe76289b669e23c9ca2fbcbb795965ca551b2876887184955fb89fc0b7470d60959d6b13b1420b7e518849db358b0a2e76445aad729eb0d5bf2917952609779e722f80db82d3554314658fff422578fab7fd59298d2ab877f6adb340be8c37a511337f638248dde4af80b9b00ff93f2e0caed613c19aab52df73c209d92029d3775253c7ebf401784b3ea7d178d892143e79a59b1537dad2ca21e9ce05e2ab00095761e350873b0f48d9ca0b2996b1947b007707246b38f7f98d9c9004128777dbaa3b01a77ba500c108f8b5795243c8c1ae38502e7ed301d482c14be29bc0082ccdc8b83c5bcba6c0373bb67c7c2a7449d58eb7c01be65b81faa319a8f3095b45a3b8e9bef086b257109b9a30c3f6630fc58771b0b79383f91a5eb518033673dba17a597968250b0a8731890d00871a7c41a7f7297030bef0960792fa1387753ec9e831211774cf0554ce5c4198186ee59a8ea4f5b48051cee4c35783e740564628a610c00c35aedc354e19c18726c17380a19a3e61c7f6c23573a76e46203549e57b639a3bf27833b6ea85ee5309301abd27a44f146511af5a833fac2a8d322c4bfa97d4475907e11d2b25184fca62ebb9a7142aaf65168737c5bae7e8109cf72104e6b263ac7bd22a43f287a48543aa9a0970eb3b6bb5291e0d968131a88cd727b7d4c1b75dfc569fa89675e846a039549b8639a8e63b52e08980066f81da729652b143850532240497279d5c187ed9a384dad99ec06b3ceb793e99b226e9890c302a5335ca6ffd7902e0fc033909bd574997cdb510d7b06ab9362e380102d4f94a7231c4d4d2822b0227fcc28816f57727850499d74e0da15f792349babc6c683ac02a973247c245d3bc4e06455179c68e20737892c64c259164c6132e50084c9411573a8bcc7633525446530f444395ba06d8025717a7a4094910de085a9e1903fa796c8d9b3e57060e007db2b5bb7fd236161eec4da0906e263272ab0522cc870f8b7c2c60336468391b796538448801eb238dbd50984ff9ce4714b02a661388426b922a0e55d4afddc31b7b4891cb538fe2b8cc5101fb236869dc433d6d28f0300cd28f2f37e3f42f5ae0f3415f976660 +sk = 11a273ed17b2286932cde225e168bf6f7013a7f9763f47b01183403e37a016d934bd4807a6f980640339b85a810118353a4836aed6c578427449314172e1055bc04c125664fa4c6219c23572f7844cc861c002760795479bb5c3245a0d33d6ae0a198f5ad47c44fc01c8389bc139971e87524b376e9e495d21ba634c71656dfc8405a7613636ac72a764724999d6056b435a69fbc276c1f3a14f80a84a7c8707768d743c16e4615ac1ab2fb6b4a67c6191e844391862abf4439362645ddae666796c001512811ba575587c3343e7106a0986fefb447146568e30ade2097193472856a1a2ad04caa781bbe7341b59aba9e198943fa721c3698e4b62b8171851f9a10c0f582242a84c50d1b906382304fa8b06696702782dc15c035db9a38f345d785252d906b1e6a848dc690e70c65659823085313c61c92fd0e1401a00cc215a6366721a45702dba194b3cda7f0d8bba33c396c4c9ccafdc55bd75399c55453d9870c8e64a9c5c62df09b6e67716c062bed71c2a2db06485f21b09f899a63388fec1994596b11ce055b9377c32f8992bb5b40fe419cde90b7ce9757e25b0d24436f54b1db9162e8d79368e189d0b3484f5c1404aa710a7e583e9a6836fd0c7f4e509cc16a882571d130c6d9b8a52684ba0cb128abdf48cd0d38858503e91b0b598a83a63044034a30c76847ee764740b471273fb1bad7236587c3d8d19764d9120b63854ff7c914dfc81cbfc877079ae2d246d050650d28482dd74c44f777c3cacb11ea72202f664e90154bc257b9d269aad21631da882a3c8a32b0ac60c7264be1a23d4c1334bcc0f8157c912d31dd0111c8d185a8b687368a99227291094756b7936060527b2b1ba67022756bbbcc70e976caa315dc8e300ec302ef0676e1d916b50d508bf56a15d72a36a77cd5fc07ab074c9e43aa82c355987a1573a687b8aa4173c2380bdb30a2641b34eb95ae3458f22f82a8d55144044356b554ecc902a3a9c23e2db5584530e7600d0ecc32fa644909fd30bc831921f6521b22891eeaa41fd29425949af8139ad6e93657b704b72b4c9bc8bad6375133d657d6be107d04490b4604a1629789671c980497b6be96828391e7252b0445b0ed0c0b4fde056fa50b0b8f538f4f99ea1309b83fb7d764b2e2f9b4ec6da94fe0cb8db5b4aab1160d6fb3b247c872183c773770c48c09603b5290b9a1c3a59b5617a756c1a0470a7c1f488af125882c5f7b3cdf4c08f9b3eef8166a6a1748b882600b1233a543ba5a27f9fca127c29ab4625a291137a093aa385663cef5105bf0751febb1560b9474fb26bdb3c0e6f46bc94417d65e788eb656d9840502acc6d6774386f7166a35049f392087d58b07d1bad323284d394bed4d7972e0416ccf0389877687e8a43b07028203075d0594f4f99afcfe5546dd011a37acaa5862824619efcbc88e48b4e92cc3feefc7cf7c3702a46324a37441fc38ef39967d9f239640b7a3e6141d6a6581231b6a2c0873661b36fa885b2dbbf59e890c88c089ea61dc25cafa61a87fbf958469266c588c86be398aa2250762890b1657fe6e1999727374a233b4b4440fa2b2409dc2544b49f8e2b2a0f061f7c903124518a63db5ef0514204a00600108ec96c29519802804378f7e027371677003a8ec14490333c7c57d487abab2066f1c73c6699243c3b5a192e74f08dea316565a495d7e1a4ab934a3bb84f80e323aba0431901685534ad5f3c49d5bcb953d497afa389920b2ac8e49a218460293906239c89a943885ed5a960b616df9789f276b5f5292cac015a58987ae1fb0207c7134c00470264bf72b0cc8bb5ab27620743586a5f897f3a457f3d7c6d1509aedc2a1c640c19daf562946a7c31340f4b452a9f5733f4fba4b869b8fe1215e90b427acc0bd66a51c2f2bca75cc23b35a4281a106445b74c4b280d9cc667a72bf87c114fa9a8e68656b4911e9ea5b52aa50c5bb86bfd0c3e8810577f321b7267057464835c312bdef55dee7c066cb09f09d23bf261261edb7d9b2553812c77818338ff926253564910b97b9be2c5b9ba037f012e24c93afe846b642357f53a80799b9eb12682841a44b5b0811c806943aa1d65a3ad4edc291c9364d0cc458ab02d4d31520cd15486a80e99075c1814a13cdaa5062516d8e6afaa6232d1bacaf3e043e5aa7e4e62cbd5117548832092eb7091942b9a81c9d70739ff681642f63f97ec482a564a0c144d44901d302ccf0d1b34175bbad9c64e15399ac0b4bb959576bab3cdcb8a6ec78349d1856af878bb650153c2a029b6a0b89ba584a3e43e482650c915883ac01f8a5078493972cfe8a4b5260f64bc41d93c4d4db93c43b791c8047a6ed07becf708cef27b4014c59eb8bb83177dbf7284ae302286ab0bafa80983790be12b0c4613763429cb7f8cb16e800f5b96c84e403fe98a414b9c60dbb96147b7aa6128b44be9c8d21068240556bc7c94ad0ca273329113dc42a464ad62c4323a1788f0274940b26a2cc263f1088992943ab7b3b0eae52065ecb7cb91783904196a6932514160b7929f50068a61579d1ba609e2b245ad485645ea5803d37725525b7b31ac80c8a17102727b0834369448641a38ede9896b882b7a6ba239337573c85dc2355f3ecc8baf285dc94097935844498bce0927cc5b184f83d043ce7b027e0744f767c540652fe1132668b4a3f0983d630a904639a97e3a2a4ed81e7c31013ea7a427388134163c94211137c0185fd76f4f6ba724b4cb0eb957ca1a6d8bea4e9323a923c2881aa178a9a995f275711302926a0c9c0ad69383612a58b7a979cb398b18b1f5d17c9b881c50f4bef41720f7d38edd3274f6fa8be5935b1ef33739d8077cd75935240d37b1b209a06209f489fdf2c3f8b5738558ca2d2444ebcb4e889ca014332505519bfdab36ca2065fda8928732624e035d12683cdcd5186b961232d15b4678c51b2b2112a938203985e9a0b0e701b52a8c538624608b51bd66f0298c798f4ad23ac9d958f64417cd6945e8b7aecd489430d33337790369e659e906c9f40b9354ea297fdc36975919551705a59b695101362fb0a94ad28ed132bd5521584fb76a43f1c4a74547d9167d9c88b7b2c0a2181c4aeb08a8cd4b60d8a7bd7167c016e1a8fd8b38004630124478d4c0153d5b5f940998aec74a43f337aed4bfcb135a8a9a0fb86a1aca94b9b1c635e5a309a4072b94432bb41a676905474fea5495644f243144b646ad154580ec005ff8c38aeb660bffd90d2a7a8cb2e0858be31bbe76289b669e23c9ca2fbcbb795965ca551b2876887184955fb89fc0b7470d60959d6b13b1420b7e518849db358b0a2e76445aad729eb0d5bf2917952609779e722f80db82d3554314658fff422578fab7fd59298d2ab877f6adb340be8c37a511337f638248dde4af80b9b00ff93f2e0caed613c19aab52df73c209d92029d3775253c7ebf401784b3ea7d178d892143e79a59b1537dad2ca21e9ce05e2ab00095761e350873b0f48d9ca0b2996b1947b007707246b38f7f98d9c9004128777dbaa3b01a77ba500c108f8b5795243c8c1ae38502e7ed301d482c14be29bc0082ccdc8b83c5bcba6c0373bb67c7c2a7449d58eb7c01be65b81faa319a8f3095b45a3b8e9bef086b257109b9a30c3f6630fc58771b0b79383f91a5eb518033673dba17a597968250b0a8731890d00871a7c41a7f7297030bef0960792fa1387753ec9e831211774cf0554ce5c4198186ee59a8ea4f5b48051cee4c35783e740564628a610c00c35aedc354e19c18726c17380a19a3e61c7f6c23573a76e46203549e57b639a3bf27833b6ea85ee5309301abd27a44f146511af5a833fac2a8d322c4bfa97d4475907e11d2b25184fca62ebb9a7142aaf65168737c5bae7e8109cf72104e6b263ac7bd22a43f287a48543aa9a0970eb3b6bb5291e0d968131a88cd727b7d4c1b75dfc569fa89675e846a039549b8639a8e63b52e08980066f81da729652b143850532240497279d5c187ed9a384dad99ec06b3ceb793e99b226e9890c302a5335ca6ffd7902e0fc033909bd574997cdb510d7b06ab9362e380102d4f94a7231c4d4d2822b0227fcc28816f57727850499d74e0da15f792349babc6c683ac02a973247c245d3bc4e06455179c68e20737892c64c259164c6132e50084c9411573a8bcc7633525446530f444395ba06d8025717a7a4094910de085a9e1903fa796c8d9b3e57060e007db2b5bb7fd236161eec4da0906e263272ab0522cc870f8b7c2c60336468391b796538448801eb238dbd50984ff9ce4714b02a661388426b922a0e55d4afddc31b7b4891cb538fe2b8cc5101fb236869dc433d6d28f0300cd28f2f37e3f42f5ae0f3415f9766605504aa30f945a41e67575973fff2c0310ea7f4501f73e57e21167047ad64f8aa6de62e3465a55c9c78a07d265be8540b3e58b0801a124d07ff12b438d5202ea0 +ct_n = d0bf2e1d6851378cb5de83ae9b443234caa01ba58535242d0089a744c4b12753ff8442966bf563f8972cd0426e815a34883f740c6016928ee070291d8efbbd326088f30d50550b061ccffd9922e5a30468b62a0ebcbf0aeb74f8dfe3e130c2b1ba83e47075ad519b94c21f3c06078f4645d5444b41127dbf8ddc67a8cf440abe95ad1d586a29ff3d8a4d671b05198d2e2eaf06d7f0be6c550f1c544681829632e98cde071b1e8681c78a98081930d1c9809a497cf409bbc67d1d8de8b9a3e8f5ebea8fa79538d65c0176ed2034d74fcda38288c36c6b5af134eb9e60ffbf138fe5d6c0378ee891e69bf5bfed3b1614d25b58d3798a7eb3dc7fe42f1fa3e30953d92e79d418c741e659455a618e7a5aba4f59d12e17d057eb698f3c2f9a6b1d4e581d09a9d6c1da5f5f0ec69f8463d922b185256bfa5c751e0321d02c58e4284a021b1cafa50f7339d5a5b602ee59bad99f09dc0e282dab539cbbf970418dcf302f2b47cfc1e97ae2a83885b7ef6b5b65e662325644504338ee139ecc4b4308cd8aeceb0e9b40affdeac0e02795b54074eb446b85cb4a57122079bd7c34f310d1260efbab0f4a7e04ce438d624e25bec7e0061e253c89d57e84bdd44839343f6c4d858edefdca4fa794db91d17445c5f58ec08b5bc58cfeaacb953fb004fbb8f7b1dc1e1b5622be612fdfb1889442cd8aff5e18a75b02ce6f4ee1efbd96ddf8d02fcd2a42bfc8997cb459e2672af4231a75d59dc678a2185374bec3d98504e6e125a16e58f42805b12651478a1ce8df3cae5b0e0dec53ca78b2c38b64d7dd7c9985f518e02efe08ce6ff9b4cc3c521b3c1c0ac40504687af68708bc27946704eb4900ecaaf41777a223f1668a69c7047e9b863afb4ccac039334f58dd132bfd5534da9d45e640edd9e88104ad0455bd2faa383d35c0c9ec5fc6a6324bc1429c539b0bacdcccb55121f247f75ca6068ca915e16d13137fb95eae128b04ddedf9a0f4a17ffd5f2325008ae121e21f9f4a64b4d806ce2d93135968b3129b4deafbe07bd6be34de1a5adebb3e0002556a1392c77a23e4612061ec7148652d702a6493b8c517d1fef8a77d054b19f5af4e904096a1f44f2a71cc51c8f9a20149cd45e6d711693a81bdf62d0cab6a13fd7e690956d61ad6508ccafaa8ac9abc4da33ba55dc5ef9c63427f6ced83c30c7b763c9c66fec26247df9e61bd50ed977fb756301be16ff0c5b2493c5f2af5502655ac884219f9aa8b9ff7117eb7d528a4aa7d1c2b4f7e12bf37ed958c86141fcf3fe7db5325e27c1849ffb64147c278e45839ad38ab56711a96f188f9ce92f4537ca3487a3d840e9cc08407010c55b6db9d0ee9321ef5ccf49f2147c1aa063172f6e33a267308ca42319eb85dad94c59816dedb2142446bfd610844ae6e69c6df23a55341c1d75319e649f8d953569d54521c885f8d9f3b41d9a72da259ef17684ac9aabd56b4eebd14bda652e608c9a192537198dd6e35c0ecfe417865786b6e5cf79f7057cf5e3cb2eda21a9fb6fc8b9ecd04a423b97b0d860f478967f24f0341465fca563953ac11e6861b55d5ad5c866c83dc51866d0aff36249c6629e781f4d763a157bd54ca16f982c84441bcf469acd4697a2c63987d50ee9618f552fdf1ee0399cbb2a656cbb3c3aeeee4beb23b69350e04c2f15f4028881db950d646761892ef62dc990123f59ed61b9050be03e14c19804da596799a51534b1440bb89a150eadb32a00ce6aef79b389b11be0b25c45a14af14cc79397007edccee71e9923771d9d7f9c00bfc7af4acf0109b334b5c282705affd176c5b61fb38b4af1156486de14b315d6bf84d119cbe8b09db442dadafe3c7f2ca821933b34e3f1820a2a7e9042ec9aeaaa33ee73a52d919cc6be78c53b4e368fd2dc3834eb1d36b8a601572ba2c5076842d6873f2309a001e6af25f9b5b86508ac23eb2868b79ac79e89a2d5c7527595964de004c2289eaa1372ece0dfa45f2a5624b9f0ba1f13ecee3d5005e4258d5507e7e4fd40962c560b99a03d75b5d068f7c9d587bb30757aa6ab0d3aa33eb723f4135c7b4134e15938f1bcde627857f2e78dd4c739d6c40fc92ca70ef186bb94318499faa76756e75fbedd9764f35a76a2b7b8d6334a95cb5a945fcf990d38eafa0267aa4af7e209a029bc9c2a89e2a4db6276dc1de0f3b036aa54b9ea2b478fd94012ece8a44d8ba18d1 +ss_n = c9657c414998e2f964d2a6b874739e2c65cc91f4cdfa3351aa54d03422339832 +ct = fc063459b7ba4d7a977021e61c26e64c0c5de2e08d72f58c356705286a36b123bada21d2067f91e513554631d68fb314ce443793e12acca0b5add2e0d516c76f9a4b21716575aaae1f8f868a97fc654be4d62c02746a5961fd5c9480a423c249f810a91bc5bf97833b572ef5d7bc87779c1980aa9e844f11f0b9a9fc521dc9c388f821d8dc61529cd5e8b9082a4a9f487adfdb70283c1582b985967c973420cb6771c59f74e765808cae6a5f0cbc148ed165ef2acd161574dffce483cbf4b97113ca90d200566b934449ecf0847d3b95e7fa8f3aa92e68a8313d901781c9a6fd832d991d5f02c146b0f6abc7e5f07c5e3ad9965901c0776805010a5c10e1901539762d565cc7e646fa600c2d752ff79f0f9c32afc92dc725b49779a5610054dba713ae8439f6527bb6886ddaae071ab159eab187a4196e4eb055374eeb4c763ed3b0c77ed5b4a972c48df73ec55c51a6ed90bc0a7db46e8eace089667a1e574263c86f4daea673dc68ca4f24a8cbc16bb402e7a75f1e79b739247165b295fb9f678289da6f3ea5ff6440cbb039deed50ca1881b156c6e76c04694ac92bfc64f06034738c116c8a83e4d0392e1ecefbe43c177f98016f74e16842a92c769cdec75434b85f77611228dab3e1e23c6d98d24a1feb84e22b91bcda32c1a9d25eb3104d3568ec0bcf22d53bce955608f6d59ff0f1e27a27a571c81e554507740f9e334165f2143dad5057b3a0fb84ba571238eb9524d3bbd599b1dd5cfba63a9519723155a9163092bcd0c0c0d2bdd1fc6b4fb630b3f674f65754b60a9fe238d3c8b97e74583667991007cd2c2714bfa15b939f1d4b0170f39dfa954c9f4bd9ee6dbb196417f9a86661c33f1f2ee93f9f3fee3a9b3aa8a42bbae01d92fe5936d196780f31885e2c1516aba7baa13f018832b4285023b53b1153bcc844bf357e18a0c23d3f8857db107025a3cdf2c1338c3b872ef53fbca74e257832b70d1866ffb61f4ae6d84c2a599250dea38fa365b045c399cf57a0b355cbebb1a5abb2bc210355040470d15945023b6196bf4e6e8e39c72169afd12192c1a2e81f4d99b4a8908f4dfca3869ae2d59d70ff4df10eb2ba7f862bf5fba1b6ff2050f6c4f9029f07e93b01f410d3c01fa8dc1b26109842c8fec617543448fc38b67d62ad2c9d8f40ed400fb1e2c1285fc807075a7b29debe51e77d55d32f2ceb2eda0adf24ab8955678518b8dfb738ffa5d216dc74fa24b95a1365e98059ccde90673ac18ddc7c51583fb01023f1ed4227101bae46952d33c1d61a05ce130e0ed09677b1154866bc190de0ff74084112636753723b7ffa295793f38b1da6af99a62646f4a234abda5a3e18e0f76f6435b8e2445d419bd2e39234ba21f1f56e37299483ebd4b4495df6e4ce2046eb37b15c8c60557f2f86aa63eb703faa2803d64f97d9f3f7de3bf21394b979be6ec1707afde36c6c234cad9f49748845afca60b8171ff61e7a7baf5cb528a90d8d27d265039018a77e9a643603291b8699149cd19f6e4c1c548ecf173f6b03097ed3e66867aeb6eacf17930ac90c8cdae4d809a9ed7619f25c952eba386ab8e90a3f9dda866b514310e38c39bb3cb863e01eceb49fc9839a74f00fe03b115122f19dbb995c9d2838cec65bbc1b6debd1869566f93a43befd49aa39deff63ee190e7e41eef6b1c524c8728c0986a831711c9726e405caa3c25ad6819963eea74749406d1ffd1cce1d9de6fd37090ee23fcc9b3aed4e6d12008b0904679e5c620f9b4c70062bd1d43c519eaaa3b157cc52bde0bbb96d25c5f1625c7b4db852e8c3f8a2c8e312ae0a2c481014723c0b8a88e3c136591b152c77cf52103931ae8d79097bbbb1637d69f4676a784bb8ef009e49a78d66a70f0fe6b4637e9d46f2a4e51baaa66458d941ae90d0130b7c92ff0c354b1657646b5f033f6a0102476ee2fdc77234d9fd050e9259d68522c52bc4d80bca72e563860d1832afbd0023ac942364a89fb4a26e154745ca9355b902beefb30557b4851ffdb621864218bfa4fd519214140435e1d14c5fb594eebe674756cac456df9bd1b728254fb456445e6d99d11dcd7c43c914fb3d8012da137470633d9fe8fbe94829eafc9c4099ec3a55815992f15285db50ebd8e5a4f4fc72a963bd239cb466055c9303e713a4a6ca99191fbf66caeecc3d5ea66038e0c5d86adae8c8581c796238496a92d1f5 +ss = 2622503a2a544f358392903e6f2adc5a2d94fe010583b574a54d9a7e6d223a24 +count = 2 +z = 1eaae6bb91b27cd748c402c4111140d5a942cf3c95ff7977f88d2ef515bb26d0 +d = 63470357110828f25b23edc80ed280ecd398a9f53251c3332754de2af0b15e90 +msg = 34b961af5d6254af72c0d50e70dd9b4991150ccc09192aa46f1953d5c29a33ec +seed = ad4d2d306639620afcb3753a137f89331836a5adce1c40bebe77b82d43a40d3249000c7aa3786406d5d5fa65462d1a57 +pk = ffea9b3fcb1023e9b838bb485033831c5564286c90cfd80bd8e895f61078e5a92f73f4829137c50548c9bc1b09f2fc476a70744de23545db42eec1aa263843e0005907c1a1fe5ab9f68aabd07b3c0ae833a105871d549d8b3464b53c66e5d165fc75c9b866445526c2f81413cefc262a365d2f5bbee5b97b21876c034516bfec68a3257b9a729468e59b3e8bcb39653848582b08419183ab3985ca97aa9867ee8a1219472fd2433f265788ee14ab5f699269036284d87171bc2ccd74bd9a79768d1459395116c72cc3879c94f16605193c963ac3c1ce845ffee0932ce87bfff14a7fb0819d31220242c857d035dff0003ce748b788ae340c383ef36bf53a7bdd8a0381f2846430177d8704278840f976a7dec96f1759b40a31286e48730b99bde0823e09295d4437c5da787303205f6e161752a1531300d0e428978a5aca20793bec30b5776c3a6159ba905b1fc989cfea8b22a199c280150e9fe4cc01fc3f47e88967d169cc4126099c3aff633166533804a257e8c79886a11a0935062edb3ca54c985fd220768368a04ac0936ab15d947e10242def9b5a28a6731881a72dfb0797389ea885b655d69c249b3fc56302a3d8077f790763453bc5752f93a8bdb52a2268b321bc862436490b5f08a67da6299bf20042416e463831dde956ecd26434316ad5b7130e71882797b22693b19f8a27b2e85725f89508ba02255c7aac3c1b39594ee6ca24ab3277472568fc9125c24a251a9ab2947c4e048a5c2546aef24799b265c4a67695c282621c8b1ec0ab5bde3a3e5195369d555509e638641212cce0929e0b0eb6428b3d334d78c5775de624d210af6d961d2cf187b318a3050c7b0b02629e331fd91617170c523566ad8c443349a3cf3bc8aaa7137cc13705353c69e6a65ba6a07ecf41af4e2c9346c015faf51491d51ed3c3692d27027165b6fb019d89c6099cb48f43aa5052610f71ac20c26180797cc1d3da5212abb6b2b30c5ff53433884826269d6fcb6b9fcbca48971f1a0ad01afc766b2405a9239d20462b41d40015a4ba8114149e33631414904022c9feb907bfc697e5683f17935788c3bba0d762b77989185b758709920c539e4eec58edfb1988b19dc2f8c95bb9ad404479f9c723f067b588060c5578771f6713ba47c095f05ec59225fcc23e09a56453fc99ba840dd81c619f3c6f428312ccaabed7a27c9bbc242ed7ac14e20de71a85f939800955519b9b2da2362f39d6046e4866a60b808a8a06fbdbc337344e5dcb738b4c1d6bc4afc918bdfd9c08e74489fa18a67d424c62997ced22b825d412cdf411a87c035a122763fbbeccb47fc284569f2a59c0546db1dcb54cac349785492ad707d4262ad23b75d7890a8ac011970379bd6990a66c71f3006078374d90546d48d008b492cf6a4c622bc53947c8696ab70a042209c7293433e48849da669f931a58570ca3912a123331ead34860157355ca68281a956e008a5fd8589b6105d2375e916717c915615ce037c5cc93c663432f54827cfa60f7b73b24749a530a32d785318c123f69f6180345a30eb57d2e22a4aae594343177d7367131f21a6c72027ff17e51b26a5e94b0d1a41fa3d24cec2091021876cbb3493c3b5591e69534a72c97e61abd89049c75890ae6bd9cf7ba73d0378ae94414c545c2f42030d4b04fbc9618c3887524a9e63444a8b98729a9235c025b43daca5475b885c794f31794fbd853d5119e0ac502f6fb911621c7306a98096371fef134fc97735ac51e88b1a47b62641126637fe91c4b094cb931520f69829d800ce8f6485f423c85b2cbf05b40b864a4a6d1bc23f1adb667904f131346bcaecf0829e9674dac42ae81a11f26f0422c635e856b2f04da41ae2cce115aa3f9fb9c26a30c7c1032b5ebb513246edce20508f67deb3ca18ec946a283955c5b7265c6777a496bd1935322260b33117c14b78bc7671ddbd0a2f99985fbfcc2ff9b16ff96bea74125a2a09e9310b10ca99e8113ade4db842fac11c671983edb25551526c478882b64aa5a4b0861955e06a22ceaf28570b2b2c67a8cb1d95a2aaa3ef4ba81159727cf5ba16da03ab174b435f893552c1aedd951c2aa469a6b7dbd49c4ecb32310f5917124689adcc5e289811f2acec4e0bb89222ea3eb4190872de5e11726c410b803565ddbdc03f982920cfe3bb7f55b96f25b0a9ed071f3b042d0519b419a87bedb9e +sk = facb01872a06f1a053a0d03c9c742732c96f4b6a46bf16cd53e93d35b57c645388e89b39aeeb890aeaa264866b74551f6c651b9c97b98f163e94f1ab5cc952d31369562046978469ea26b1f52a33ce4b7ee7b05006176fb7585d11a710a4fc56c10c647761c25f977736a31f2d032415852f99f674336c85a2155c46f13210e15220f0317a185dc9012aa35850d97298b041661dfc88820991adb05fd5ecb7a2dc1383fbc6338b4d5eb95c2720c93279788829be77c08911e696b0aa0815d3007d882e113296479364374a7c074174cdc84a8c7a9f6df58a6067791714c2f0cc74ab85308841389b3864c65097ef8b9cfa9222dfd64ad9b8c5a604456c22518447b7d7d4cf9452b07a27466fd4390e9101aa959e7471cc2f135c4800ce823c981ee0059ad58c1af7be47b71b55b895d33b18e32a34980840d2002427225b579b62f3c079a2140478ea3f5251a5f1086d23c72ffe7aa324e905a8111efebc4594224d9384bc5ae645be55328a5653494accc5e4601eb68626534f79bc79de283f067b6d62f8a53dbcc6c6069fd7028bf78b059de20b6de55a0596bc75729ebc537c75a13b2364c68cc95959301cb0873111cb9e82b27510855f377a212b6a4ba5b951bd3534001054f3b6980405d0d1a8a6e26c619ca622cb2b934f472da397a14a510c2a311f6ce566a390136c139ac95b3834f268b49225c212bb0b66322bb0b5f741712140576de9cb4699833dcc397970ce33f46fd9e1adb309269b42b13b9a73b526c2b8ec8dfc08a5e96a7217690bcb811bcfa49f9bb79e2fe37d930684b4d2640cba73b51271a6ba947a948efc0ac27cd1aea768a4dd014dcbd30f40938b5921c29a74119538b796d24f3ec4bd01ac1323393d841a9e04170618d4557d611e9fa484e1f7ac29c3a642c702bdbbcb5d604a3bc75af861aacb29c50417cd7bb88811c82404453b02710e6555bfb818983cb50659b088bc58640fe485c9d3b75b802a30fcb16b4b0cc2108c6b5c34ace228a64429dbc6547fe0914c18b4d3bb98a0194272a92a8e26783e357c64251a16427421d807f82036bfe9a5e7315c0fb8b70b4993e2fb52fc7543ea781e9576974ff140addb123aaa6df8aa416580470d1185aa06331cc34bb36c2bca95961088a284e5ac1ae1c752ab18b108509d2097f2644d0c9966ebb7166de088bc1829e6361dc4b8336b494fb677088a52cf99f34a83c889ddd6a2adeb8f3ea962a298158d114e68c371d7e9904ddc9778d916d90022d2a81c3e9437133827e5b8b520a7ba52d80a8219844df3a7e35795d20511292570d83a70ede696954895e00bc65528215a0019652b89d988aad32109c4ab123408667e431916010641903e1b6626f74a16cbd7c1ce91c6e6456b8803a988c23c2ac23779554687d897909602fa6b0f8a107ade499ab9cc62d3108fd62117ae4ab6af83892a7ca60eb68aa41331ca64688bf86f84b8b69dd5c2ce463739c30069422749960c71751b8a9783f569bfd1a1040e51646920c8e4b8b837034fc10357a7ec7ad7b9cc6c3c1770f967daa47f5e93b47bd0708f112aa691426c53ce3cac8299fbc93ff9877e50c30420a7ea24a24ce14c171bc8bb9123ebb99675979593810e9fe3b6f272821d768442a07179b896138a36bc690e22056b44d6a406766014621a6a5a76ce8330741cab1c7071290165151281ec1cbb6fb2a98022736ebc42261c03f6b5101e40272422bd5e164879e259d1698796b45c53bb5cac531659703cc8a6423616a89ad63f0f6590de27b726222d1acb0762f910f36a2214a0b80e439c0b9727353204a0719117976542968355c1aa07d7815083cbc1a323a2f195de5c71f5dc62bf4949bf90164be92aca8cb2355a0f40363c9ae584e626681da2278cc881bbd13b3bf73537fab78cbc9b16d4a02179021a18036cd505e853c96cb9c6a2a57acfa20bd37507f0d2663e09585eba50389029bdf93810f838a9370a99dc7496232d53471985e17a6d9a60be5a8fc7f0a68cabc5ed3ca177a41874e8cc302c454984633b1a6f4a256ab4bb2f4d1b4ceb60130ce9c04cd37912c291a988807d072a8af96ed3ca7c589773c627200ce7a2db2cb1cb82c47315bf12e6592376029de82f05fb66e1b72d29e39295d3c701f36de47c0f1b53b9ffea9b3fcb1023e9b838bb485033831c5564286c90cfd80bd8e895f61078e5a92f73f4829137c50548c9bc1b09f2fc476a70744de23545db42eec1aa263843e0005907c1a1fe5ab9f68aabd07b3c0ae833a105871d549d8b3464b53c66e5d165fc75c9b866445526c2f81413cefc262a365d2f5bbee5b97b21876c034516bfec68a3257b9a729468e59b3e8bcb39653848582b08419183ab3985ca97aa9867ee8a1219472fd2433f265788ee14ab5f699269036284d87171bc2ccd74bd9a79768d1459395116c72cc3879c94f16605193c963ac3c1ce845ffee0932ce87bfff14a7fb0819d31220242c857d035dff0003ce748b788ae340c383ef36bf53a7bdd8a0381f2846430177d8704278840f976a7dec96f1759b40a31286e48730b99bde0823e09295d4437c5da787303205f6e161752a1531300d0e428978a5aca20793bec30b5776c3a6159ba905b1fc989cfea8b22a199c280150e9fe4cc01fc3f47e88967d169cc4126099c3aff633166533804a257e8c79886a11a0935062edb3ca54c985fd220768368a04ac0936ab15d947e10242def9b5a28a6731881a72dfb0797389ea885b655d69c249b3fc56302a3d8077f790763453bc5752f93a8bdb52a2268b321bc862436490b5f08a67da6299bf20042416e463831dde956ecd26434316ad5b7130e71882797b22693b19f8a27b2e85725f89508ba02255c7aac3c1b39594ee6ca24ab3277472568fc9125c24a251a9ab2947c4e048a5c2546aef24799b265c4a67695c282621c8b1ec0ab5bde3a3e5195369d555509e638641212cce0929e0b0eb6428b3d334d78c5775de624d210af6d961d2cf187b318a3050c7b0b02629e331fd91617170c523566ad8c443349a3cf3bc8aaa7137cc13705353c69e6a65ba6a07ecf41af4e2c9346c015faf51491d51ed3c3692d27027165b6fb019d89c6099cb48f43aa5052610f71ac20c26180797cc1d3da5212abb6b2b30c5ff53433884826269d6fcb6b9fcbca48971f1a0ad01afc766b2405a9239d20462b41d40015a4ba8114149e33631414904022c9feb907bfc697e5683f17935788c3bba0d762b77989185b758709920c539e4eec58edfb1988b19dc2f8c95bb9ad404479f9c723f067b588060c5578771f6713ba47c095f05ec59225fcc23e09a56453fc99ba840dd81c619f3c6f428312ccaabed7a27c9bbc242ed7ac14e20de71a85f939800955519b9b2da2362f39d6046e4866a60b808a8a06fbdbc337344e5dcb738b4c1d6bc4afc918bdfd9c08e74489fa18a67d424c62997ced22b825d412cdf411a87c035a122763fbbeccb47fc284569f2a59c0546db1dcb54cac349785492ad707d4262ad23b75d7890a8ac011970379bd6990a66c71f3006078374d90546d48d008b492cf6a4c622bc53947c8696ab70a042209c7293433e48849da669f931a58570ca3912a123331ead34860157355ca68281a956e008a5fd8589b6105d2375e916717c915615ce037c5cc93c663432f54827cfa60f7b73b24749a530a32d785318c123f69f6180345a30eb57d2e22a4aae594343177d7367131f21a6c72027ff17e51b26a5e94b0d1a41fa3d24cec2091021876cbb3493c3b5591e69534a72c97e61abd89049c75890ae6bd9cf7ba73d0378ae94414c545c2f42030d4b04fbc9618c3887524a9e63444a8b98729a9235c025b43daca5475b885c794f31794fbd853d5119e0ac502f6fb911621c7306a98096371fef134fc97735ac51e88b1a47b62641126637fe91c4b094cb931520f69829d800ce8f6485f423c85b2cbf05b40b864a4a6d1bc23f1adb667904f131346bcaecf0829e9674dac42ae81a11f26f0422c635e856b2f04da41ae2cce115aa3f9fb9c26a30c7c1032b5ebb513246edce20508f67deb3ca18ec946a283955c5b7265c6777a496bd1935322260b33117c14b78bc7671ddbd0a2f99985fbfcc2ff9b16ff96bea74125a2a09e9310b10ca99e8113ade4db842fac11c671983edb25551526c478882b64aa5a4b0861955e06a22ceaf28570b2b2c67a8cb1d95a2aaa3ef4ba81159727cf5ba16da03ab174b435f893552c1aedd951c2aa469a6b7dbd49c4ecb32310f5917124689adcc5e289811f2acec4e0bb89222ea3eb4190872de5e11726c410b803565ddbdc03f982920cfe3bb7f55b96f25b0a9ed071f3b042d0519b419a87bedb9e2972c4cc48d8e83726cbc9462a2df3a7ccde0950bc96645df6d6188b47e91e661eaae6bb91b27cd748c402c4111140d5a942cf3c95ff7977f88d2ef515bb26d0 +ct_n = cf3125a6f30cf0d78f4b76f6c6877dccd180b2b8f7afa1ed7326a18123c0b20156902bb1fc6ba1f4f41a006b15e41d18a76440e5e20b2375665806c3ef5663704dc098d1e6f434a56f5f7579b860284fd8dfe84970cc47ef1afd9e4e3b80a3ec8fd739cefceff6567dca0944ef62af068298afc6723f196b4b71161c6177e2e8ea4a0f9dd37815b70d2d71a2cddeae73b28c9ec9c8fb5727eed252fa167543a77004f94598a32152a22bf611d275d1b249efed12b22269edb10718a49c3161b4a387a8654a509f9de7c8e1dab5a5d13c6b5b480c87a7283aa8df023f0bfdca6c32b18b7ae3f1f89bc22261e1af19202cce59981284d8094bc146aa0a0bcd5fc31f5c3d22f8e39aba1c4f5384e9018c0afdaf395b761b64afbefd50a89ed99b820b09ba286216463213cdd3e5239f263328419d6c8f377896ccc6d49cac9cb3b19a643991d1c1e9a3b3f8482a031f99e1ca839c0339e8141eb48c4a93115514cfadb9c47a6eab8497359fd92ddb442a8ae5b2776bc0ffad5d399f05cf72b872b492abb55f8a6c0c643d8fff627875100662396a849bda878b90895b93614623563afd24d76c9e02a85065e9dba056a342f0c7f516a37235023ebc18e8fb8fb6a675fcbdd5631ffc6930d7735d74bf7d7ceeb79c1d6d827ff1af5fb25b9cc20b9387fb11bce9c8844d1836e65cad1bc3f5087bdeb4cac03de28fc6e31070631f36ab5526d3d2f886dca8436122c605385985cb5dee7b09ba88d6948a7edad4a882a0bf6a38f9ba0e9f0dcea1fa1d19fb68ddf43eec7334c20ea8c7b1d633b55bb3fd43074b5d725a0b92cbcbc35221dba0142c5a942fe841515d191de04ca0a8540f15daa5c5b43726c1e0bac85fef0068ecdedc16b2e7135e1c24677439d9675cac9cf64fcbb76a18c1d098336c76cb5a04fd2ac395ee7a9635375c6ffba51f9c44042ee1df0cf368f35bc71aeabdec02cd35c3bd0b5943eb1d99a8173f43a789cfacea1ce6f1966e869498d097df7dc262c8b5efa22e5ab472461333a13bae03bfc8fec7699097ee8574ecc0e91224c8a2c10eb857325c627c197abb8ac3fc3f579f0eddd32a6c98c3ea07a2a441b3d996dcdd304ee23f04c26d68b1707e3dcaf4da34814caf447a3009a563b67db3e1b2903e0e56916e23895ca0477927558f7330d4a872f08ced8e63f2332d07a7913773dcd7592e234cb715e6a27073fea32461d04f92abf91fccf745fbbfee40876ad5e5bb403f5bdb0f4a0fef88b1e840e6c8496ae0a70a8c968116e70e4e10957264779c27b5cb93a15de977622d62cd92c723fedec110b2886bceb7f9888f426646dcf012a64c3ed2526fc81f2f65b0fccaba418650fbb550419247defa6f72d01e6821197d4d4247f08a283a6032386c48511fde52f647b79cffb6c71a1cb0d225697b25c95ac5538d9ca850f1762de8e5c88c404dc016f849612427e173eb691e76e4ecd1398e351fade49163620c9675ee6e8b100650fe9e096032735e49376e95ab2d82e0f3ce67ae55e315dca3249fd7b68aaae3c87f78d812fdf9e07c9a3c003429e7fd0880f21c8f8cbad3e9071d29db308b142545c4f3655522aad8fac8ec20e47069b3362627d64c52ff223ce8882ef76180ffd16cf20d3f990f1832b2c8df2d1a07e3dc3c6810154d3673ec63b4ae69cac5e2679d8bed7b0a5cedc66f706890f9d46107adb83201577c4d8c105fcf807c6c0ff637805043750752378320cf30135e24ab3ff147743acfeb795f9bba9dde30bb70d4135c4a4179c64a209d2445a9db289d2896ba64cc524e898085a77d9f4b8ab59b00e947e5703fd4f700b99952bfda9de2eb29e82d6b004e937ebd3e0ee3e427d6fa970e5b1ca1bba1139db52f3acd440ea7c21a02eeebf1f484620a52f59bcd78c89b87f23e98a1b2d44f35089087719679ed35cb72dc6af8333a8c772ccf0c4b29b506cbaca82a586cc837936f7b501a04f35f755517fba53812f6e618774e3f82e076e68f51335d6eba14ae78e64c6085335bf1ab963ad776ed6295efbf0ac102722ff0708b361158ed234135cf5465c3f8d0794c4619fdab5463a4a954b9c33e15244f78bee8be0d1cef8871f32fb8b26b50d2c01f2df03e9c47eeee162132a571890a082e7d30cdca42e3a4aa28bf716d7be610c9144d3d9ddf3e15440498caadce67a7627c08b54cfda6c79ac32b908b6de91e62 +ss_n = f595774420dd2cb8d039f9ce8eb74bb9c2952d94af91e8e86e292fff272a7173 +ct = b9b6c3b68f901e1143f4fa61d589645455391a09401916ac70d1cad9b42e5bd61dcf4bb62db454f580af65a8cf07d848bc85c8f4622f9dbfca424057b636fe5658eebb2c52839a43135aaccaf198f1386ed5a700bfccedd56b29889e759d6c32cbb9ca99495ed265663148d09d41cb359b16c8d35eee9ea36c0e1d3c2f2582547f0f14543df989559badd22742990661b730fa6e335a355de54031be579f8ae9201e6905fdba020010591182e9e26981cf21803cd1adf345b3ec2201b51b098312a5a58c816999404222428240ae93af75bc8158371aaaa3bf2b65a6bfd20555ca052ce2f60a1fe22f85e5010b811c6b3bfb0058855bdb41de67a1ac2ebe6145d3f17aecc7748526c7e87c4318dead3ea47ca8453cc7eea425a0e7e699a644285fa7887eaa466814ad253c0eb044e4a582fcba56f1ac13f3d9127d323063cc2fc02e71e48323b9b6842570c848251993b0d9997a8cd223238fb6290865b0fa0db00825564fcf72a5fd23b9b0fa4384479daad8f7afa8a21ffcbcca2a4ef79208dc45e6e47061302bc17720e7a35be5c5b68cdb45bbfdfdaa525fe9fcaf0d12c82f8d0a4573f7c40b453ef8cbe91eff96d6debedafe81c38cec14becbbc17cfd002aa59c425d4b101166b366dc05ff3119df9b144e0d8f180dbbdfc356400d4557928123de39c293495c5e0ef3ffece5bc5e0b3592abf2d721d9cb523fd179b3df39c7328ef14c1f3996065aea83b1b0c4d83c6967d9dbbe6bcfcd60ad60f711eed37011b5b84b594cab90a8179945e3eb4095e5a5f574b6eee525e67281bd5a4e126be55e72f18039b2b819b7aa59d9b7ce0d63d89e02a8814ff938edd153c9bf9bb562c04ad4148587c80537cb03d2f83351d60435a72a39e9a328110d48d05f08000031c7184b7ab5e6d0d327e3211e967dadef7115f5c26d43bb115b592875019675d757ba50012a6c99a1a8734d7ee731b3ac4b0f14ba714217a294e3a309dc09486507beaad37c7d50b06415355baeb30219a3e50fab7fde93da88c4a8ef91f427f86ac7f1546ae5571c8929bad1759c8c9b3dfea69a0d4ef94767633a81ec8919c6df9479a45d37c8278cdd29435e15c6be2ac5742050ea96254d7013acbb04bde44130ff7f97dd8095516c37c6c608f6bbdf21051aa18ce87a8310ad4dd0049cab6ba9c0f2363c759d7c4b8b05ebe020212bb5b65e1a8f6f073bc2dcce9c21e38f4f604654f171a740c9be29165adbc7398a48b74173fe7467a6f4265f8924e3b6084731e1953f41146b90cf4debe61b1ce4a4c33ca8b06903701267c7aa5183c52fa09289b74d4ad375373a04eee8e8f78d01f5143a4cf9ad9ffe673829779900c51d8a2a32e2812e499d9bcd87fbcf39ef15bc0a7f868989b686010d102ab17b69dfe8de3ff58f3ab3a863a79649ffee0927e3f081e6c4e08528884a4035047bce260645e9921673f8bc562eeaa7fabc952543bcb2557ed32695a981125882aac01c0effb43597b5f3d8bf3495a17c7af4bbb1e96431d4d6f278e25e7905a49e883e1d7f20c163b355565372b32182c2ac5e611087f7b5388496872ef24942d22b16c4d04ee62c79cc3231cd0bec4e6f98eab53fcaf62101b79feac777c5f95407c32e8df54509a47c4dd0c5a2196573e9d5d1d79568096c36e9631f7ea9737e8d35f27fe70b1004792d5b9f74a3da47108cf135a2245d5b2ca80280b4a7480114ec65ac070ae01dffd6b6d65b3fdd0d12c55f68c1b8fb55675e4e738aec68ae404033f87f383cf0daf82f946003175fb300e09ac1715ecb1180fc26e10a25eb1b23e5cd520b058a35c3cdd8b07e1f44dfba7091b43a6cddceb77ca0cab57ebb7a825c9d7be558b8975b7b0c26bde0d3cfe5337b99e46f6659e8229b619d8b5393b651c71fd879d7c29a1c78a9d0f3a71ada5628468565cc921fe9ca76dd8867179f877537e06773e83780b58c4a8cc808da25877aaf1b20b43c94c2220d7456515f7c81612f50dcce4327bfd97ad5f4e9d7c6c29c903b61cc4a9ba8c54bf1ad46eadb5e4f71998c413c115d6f5851cfea01dc7ea91ed319a0f448dd066cd26df9e3f836a0c7bc090d950d35de3862e7f59e943aa4bec5c6613e3ee7011d195042bd818b0997a9e33bd1f6a43294e7b45c04113fb9983dd26d6a9812925c1311b195b43e159930152b1b552cd661921657a287810b1940ccbcef15b +ss = 723ab62b92580b3def8ce887001eefe4d90565aacaf5430ee2aab7decf99db76 +count = 3 +z = b585d4eb01085111a172a87688d0032e3381a9e9a35fdd6ef2f8aeb3b40eb5ce +d = 89b0c4b23019af3498a27da290892d981dd59fa08993bc05da21e1d72503664c +msg = 0f4a070a0116194e267437545569d94aa5b2e4400645d5de88c504b9dbb1455e +seed = 950684cb360ff0c011fd02a09a273c9f023d0a34ae0aa338c6f5283634ae9bef5d100bcd48f6577e5910beaafe6c52c3 +pk = eb8b14a34a90245a20993b61ebcb1809069a93b0afef64cdac92a3086360ff9b44b93220acc7c1fc298678a290f0b61a578120516066dde21e86698c5201a387e5b9219c7a41ea1ca15789e8096037e5c70028096d4b8b8a966f88e7aba4b72a4a705ff3413bf35b10e3f070fc81444996ab9753034de678513305c8dc4614084b914926d9738e378b07e7a19418910d1d171f29b6bf06740771fc853b5786996a330a796f910ca9ecb4a0aa60c7962c99b3098a5a097947903814872ce9c4aad701c5b137326a17cd29c4093de6ca61b1438aa8af8f43baaef199e9090e5570aab462bb78502dacc873b1bc2b94007badf22a44751526b3abe2f522b8f96bec02a5167224b298a79de06fdae88f0bb0689ac1a0d9d005394cb4fff3b51cd01a33e43326d0bf9a3216bb20ad8905a28734997416ad9dd8a8cd111116273230f5036ff048b563618824a1f5549403363166b931fb015fcaf99a9b45c2294905d3c89aaf0b89d67b2ae2c747f783b7767477e268c18b82915dab09fcb2191802ba7da0c1f2a5c6dc65377588c9b423b90e1555db8221ee2b2730c6b783334c7f9902a5cc8080c78be0c3ada6594f7eb3bb8f3c342fb17bf6b002aee28943e47d4d5ac1a9b689a4b55d92a56c9210980c339871b35ee05598acb34b281183d5689a56e997e025c74b2210887336f476c9f039be7d46c4a6942e50493fc9da957f4381d7359e4e69a9394c6cfff20d94639dc69c522ec119d20a6ce7536e03b8166451795b795b326871eb4b604e7bbce36a495a669e33e7491ed1833ccb47c796128fc6745acc401af7201cdc176d5a8b08638b79b59604fcb88ae84735737791c49a3261961f13a218132713e1078d82b1773573b16b27e8615a25b364cb31b8ccb1180c1776bc9bcf0084c08c7c2cb58973a80b4e4d1a286f02179df1341fe17ad497aac1d99fd459b8156c806336ccd27956d25153b8922cd4f66183cc46dfcb6713bb8276e2a0f4c16cdb9385a070b494b216bef961d7d59e0d6239a69b375d989ad190a3faa6636ae09969bac5607ba1c992a07557b0af2164810a895fec3bdc3a8745f4b2363a3ab8c71b33ec00dce97e6a44a0d15a87e5694d543771dd348ff9501fa063997c4b06d7c54660323d93620400fcb838f35f4a5b3bda1b6f07b1765ed5a387e268aacbc846c20cbd0b88ddf8208a684f78ea2ff981012346a3052a9209ea1e1579a238f26f3dc6cb8f9571de093ad798596b6b1f88f74910d4369404a480531f2d8b66b1176fe929afacea3664a1a6ce09bf0f9135b62a07d001b545b803e58952e2bb87dcb84785f8234d1220f9d815df60b692fc1d96d0b6507301edb1893bf2885a8a6c15935acef53daffbc796d5703fb3c95892c981143c0fe23c4c554b2d70bf93b61ef5bb285dac4370da9ea36828f35a20ff952abf1800caaa44b2fb0de0e82b0c0a394409b66990cf9da43962a903324a0485230a3e9528a901208fd47e3486a48b4c9e3cd5a33a75c09b0608c3a380e382400b68b268801604601a13cc925981c9dd5928dcd3128d349ff5490da7cb303df5900496c6dc2061ae2529db5b32ed6617389c4adda2720ca45ecff1a749452aafbbb6b6996aed084c0efb28cbfcab20349a6e042598e9449f6c9b36c6616d19004ca06244249c5825c8e415bd589ba78121bc1872ad2fe6a58747c84c68876971234f095fbbbc461cb66e0eb7bb3132b170666bb56a486d9089c24b17ffcb3d69370c18023847358e58107b1e35b00b078f577168621c563ebb6e3d308b5ef816af85a0b815a06500bdc8960b1546ce7c856a5b3452d59a9791658a8ef70d44214d3f434cdd22257be42b51ec9f04339392c36ed88bb8744428041427f19579a4d955fd605c86b48edd76b0bf293c07dc4250497d8c769199692ba6e8c1ac354ad176120e5b3e7d69109a7a55a5fa7ff1770f45082b9448107471ad4e2c4ad2a72802397ee543523154a46e496d7b12320f3c7468b1c9de3b54eef8302db90b7c337547c81afd16bcfa00b106b739549748658aab3b16327a55735b457ff65c7548ec8b10831051200783488ca4d8769e931c373981c6d35aa1776ca966b0a46351471383c8aa5756a1a1f9e1bf2d184c347718f2f342e4d77e0a0206ea6880a606c5c1ee917301b227bd0ff61dec24089a0e23320053173b420275c14b1bd1a35d4e +sk = 114b6696e29c107050ad1b634b0934258a62ef10ca7b882e5b3b614bc90ee7a7360e8401111787fe9a545b8596d7fa1217144f6b318caf210c3ed4c2f535c93809984448c8da46c3589023c0599fb1227e693bafc21a97b2064071463c26654e7b85c48f0c3e939509595b1f430ca22dc9a7b7e02a5e5469de200c6d2203ef59108b557f608292e9c4a25dd74474db10b31b28acec0f8139056474288fd38817ec50daf6687e9a0af5c819d572504571b23ab67f414321b76913a4c21b8fa0c5517626830c4481e136121679c0a5a32859cfc4b5bcdaf941b765208841c2eeecc8a0693d7401c26bdb83bee62622106165231f884815d733c826f52558fcc4a2d5c12c4403cc064930b2432457c084f37fde8a7f220b53752082754b1560a2509580b60e27ac96b78ee582c9f0561bb2e69d9bac5e1a283abe736dc4b0bf8af62ef155b0538b002cbc253c2b59344ca0f2f128a253c993fa76f1eb1a3fa31acf126a051191675b8f9827757b427ae5cb14309ab03d0a882d628570c987b5164eedd1271ac8345eea57e5e40e880b3fde4a2598c01c850931daa7929306acb68ab32bd387d3d6ce453561ee72c59bfa1fe1488de4099a27018f331823d645a13000d053b9912b488bd1c2bbacc65821796f2d6566a14cb7050bc48246112626217482068f8595f83a48f87a624549a6f47863c8f1c80ad1b8c061c939740cf52610649ba820806b00bdc22ef451b6b368c1072388fa1485aa1c37f843aa6453e4375e94abc66d51280ebba70785b909180e904889299165e5605f6f299e960226aae66234b00c2ee17376db02fc29b8e1269680807082200c76c7a58bb89789f1c375b58dafa52aae4c2099db61fea5690289995820047131b7094a84fe66225f127717e458a3d22e96f8c794e23416d3609d5273e8996b96bb4b58ba92b6fabc7b486475261550970496a877caa65c194302c91b56eb770d6a24c4e6d892366360bff21a86191dea05ca2c524a6d11c2d14ca0b14560c8514197a20c236b4473d7af87390f434b2239905912004096f8a1a08038b6e6a6e16b1ed74b5d8c49832568b11478cc563c785c763e40098549ea8bbe46b260159ab19b644289adeee798d7836d1cb3ab2efb1375479ffed38b266b99954cc53aa21291b84d6731479fb6b46e0836ccc0a3a5e74dc567c21064849331603cc54ee73848cec1b546f2123e7ca9f6767579f198f76299c6e2122718245d406e10f49bf5f99ec5d507d1746bbf79371b6c2121450936b33c42b3c02423467531184ef4309fb73d778513b9026d7d835b239bcb8e31b0b048a4362a9f944c8d3fc277b7db5a730b594c8935d5937cfeca7ec850ae1044a264cc807004a561194434875b37e7cd8426bd2e37be6c2ab712631f34367f3a189309c35c9ab04965b2456761a5fca33f809c45d4a9c98c10b3f17801f3e933db3aa2c19150f9360897a234cb47879bf5a5cc81865084571df54c3bf92b25e751a11401c4057cb0b59b6324a36f610de81a1acf460681609b0d687368e61f1fbbb9e4da96072c7e4e300c3f08648bcbb40421aec0383cdc5c6cb7b75f72f3c1a503077e172dceea16f5571a2b4391cd7caf80e96898d2539a4cac881837155018fb8320efc1ce9be032b1827baa132582994132b268edfb2851923d013c28df074cdbe3a66de69902099882e99663c422db3316f5d01223da7147a67f207673fcbc0cbccb10f00abe6f353b928bc3c41a3bf1f3bb417367bb973b9420487ed664f28b96eaa085fcc55b9e278680a78e89e60bb6ccb6c534ad19987145f15752a5671c3c26d9b82432ec1ba11bbefef24d67819717418fc3c2651473991e203a9eb4cb6b375db7366e8cd1bbfd8068258ab4396bb5d114383629b3275654b6b9924fd0034f127462429497c473cad905b622958ce75b130557e11179cf89ca65c58fab4b05f95c33e81192801cadbeb96af9aa089a2808741ccb646720ff8308776894427c8d52212eda0912a3868681088f3543ad19a8759c7c030b934b505828dd26123e25a370f927ca770069360117f21536eb885ec23bc8397b71196579f9c5e8a94cef5b8c65c8375aa3071c920933902a1bf39da682b213139dd750aac6db956257441d5aa01a40cb61b80c968cb50e50a6eb8b14a34a90245a20993b61ebcb1809069a93b0afef64cdac92a3086360ff9b44b93220acc7c1fc298678a290f0b61a578120516066dde21e86698c5201a387e5b9219c7a41ea1ca15789e8096037e5c70028096d4b8b8a966f88e7aba4b72a4a705ff3413bf35b10e3f070fc81444996ab9753034de678513305c8dc4614084b914926d9738e378b07e7a19418910d1d171f29b6bf06740771fc853b5786996a330a796f910ca9ecb4a0aa60c7962c99b3098a5a097947903814872ce9c4aad701c5b137326a17cd29c4093de6ca61b1438aa8af8f43baaef199e9090e5570aab462bb78502dacc873b1bc2b94007badf22a44751526b3abe2f522b8f96bec02a5167224b298a79de06fdae88f0bb0689ac1a0d9d005394cb4fff3b51cd01a33e43326d0bf9a3216bb20ad8905a28734997416ad9dd8a8cd111116273230f5036ff048b563618824a1f5549403363166b931fb015fcaf99a9b45c2294905d3c89aaf0b89d67b2ae2c747f783b7767477e268c18b82915dab09fcb2191802ba7da0c1f2a5c6dc65377588c9b423b90e1555db8221ee2b2730c6b783334c7f9902a5cc8080c78be0c3ada6594f7eb3bb8f3c342fb17bf6b002aee28943e47d4d5ac1a9b689a4b55d92a56c9210980c339871b35ee05598acb34b281183d5689a56e997e025c74b2210887336f476c9f039be7d46c4a6942e50493fc9da957f4381d7359e4e69a9394c6cfff20d94639dc69c522ec119d20a6ce7536e03b8166451795b795b326871eb4b604e7bbce36a495a669e33e7491ed1833ccb47c796128fc6745acc401af7201cdc176d5a8b08638b79b59604fcb88ae84735737791c49a3261961f13a218132713e1078d82b1773573b16b27e8615a25b364cb31b8ccb1180c1776bc9bcf0084c08c7c2cb58973a80b4e4d1a286f02179df1341fe17ad497aac1d99fd459b8156c806336ccd27956d25153b8922cd4f66183cc46dfcb6713bb8276e2a0f4c16cdb9385a070b494b216bef961d7d59e0d6239a69b375d989ad190a3faa6636ae09969bac5607ba1c992a07557b0af2164810a895fec3bdc3a8745f4b2363a3ab8c71b33ec00dce97e6a44a0d15a87e5694d543771dd348ff9501fa063997c4b06d7c54660323d93620400fcb838f35f4a5b3bda1b6f07b1765ed5a387e268aacbc846c20cbd0b88ddf8208a684f78ea2ff981012346a3052a9209ea1e1579a238f26f3dc6cb8f9571de093ad798596b6b1f88f74910d4369404a480531f2d8b66b1176fe929afacea3664a1a6ce09bf0f9135b62a07d001b545b803e58952e2bb87dcb84785f8234d1220f9d815df60b692fc1d96d0b6507301edb1893bf2885a8a6c15935acef53daffbc796d5703fb3c95892c981143c0fe23c4c554b2d70bf93b61ef5bb285dac4370da9ea36828f35a20ff952abf1800caaa44b2fb0de0e82b0c0a394409b66990cf9da43962a903324a0485230a3e9528a901208fd47e3486a48b4c9e3cd5a33a75c09b0608c3a380e382400b68b268801604601a13cc925981c9dd5928dcd3128d349ff5490da7cb303df5900496c6dc2061ae2529db5b32ed6617389c4adda2720ca45ecff1a749452aafbbb6b6996aed084c0efb28cbfcab20349a6e042598e9449f6c9b36c6616d19004ca06244249c5825c8e415bd589ba78121bc1872ad2fe6a58747c84c68876971234f095fbbbc461cb66e0eb7bb3132b170666bb56a486d9089c24b17ffcb3d69370c18023847358e58107b1e35b00b078f577168621c563ebb6e3d308b5ef816af85a0b815a06500bdc8960b1546ce7c856a5b3452d59a9791658a8ef70d44214d3f434cdd22257be42b51ec9f04339392c36ed88bb8744428041427f19579a4d955fd605c86b48edd76b0bf293c07dc4250497d8c769199692ba6e8c1ac354ad176120e5b3e7d69109a7a55a5fa7ff1770f45082b9448107471ad4e2c4ad2a72802397ee543523154a46e496d7b12320f3c7468b1c9de3b54eef8302db90b7c337547c81afd16bcfa00b106b739549748658aab3b16327a55735b457ff65c7548ec8b10831051200783488ca4d8769e931c373981c6d35aa1776ca966b0a46351471383c8aa5756a1a1f9e1bf2d184c347718f2f342e4d77e0a0206ea6880a606c5c1ee917301b227bd0ff61dec24089a0e23320053173b420275c14b1bd1a35d4e7eae5b4a8d672c42dda76395db20e3cc3d2eaadc10ba6326b2fe728cda98b82eb585d4eb01085111a172a87688d0032e3381a9e9a35fdd6ef2f8aeb3b40eb5ce +ct_n = 2955adb5e21a1f72a2e3cb633a3e0f42fcac9096b0d62e4a45878ffa0fd6bdede4118fe325468a6f2b7e91cb6231413354c4c655d9aabb9d336064673f55857d2e9b0835d165a3bbdf8fe9de7e14be2ff03b0ec7e517afcc8bc682f6d6626491a9bfeea98f961a2a0740ff32da198559fcf5ff2c38695d17dfa8925569c13e5e0e7978f6990f9feb3052ad995b2405a010de041b36ac3c28e4df6b64e6bcc43808e63e1e4b76de4a7dca791c263f107491626a3054c229c648a89f27ced4670dc9aaac3fb95eea408833c318e92ae9f9719192b6b641685c6bf900ed4108245828aa1b7a2dfcc6f882701df533263c561bd28bc3cddf84ed00eb20da09f0089dac580d81974a75e48d52e1449ed97c5973b99a5a5a0980f4b140412a42312ad1a07f23a6d0b004437248e0de79b6e58f339284aae8c365e33c4a757d59805538ff8f1a6b6352a319291bd62e4133a8c3537bc378327d7585d61432c8afdb358eb785d8167bc494dc02dba635d562800a6fe345c7d52f6f78cfe00170324349bc8668ced5596b480658ac7db29ae8193d07056d2077a7c39414bced8f4e7312661caff6bd4cbc9a4722b823e90872bac85d808e805d6b8e7a45d90f904602f4a38e2163ba848dd5de4af6640400c8db59ece3537ca6e8de78df4d59c96f7cec9b525a0c0a784bef4b800f5a22d0d5b3441f88ef10dce8bc20ea03202e4393382f1c688f730b4991e97e94d404b787fd15ab213af68859f6dfa3946ee932fe944379d4dc263a4ebc175a99ddd83b32d9b7f848fe661c60473e8090e005730a770544e8951c566bd81c41d36139849a490319b5bd218d292dc8d49fe7ac7fc90bd999fa4efd83f1b18dedf39cb861e9a861d0c07020d6dac8cc8b8ea57ce890f295323141ee64472a85425fb6b860c25c976d70aaea1100c664d90054defc8caa043ea41f229179dfca9c525e0cbd3e43f797eda02f2072582a8c3fe23883d6cd28269b056e404b99379fe0ca83a0dac9ed33980dbe3b178275c8e0500ee36793e6199df4684584cfffe398bfacd28eac58bf4d83bfe4473cf45a965ae32aa770e059c24c8b3e7c02bd333fac5137c0b5bbd34b356ef368722959acaf3c6d042a2f21cd2abb059519cd18b2016997ef854cae1def19f2da5bf6df3a80c08caa17fd68e62bb6e928821c6ec0b9de6fc132b650aa1b919207a7759f87c6381d454d669819758533883e417fd21cbf44706a144b0bb183c8d6d5607a9ea29d72fbd8f9a290b4990e5dfe27c0989a4a10685903404a9081fb9af610983c6101f306f8bf96134f6e33168f583043b42d5df7f6a907d1d0cf3c8598e8f3e4ebe791bc74965aa917527980dc37cac0a1429e9bf310fbb90e6def45086c3fd4cbb6d287a00d7ccc2aa58ab9ac8926f05f11cf8f6d25097b459821fd55dd7a857fb84499c40609f598c8672f3397c3437e4f423099364b0d10c519eb68b554e811a241eaccc73d6a4b628b528022983249c8f093c54c80a2ebf512010e6ed625ab32c0a10e17a98ed42caf2a37f2920fbc3b5ce7a836f61d790f40c979416e87801a6efeefcc67720385393c602ceac62be6731b789d5d2228f5900d42242f530a36bc7cffbb5cb5de8b1c949d2fe04efa052faadec438f2443698b83884805050a927b8d51ba2bd8ad9e88dcea172c02467b148f4d93fc021ac92dd90afe63958dfbc4ad836601492878d2c484619b2c4fc277b7e594a09552c98efc5a41762f15694c48538bfd5e234a1f1b28c849dbe8811edb6e9480707edfd672ecd8c0cba96fcded6e9c87e3d49c72d52803abe460bee6fbc6a3794b55be388143c04d960658806d50b17791c15dafe71cb56567bd8735f67a8006f3f5a5894afe45bb057b2cb2e4c6291b9e0a8eadd4bbeed498bc6d4b653a1e89ce7cc78e4c08ca1bf8b0f15d9d7f25fa0a6dd606a67748260d9191d5967aff0da82a4df1733e8939ce057d0544e4b9ab167da0c0cb15a8309632ad739ae282b6d328df0a4f6c03c7cf181dc7da1e9a10db7ba31d0f8ed01bbe4dcb7134a5bae07583e903e1f5956d06cabfe7c3b07399c6cbf1ddc1dbfb1b3932761e61de05de525fc1f76f1facf8b395cd1709791e6c09c33248684c88b0d8bf2660930ebe4d5ae63067db00404e24e4464d651e4d9d59f381cfbfc761ab2792aa4eb8390a0d0b8a91a75a0109a69bc155ea7b351 +ss_n = 9d9ac0a4f83d15f6535d56b7bb80c5f8cff8d979f2acad144b0a18ccda9978e5 +ct = 7bb2a182d88867850d971f7e8cfeca4a3858cbb23ffbaf16c1b71bbc28051398e78de73690268fdfc40e4cab16a8c1bd791277589ca7b065e2ec3f28fe0aca5e7ba6a1bdfa85026c94a1d70d422ae1d8279a18db491746218537ee262ebeb7f246992397ad07a08533dd6fb129deffad30f0e370176b7e6bd4ce9dba4cd061ff332943a487008a0ab67a1266fbe723ba462e3d70a49179776fa2e9ee693d2659ab5b73862b75c3140097ef9e43337de7390a74b7025cae1b31c3c3d8e312920bb391d4cb6b17b07a32c6752c12cbe2b04f1a1f01daa4a3d53d3da050f99cc32330bdbf9a2a0e144f08628da174c00057643289159ae08c1ce41ee50762ffa65946f99dc7326d3612d4584ed83525fd4a38c6f6edd1d2810e06afda4c2a99ebfc4139dd1a8f8adc96d40e6e5ee63d3402b050a8f95ca966f1970b8231286f6cd4625fab9ab7e3b40189047641e749d0a81acd964d3374f681aa5f7fbcdd447784f7d76f3ebe335c4aebf06bb06f8f0eba30f7b6cbf712320b36a5db3bc12ce4be40d8599571a7cad2ae002ac11d8225e2463c955814a69106a89c90ce64f5859b55c58e4a873423fc761cbec9ef8021017efceda13267c221851d36ccaced482fab4549c8f631cfe3a179764b135d19b778296013e7ad9f68b62fe685f788cd8e4d597ad31461906a34a1ad1064745137c7e8d35a35436abbfe3a0067b28476abc1a5dea687d4d5bae66e2db086c26e52265ee2546f106f2c098cd0ac109a58d25c60bc52e6591e7efcda3e26c69a9455fbd2151b78f91268cffe8b1ae0fde44ff7c78e53b8d006a10480b7a10f024751f4d5621ff1f83963c1460c5437ff785aecb93f9044861bda8b63c9c789ab3e07cf84d4cc07ffe105ce948ace7b8db95348d37d30852d1db1166400376005f71115d2f8f2827ebb4c54562b12fb4657de1e642a4f8332ccb8f2f5a718b327ed4b09d709796846f46a181c28039603d07aae119bf13c51ca64c8f22a0415fda19d22b39a7e77df6ee888eaa9ce3bc0dda27249f5e8f0e677541997b3a821a6356a3e79ad48ba85f6657c14b9198c98f5926c5d1c11d1b1b9829d561b71e4e38b26dad168d96a58715a95c016d92f0bf6d9a55393e28e0b1c628cb067158db18e1ea4a850c59b07f48ae1844af9d1624be4fd66591a08d688356c5bc52ba40b7072688ce7c99c9938d59f853dc2290438f536be8c3620598408302d19124cd5514d27835f1fe00215601b05c5a5717b55871ba819830f1d5dc942e622f95960c277bcac879a6a40538c4369d1e5ccd30f8ad28ed3eb85a68e9c97474fa6cd595523d68e161f3a20dfa30ebcf96a369b1641eadfe6982e090ba2b77c1528cd040f6ce64613940ee50d8618fdfcfe5f34e650be51134273aa4541f2782d593b78f40ed5bc862672260b9dec35303e4eb22f630450c7f7c867a9f26830ab42961916947386a38c47d9dadfea96861c662fdcefa3938dddb200badbffeca96773e289a2a00df44a9231435652b38b7ae12c2df1132f1d6b8143798a269c535f643a953cd3c60dc86d6bfe40af0a44ab98712246fa96d4f6aea19b56cb62696f645ed29c7ec0db3d5bf256ddf29a76fe2108fde11ecc09b2521a83cb5478073fe707640be0738e15892f60edceb0db6bad3a541e9d88c8fbc647a9ebb309e9868ed5e65bb7f316127a8db9ef1ed5b8d412c526579ee3ace30e58b430b4964d11e693df01ca6cd852b81ef8f445e94ea69dd33ce72d929e987556854bea97600ea2332e789b3d12860052b21ff3ee1bc02cf429012746870a4ece040053c2bf8162e0a9df36bd247b0200c6e7602653a36caee3769fbe20116d1dea4435f1223249da6d3db603b68ad6cf98878cdeeebd1e520810a2fefa0356722d02c761567d6118a8ff3357d5c5fa191f5578f0f818bb200a6808e21d70f77e97c612d4682345d8120e53a64457bcfefff6afe11a7c284638c2e87933a178650eefe8b2664f75f1cb57a5dd9886d7865c5a436c99fccf82aba71eeb934b6ee310d773d89ad2d889619bbe6e0cf562ea47a93c2160ebd42a85117d2460e1c6d9c725a06be03e5334f4ce2b4ec1dca5669f381fe5fb1b23d837a0d3246a3cd6eb9dbb951cfa0bc056ce9acfc2962648f61b2bb7a5577e73e1e1859ebf39c73edf06c7c44fb36093d05a2d38cac4c9e5cc149ff10486afa5629c27 +ss = 0fc062f77b22c6d1e9124b60752c5cb2c22cc7e04f7c42a61f15589ef9bf6f06 +count = 4 +z = a9f93c7b791356b66afcceb745a548c7f6b185e4f45ec1ff1a22acdd96e7a6d8 +d = 8d45a2ab49d8c20d4ab5680e5c9d9d0cc9ca8228484946f9afce5b8df6f39d19 +msg = b3dbb0bf61a5230dc0ab9f1d21d5c16566ff9ad805a5e1eb7b2d6913d4cd5607 +seed = 0633ccd19471803e0ceffc7a11b2e7b70c3329dfdde5be18160df0d4c609900d67154893921376cc4b4b8c586e3efe79 +pk = a9a1c276f803a4f215315c46acaa8c593abedb798849f5089da152bd83a3f75324f42a3a605017f495504d42370b9c671080ca06c24c3c900d7c56adeb948311c9c21cf337ee6a85aa3a10f077baa659baae35288853b75acc9af68b0481e1842f671b159712f6609616527218157756c95bda361002924a2c967d9a87bf44a8a3feb2cebb16ba07fcc7382a5427c8b3d9f5b16cf97370947ddfb23a54ba5e8ca767c68b9238c66c1d99177242b5f4f986708a65d3d32591e65632a204885a307a1a877aea4bfb9c8385d70ea4905e66a2b480662ca1a4cbd69089e95463a69442467a33498b98b35a47bea116e8fb3bbd091935d3059e542df576025f620c47c978603aa2ccd041ce251012cbc65240acc2cba324041b80b8be5bc02be1703a5c118791c2540242511cf3c9c43972a7d49a73e45d42580fcb1c99637661c197681eb001ebbbbbba33b6ce81797e22131ca09cda5a3d370ba9da4c0e1a0140aa36101bc71b87527b3347acbbea6ffb217078270201a56c7602778641a22de4582913b48a877888c19b9c54925b0a1d4f8c4e83d3836f51935b48087b1962a80970bf6abcaff281d7b5648c590b23d325dfc5b70a5b2f7c379a0c67c04e00648452b82cf7c40f33c0f7c42f2f5a4fed80324953597d83386748383f185e7ec58eaaa0c6d0e4cc73f3c92efaca0714387ba0ccf1c396c674152868063edb435e085559466ec0b801f79a90eb16ced824a61fda925fd9b462ec75f19155db95414b86ac271c0831c36dea0888b00269e0542aadd80711606fae6062c75baf336b505bb3704dd73d7d792de8c96a5e9836034b902233a0dd54afe0218094b8c6e0c57475888210709150075283c9b6e901bc32d65272593843f46b90fc9d5edb97aea2116187cc0b267d0d317f2b526081f566bde3b84c28a4cad4a776916bfbbb7f17391d1bd22c25440973f93bc6982330511bc6c72ada515ef02c1dfb3c53cc505fd2104e6d52b6e061abcab800df4731c2197c023699189a7d1d01b9dc563225604a0ac34efdf935f0373a463562e386b8b1e8ce58868662d91d87944fe8699a29810939fc70d4077d13d7183fab6f6573c3bd65a3a5714669834d853a692d57af5b945a11264fe09617608c92fc36a28cea1e54089b5fb88e5ef83970d0abdf45cde330cf9f677c4c937659609333f905dc8084b93b06e9d66daa924471e0997ed30440c555e0e2ab5ee5685c563c2355a6ee706f6fc9925cea8f24819245840c5fc78a03a9ce9f2747fc28a67278560dcb95c44548c7e626758282664a36884ba421650d31334679f5125b6c09a561114d203a9315c698b99fd3f1a56e72184d37179eeb74700c58237763cc0b532b192c0dba74cb6c67dfd260955b2fb3d25061431e5348292ea7337d303b4d7cb862fb0bd065948754cc0bd47a04264391e36995d66c84b5690320675adba536fc42db97b1b425578e97574647c82746235aa988cf34358c0276a2c05384d3401df57eb43c91e11b5290e74617d336e254429f631508c48d49f8355b629de20649edb774315356daf72c5e9484a705167029449c209ec77a05fab2912a4c1ade1b248262833a3cbde274ccd4f19486191f13c99f4eb15d4bb377013b76a6a809358c5cd702146d289f5e7321fb3c4d45f945ac0a6e2fa303c20c5a0b301c3c00a9fcf687b7c25269e0ae03bb7ef65841aa11be1cb395e2717f89cb2881e62ea5794d85a2c2ec3183b5b00c8d0a544b703e2c529aa7b98b3e43a67fc235f2a1a9d6cc51da9798be4ab3491a897595625660c36dc2a7972c8ecc68310547b06889701eba2a8a2b07cc62a3c47a0e8f7901077a9356f1ca73583c61c8b43aa21b8136871df4beea58a2d0ab508175b3a1498e59bc1cb2cc92e4a0a4f9c7b56d7a3e85f7a6bafa122a570d23a3cc0eb135610c27742bc10f225dbf77bb7c690fa6a973a4a5ad6d26b2fc8009baf5858e367b8ed3ba9cb2aadc279285c71c3da272e8258fc674cce2a180e2874a2cfc4e0d757b5aaa1cae594c997398e7ec72ee4519af7760698212754951e04c2c21571162da89841b1a7f80a48337760346b955826022b22f06b34f4dc96d9ebbcd9eeb7761c188f4446e78962eadb894ba2a59dfb4118af3c3eb2ca5dd791b96346a4de295ebd676f386e5ac359dad821c4199bb28f5f72db0f0142ff006fcd2a8139af1d2 +sk = 97c3215241559dcb584b06501084676e5272c8f73873d4255f6cc13b6c6c450299dc638f788112bd31a8395b76b772108f7931b82b17d329961731592603b703000a5098664991aed25c9526d7cb2110280007b34e24b936623034e9ad020237549769afa6cb33ca4ec7f55daf8a3445824f6b0cc9ac11c60004a9dbea2b3cb97ec86c2a5a3a283dda5f629983f9d573e63970e4bc9b30160371c70f934804f2012e1911cf80b42e8cab7eed63844bf19c690183f6971662678be14c31096524a4fa998de737bc9826a124bd6ee385e65468d19c82aa05cfee3270606557675b95f8f32aab8a749cdbb8f826573cfa9fe50947b375139f469cea227f1245919ee940ef0031f91361c9d0421bc755ac571f5903b84059388484730f881d25e621aef9cddeb21e71e4b412f7604e6654372a59c5e20d2232c8d01812a0166f0d2a5762799c03a8acc0815cabe5b885c400d5c16dfadb07d551380d73973f7c66225b124cd7648508953975c3f70677f49c00dab58ed5e9c49f1b7b0e550a7153702e50043e42102247b94f08c1917a9a294226c19602654415c06c89f3a67a62a35716dc6350989284c602fb2b7a17d5bea1f926cc4573836072468accbf7a6f50aabd7b3452d449bbda8a46ae739243a84560b90e31426dba748531b853cf40abc6237293b057e606493ed2491ae412ba58c2f69716eeb78f5c226099e3c98fd92551a614e84b8bafb2061cc62685b320553a7d5a1703d493263c46a499a4be27145444d52829c69aec721ff428301980a5500b6ef59caeb499a348ab464074078e113fde914aaaa60468d68a25967c06e908cdb87462360c6be684fd29798c06a842e983602659a66682d44499ce7aa969a082887c755cd58374a86c4cd2b09b38a144e79d9805cc2ab1a36c28291a7c28a949ad977c396c454319d66862d216159b9204226f762cc0d4d282f289aabe15371b305fa7971cf0079045154d2c928ebcb7843d66ca34f83261a48843968fd3497f0b7cb75c63437b8165a5f7988384bdc258a1bb8181e7050e7cb0a2584b4439526ad8564059833908e156801697e546876f828618fb7162b24046599035aa07e824aa8488370bcc5a9fc86bddc2016e952418c47d15b5b062fb64fb1cb7dd97868d8a6ce2246ff2c51f6d4cca0f420552459a57d10d54d98264d3aa319872d7daa718d88fb5bc1b1ef0c22572588bc557213aa820227269e97bd6840934f79f6f62149b08c72e852dc42c77d302c5491a103ea23a0d529652d90cd86214f955570171a84877464b2635c7b6b1bd2287377b2d634c44684bcdd1075055c342c77bc25529139b829fb0154e2d1505b0e4037ffb1dfb15269c00710548701b9582df757cc7523ad01c126c04654516369d244c7c286124e1025395626c5cac8d4046b993cbc120a4e932837c5c22b8e00f3adc5b2f5541e350c1f96190e6057bf4f031756293452a6571b36b99090df6b84454509f9a370f5ada0dbaa84f199c65f0c66a6f9b39e8c95618ab9fb780108ffa22b57a300a299cee4a7e77e92dc57264051ca25088830dd874347c1a748a58a6dc61f2a25a39e3a595f696969067cf557679a286f3d00138e84999a2ce7067cc7a68a05b8826747b7bee09c68391656b103ceeac3a37a3493bb649a098225df170cab39765733574736568a5b16c272017996958734b85d15a74d566e2f57d1825310424a521e4440443c63e893622c31e3a33a57fa390c2b95586b5924d494a28ac86052501754a152ae19140a8775f92712fb87117a950d09910979452570c9ea963207a8657d4305181314b1c85c6bb521ef6d838af498420952a32f83980e7502666a9b82a2e61118e5923599c8b063190b35bd135c9c2687de78f855830618b0db9900aa803328445aeb5230d5118669f0870b7063e178ab1633361e448cbeac9329c0a6244d8789e5117fc737ae56c76c258666b66c2bb3758bde6c1c379adae284692436f3bf24018250d7a6aaf1d5a52e8328fb5f81bf5aa2ad1f68fab248f1e9062d24242a1449487240c64b3ba03731a4a67a2da0362cd85750ba8c994283774ec38081a38ad8415d5a100dd2c38837cbb130c1df77171bf0195615bab5df36657d77d48582419fa9fbd46c21376338ef26d8a8805dfe145a9a1c276f803a4f215315c46acaa8c593abedb798849f5089da152bd83a3f75324f42a3a605017f495504d42370b9c671080ca06c24c3c900d7c56adeb948311c9c21cf337ee6a85aa3a10f077baa659baae35288853b75acc9af68b0481e1842f671b159712f6609616527218157756c95bda361002924a2c967d9a87bf44a8a3feb2cebb16ba07fcc7382a5427c8b3d9f5b16cf97370947ddfb23a54ba5e8ca767c68b9238c66c1d99177242b5f4f986708a65d3d32591e65632a204885a307a1a877aea4bfb9c8385d70ea4905e66a2b480662ca1a4cbd69089e95463a69442467a33498b98b35a47bea116e8fb3bbd091935d3059e542df576025f620c47c978603aa2ccd041ce251012cbc65240acc2cba324041b80b8be5bc02be1703a5c118791c2540242511cf3c9c43972a7d49a73e45d42580fcb1c99637661c197681eb001ebbbbbba33b6ce81797e22131ca09cda5a3d370ba9da4c0e1a0140aa36101bc71b87527b3347acbbea6ffb217078270201a56c7602778641a22de4582913b48a877888c19b9c54925b0a1d4f8c4e83d3836f51935b48087b1962a80970bf6abcaff281d7b5648c590b23d325dfc5b70a5b2f7c379a0c67c04e00648452b82cf7c40f33c0f7c42f2f5a4fed80324953597d83386748383f185e7ec58eaaa0c6d0e4cc73f3c92efaca0714387ba0ccf1c396c674152868063edb435e085559466ec0b801f79a90eb16ced824a61fda925fd9b462ec75f19155db95414b86ac271c0831c36dea0888b00269e0542aadd80711606fae6062c75baf336b505bb3704dd73d7d792de8c96a5e9836034b902233a0dd54afe0218094b8c6e0c57475888210709150075283c9b6e901bc32d65272593843f46b90fc9d5edb97aea2116187cc0b267d0d317f2b526081f566bde3b84c28a4cad4a776916bfbbb7f17391d1bd22c25440973f93bc6982330511bc6c72ada515ef02c1dfb3c53cc505fd2104e6d52b6e061abcab800df4731c2197c023699189a7d1d01b9dc563225604a0ac34efdf935f0373a463562e386b8b1e8ce58868662d91d87944fe8699a29810939fc70d4077d13d7183fab6f6573c3bd65a3a5714669834d853a692d57af5b945a11264fe09617608c92fc36a28cea1e54089b5fb88e5ef83970d0abdf45cde330cf9f677c4c937659609333f905dc8084b93b06e9d66daa924471e0997ed30440c555e0e2ab5ee5685c563c2355a6ee706f6fc9925cea8f24819245840c5fc78a03a9ce9f2747fc28a67278560dcb95c44548c7e626758282664a36884ba421650d31334679f5125b6c09a561114d203a9315c698b99fd3f1a56e72184d37179eeb74700c58237763cc0b532b192c0dba74cb6c67dfd260955b2fb3d25061431e5348292ea7337d303b4d7cb862fb0bd065948754cc0bd47a04264391e36995d66c84b5690320675adba536fc42db97b1b425578e97574647c82746235aa988cf34358c0276a2c05384d3401df57eb43c91e11b5290e74617d336e254429f631508c48d49f8355b629de20649edb774315356daf72c5e9484a705167029449c209ec77a05fab2912a4c1ade1b248262833a3cbde274ccd4f19486191f13c99f4eb15d4bb377013b76a6a809358c5cd702146d289f5e7321fb3c4d45f945ac0a6e2fa303c20c5a0b301c3c00a9fcf687b7c25269e0ae03bb7ef65841aa11be1cb395e2717f89cb2881e62ea5794d85a2c2ec3183b5b00c8d0a544b703e2c529aa7b98b3e43a67fc235f2a1a9d6cc51da9798be4ab3491a897595625660c36dc2a7972c8ecc68310547b06889701eba2a8a2b07cc62a3c47a0e8f7901077a9356f1ca73583c61c8b43aa21b8136871df4beea58a2d0ab508175b3a1498e59bc1cb2cc92e4a0a4f9c7b56d7a3e85f7a6bafa122a570d23a3cc0eb135610c27742bc10f225dbf77bb7c690fa6a973a4a5ad6d26b2fc8009baf5858e367b8ed3ba9cb2aadc279285c71c3da272e8258fc674cce2a180e2874a2cfc4e0d757b5aaa1cae594c997398e7ec72ee4519af7760698212754951e04c2c21571162da89841b1a7f80a48337760346b955826022b22f06b34f4dc96d9ebbcd9eeb7761c188f4446e78962eadb894ba2a59dfb4118af3c3eb2ca5dd791b96346a4de295ebd676f386e5ac359dad821c4199bb28f5f72db0f0142ff006fcd2a8139af1d2c87a33c792a724a9293b7d562ae40c906b9d4fc240c4918b404fc489f73b9d90a9f93c7b791356b66afcceb745a548c7f6b185e4f45ec1ff1a22acdd96e7a6d8 +ct_n = 954f5ccb184415b8f504f5107ac7cea3b97f2c09a2fff1ab075413c508057c44adf9a29acf7df85ac138d2bd129a00a839336528b778eb1865cbff3a4988ea04ee311fe3f4d17c6f5aa2718fc760c01d3be4596fc9a2bb456e322db7cf68bac12011ec1146b287ee7595bed6dc689f91d22747973e718c02727a8947cda37842dd62b573477230254d1539e7f6fed73adeaebec0af86ebc19febcc10f16de0e6e0aeef839fd4bff66bfd37e52c486d1e1a5e3e74ee75ebdcfbee3ddcd58b19330d15fe629b62663d482e752484e75cd62e16fbbaf52c9039a86f4013c1da7898a6d685f593fcf4ec738c6daa2cb2ba3d08405fb500f93681113430008cef55be62b4464a2e8c4ed6ad49aeb1fe7321964fd6085f28a4beb177b68669def0bfb2f6c666fe3aac2ffcf48068f3264f87ea8e0feb29e5baaac91e3c8cb7ed6447dfa5611b55040d33ad144f502b2d93ab857ac3a76ac609634677115252828c5feeffe26a889a3bc116082f1d511c95364743a10664304be0f4abd464dd64ef9115d814928eb5bce0892f627429a9c733c1d999fa46fa95b6fc4bf110d21dad1b3dd80a5d0f44c337515f661743b0852e343bed5b59d8c9c9a82e1565a5e2ecaf2fb3069bc03656e108dbabf49914a34241dc2076a1e1fd0d9a93408c4c90e48ddef8835fa5121d084610e4cabe0cacce748982cacacd4896dcec53fef4419109fdccd98c25438282be3a2a008577e5d871faa26b4452e353318577a7c749d2a96a1a45878d8eb98ed004cbeeefcc9c9c1044651f616ead2655f21d344a639afd6f925117c28458dd0c7a0c53050e4ee00ec48d3f63e62294ef3ac43c5873e82d4f557e15cc6bdfdb2c12f110ed235533203f5bdb2ade0d5bc19cac1a4c684f6fdc6b54f30186adccb9b8eb2ae1ad4e0632955ff386fcb23ebea29289e8cf328e12138cce93cb9a4b46d069d51c8cfc69428156f67832ec0df7781e8ac6bd15e5b6783b7b21fbd7eeafb791eb4203dcb432a40d0c229623fc7aa00f024e0fc61f1394bb49226e831473e216a3713e04a35ffa3fbafec5e8d8de3cfbdb175efe74bfaefe5154e6b9320d6a88bd45f83093b8654e2c9896f3754d2643cb3a6771d3a41d72186377c632f82c9477d7a75f38a93b030ec7f9203a4bdd971b91bd2f7866edff24b33b306449c86079685dfa9dfcf3ba397f71cc35593c9e529cd646d03c2f48a3dafa4f83ee51af9f9515287b238837b9ac3f1decf588f250cfd180afad34891b56c99fa8c45b38cd1f3d17a260bb8c148a3754fb22d99133da518f156f99d681264f2d5f7a84aba3f628d8bf001b78137d81b61eb95d14d34ccaa289f139718802849fe3ace3cfd2941606095aaa02dac951f4b35557f74734d792269e74896e19ca1115862529c60ad71fac312c038f72bfe6e42b9d9bc8dfaa4ed65deec76e7d6f402992a9a6cf5033bcf8493106cfdbefab830628ac576f53a92cbf40bbd49aa502d2712a28f698965d8519fab8e8621546b21b9f22d90a872ba757d9ed62d293bd73081308d4e512601b149e09eff6f1fe9dae8a027dfca4285387e8e1a512ba5c85f6791370daf2c039fa6cea501dcb486358228a8c55e180930344aa70c5e0e41540c66bc66bc80a915fd7f08b469d59d6d23ea0867ceb4571cdd462b5af2a18da9d6379a655db96271fb09415d328cce7e9e900ce8092100936b42c423903df226b2bc471a7dbcfa32cd42fefeaf44e1d609f53f5f4a206fbb03dd6d970b19f77c2d810ed0ceabc69ba8637df5de5ae99846ab8b77afc6965c68a900066863b107ec6d87951bbd8c2f7bc574a45ab8cccd21d9751e939a473f3ba2ce535d23ab9913655f5b2c9cebe9d0ce34de7e525f5f5760f109dc91da424bdfd3fa9c71b85daa9eb79e3adac3308858efc979a2c1b65397018293175045f3211c98d6e4736ba462e62b07bfc80df8b0c3225448066f90febffad342fcece58bc076ac2adffb40585e78f2cc69390eb4d90d253362a82b4f2a86bca8d0861292dc67cabb622e3c8609632bbb3836597aaab69407f96a0c1a11923dce4ac4c23dfcdb02a257590fd0d4eaca74ccad378d0519490acc399472f67443742a976e915394d650efb3ac4d792c46751315bc10292940271ddfd761f8b6e4ae6a251a0f968967dd4cca5ddd57badc428edde548aa201c62d9bd67ae2a7cacf94bd2e +ss_n = aa52651f8e61bed7d9925e5b5101e7134c2a9309dc5051fe9ffe3988f99f42f9 +ct = bab16c303772b7d8b9b98ee51a41ec73727b12dd69557c2968f8285591bc939afae45b48777b24f06591bf4a2b6cc992c7d3aedd9c0a7565b81f9598ce73e2248107cf203159cccf95501e47585aec3a196e3be879d5c58ca00c2b717c00b0d7b2d4de503eaddd83f2f4305bc6aa5fcc54d9f074a349e88501e42f8f6ae2a8a5ee643dff0ca98448621077539933db230fc67f170571dcdda59fa72fda16e128257910412cc0f2f3b4f78c58b6a1796a1f00347c76abf2769310056bf3297c5dbe5f8040b274ac5a6516b8c2889bb00570db54bd24ec6f3c1e3da2ae966a6ce873ca6e32c99ffd90d50152680a5de31ad48bac29258c6fb3f3f6659020f6c4c240676c7099f49cbc2fc93c2e0a574880df7cdbf9871d7c254ed1650993d72419538ebc9de80d829d38e09d064c8162bf08c32d1eca445d93ad9d5ce5125b3fab9e6d25d52c84b0aa6862d2d0ad56d6dbcb7983f6f36e6dccf29755c01dc19df98799d58851c35a257665a3fd0548f7b28bdd563a98465749727f97f68b11c78dcbd27ad598d88b1afb5e798217093b836f4f2912636b0723164cdaf558b11e5e1eabb4bd92110c6d6b31c584ef1fb99a2b6a038c967cb35822c68dc2b0de5893beac1b19a9f4e5596c0e2b42535b3cd209cab8fe2b600dec0107f0fe93664658313b6ceeb2004d5cabf16ed6f4d77c9b50d6fa28fa33255a77cf6e4c6640a33971008d37caf5875844baca78bb5d01464b4bbe83958aaa77edb4f2ed69ce7b214e23e4d68b3d3572706cc04a4770224b3cbd11f84862ae2b31eedb1c4415fe63aec1a73ff46b79155cc1aa4fe4e61486dca5d1438c01e4decf51df9bed10e092454386954278134842d31286cb2ba572f7655e5f029d81cfd0087b5e8be2fe908d3662d14ae29f1a3d8072d569bd78939dda5b38a14b4b6f8fc067e008a09845f1cf6a49e1ee197a8bff6b02e3cfe91d841ec4e95b3755b81d234c8452d0ab252c06964b33f1f9f5f50f46f34527785f693f890550f554ef6bba0a8c6f11685b57895f51e401729807e9f36deb6c683f20bce457cffdf117f88300fac6f39af2ac22d70df2eab2bcd81ea96d9f5628b6fb166666e6b3fdc97497628a1060cf43e6d3c6ed931b0ebb3af881f9d74f73623579ab540ade7c51795b37b1134844712777a6050c3066fc71731ea2f81c39a39b692af2f1c0f85df4f5b2022e70c29fe6f51a688c247ab7405238f10b133d66dfa05b831ca30b576526f4de5d80f3929299f0da8bd2bfc763e119560f5cfadfe825f041e275ae59c60fcc769fe098e525872381a055677970a2a55bd94ce36be10ebda7822f1b0248b2dfe9247f2dab23a387a875d158d700a7b32dc715a786449523b0d9411cee5ee6a91fe68af1a4ad0209531c4263d69245bd10a69823b985ec0562ffcf3bcda36f24940398d0793b444b0aa67cb454e7ccc40c536e192e415042b97424a7ecc9dd73a1deb27a0e30de12f8a768c10f254017dbf2796dd4adac7338b8aae08a8b204cad0feffaf5db623bfdf91fad04f64794cedb1a0d8009563b77eaceee5afe103201d72494da4a171bff51e94aca4a99d4cf939e2f33b359d798ee1d6534dad77e9054257bef389bd879382b0e9e42be876f74b2a25f1fa89da312b46130197bef8042b8ce768af8a9fb4f7069630d99d7339d9d4e36aed2c59ec83581dc1cb93dfcdf51e3323feb3af160c1bd10a0b90cb4086033edbbf54d2de923e160d6742ae4e5cee08437670957b61ba8e4016fadebd97531c15b527c059d5aefca2a2a483d8e0c57c9e66df91ed1bf4b549f7fbd082de064a234f387029b7a26160bd1bb704712c885f02d97f146c9f6dd32f387f64349dc2a9522fca9667ef70322bfd72d0773d5882c08a4115f580a67d9a858238e0ddfbef3e0f868b59aa1ad4e8e5de7ca0fe5b27a0fce412ac1a8991f53f97819ac4bc967a28067b009efd5c6f22f1c5169ea3c7d0228a82e817ed9b03b0082760a752241b318311bda9b0f8a75e04abf74e70cc8b660adc28e4e0b9b0389c60a9065821099a8f1e8969d27ec1fe3bddfbea36257ad1b22a7cd8a7f7af203e43ebd6fc5a998f3cc4b03b62719aaee36b98edfc598edc0ef2f7b4e5478ba947d8be4fbd14f7f9ba8f003704776aad1b3b468bcf259d14831f7ff12494aabf20600ee4ee6d0ef61934258482788dcf9da9a04fb16 +ss = 092464b72d6a6363ab423bc5ab0b4020a6a360df2cf6f6a5e1696b62ec6ce43d +count = 5 +z = 85da83b47129711a63c2c2f6a5bcb701237b2b0b66814eec9fcc1c560992a596 +d = 1fd893bd47ed681c7c11c9d00be9eafd9db79ae7e934b03aa6da99e019a28a53 +msg = ef938dbddec94c01a845c7f1192c402f33c10f1f0176128af219d6a0243900e6 +seed = 2605426643cab04b2801416b3239cd046dfe7ba59874a3a05c5b32a4505f21d8b7217b5ecc8646fc6a845211ae4bc708 +pk = e7d3a254d79e244c1c6f82a8b7268b09f250abdca988a8656434316a7ab1470327bca55833725bceb399d236b44616259db52ba898c6eec13b6e8ba1868413fce7ac730c18604b0e5dc3030bda9e437848ebb5bc52c237d46a7ba5c89f3a143932ac3c1e6b0af3a66c2731624f9281f59c7cc7884896c88e013729503383d492c28bf521fb2c388c457b11a099bd7b8c3b055e07e3268f8ca62582936306881c65cab7715c10fc27b3a04d7885173225717080691a8a024cc36106b2a176ec6c0fb5152e97928c3b77a7c75c0be51b1c78197311a203ea68887b6358d067e5e7704e5162b79b643d7340e21216880c747ab52d1e588792cb59f5029095e35e1802b3214832dd3c4e0b393de4169605941ab62a2d27b931a038927f3518461b71d701c3a694035553a68eea63b4a7b519b59c632632bcf07443593f43046372441d3a791fdfb6281cf6687f9472159042c71c8586627158905dd8ccc1142402ef0687f1fb8a183b4a5cc628cdea71f8bb445a90a253aa8c6e6b5efea7626ba184e76994de9946b1487262f04e040765722b414a6b485d207f4d88063fbb650c30a5caf04618b2385e75b08c0226bba86236f297d5f69bfb9789ece339c207ccb5e087f314bc05fc5ca382010e88c2d8412693002321164dbb0635b727ae6e7ba21e910cf16678d51493e2e9beb7d7518f17a3bddab7cc640ac49b5e09393931a9bde520c97c24ac50f030e0e559a4e83e1ed5531a293c65799b02fcc940ab8ddd274c2c20b034cb3cf698cb4f6207c9045a33e3a868fab039999dd65c4aebbb97f21b71720489dff1a05b07c1e56803c037b399cb7b9eb2192d896f7a8b9b51288519304de082a81f279d01e9948557014d1cb185013c3bea472f0844ac1684b38457d8a31faf097252ecbcc66ab591913fb0755d796165eba33838018de8c58191176e815329b3fa9847a159ac08945cda3505447addb123ac99693a09365229118e5c3bed50510637be321320b0a9af90f5c3372736aa8106dd865ac337c1aaf748b40b7888d09f13583c6247a8f9b46356fc0b83077605aac0d9ab647f193bd3977505b51b9c169091c67d48e813a8046af837891129332a83ca56e97beb6431bb8055eeb77f8a136246892cf3356e24a98ba878813a1839a7bbb457e5c537575c21e76dea193102bba652a446d80c319a08ced9650be2fb630da980d5f94373834e769b1cd7275263fb978bf62f6478488f81c58fd876c85b6799c974f94a0b78da8f1d03a344fc60c64650937844f935b32ff0ca7d8aacecb22ed0ca2f949ab262987ae1e28f9b02465ba6442a06b5a8d070bad4a98f217598a2464f095ff2a0338e58c6325451d7c0ccc592cd4716bbe0b07d10c68e5358c941bb955333b6d5f3364cb1a95ce16750d32dce19c33129b8e6aa63ea1454379b7b42c5bb9878cc7bf4cffd9866c473a9ac5b9a22d4670aa56304c0c00294c805dc515174b9e0545897325ff4d861efc79d826b109c991b5c49110461ced9562e3fb03831693fb79c29310cc2daf528697686d46ba342688424a73f86693d0a74411cda836401ab21b094e118aa619c8b0a2a6b2aea6b2913a5beb3b63ab8137d519ffe25501a94ac41b5a446e16b6ab83cf5030c7059663acbc7134c407e02717969ae7b025fc935cf0c77a2fa34937eb84e0e98ae6f077acc775b04a2724b00881088cd9e853b19c1c51ac9cdb696b4525b0c14d265d84a7dcb0c8486605c133c0a46508457160752a81d1188adb981640d7c6b007880adc1cee5195e9919782339285845480afcc0c240971191c8b882a78eeb505ce6811e14ca13476d9e5b79963b67672c3260c9a9867473167051ee967f3cc11452759bf4d56685571604372b9903026d8c3c5c676db6211f176c2d5e0089efbccb3820c7dfc42c41205365ac1ff7b7b743d35503825ab5faafe14abee2fc738f3575c323b6ca7a174b787962f5c759b672233261c7f67578db1e6955a9658039a4d75ee3a1371d912816ec637b7514cb0770deac1a18779128576dd50511f5f83e54677cdae76071bca9e7d755701c8709518f24f7c1f51c650261753a5b11899139cf110c4b8bcc2b9abec6c7a0bde11100412b4aab3f89d8896c18405f24225e21916ab3af3609288cd96f75f745a995b164a59b502bdacb27ad698d8f27c58a5985a2528b63fbcd6764ff88506a +sk = e4535ec13a4ceae6ab45aa49e1b34712705dfa16cf8a948a25617abdc2569d8100632c3c451a39a1682624a1bbbb1ba1c17731bd419a628997697b4807f95f08b151ade948c964b3bb0174f521bf69fb3b15a5a05208aaab40be8c57caaacb00ca0a09186abd9e58250d426b307b6501c19bd5287e079567fa392f09e03748679ff7d5cd7f539a3bccb98ca897643bc7a748c1b795b62b786e3e872471872920026a3692c1911ca41f6c1b15737e65db2df9759e1d26700d04769e2243c1fc1c5ba3aa99b21c74d5689fbc04b494778a243daaf21e90862b9d67c904d50fed588e9cf6942b7909187514165cb1dfe637d013c631e65c38c5ca59d6797a3c48a8035e05242f0a52bedd569157c14d0aeb014456bdbd3644fda6787a507894f4abee336569078add840a1741092184298b14c0001047a23caf0dd87744f17bd871c115c8a2311679584087898441c84bab29d6bf5aec33b1a1aaa8f12760b58f2e552bcbb1ca6da07b8334b97942cde12922edc474e8664e73f2c95f976e16c56462e86b88ccc3622284e1ca83c37cc24988c14255c476d7651a93683d0379bec2bbdccc570db03338c37ef913b9c21453b08c26c88c67d3d17b855c974ff0b95905819bba1868a07fbcf016bf978fc0ab49b77b871e5acfce5a10d8e4b2fea45daa61063d2ca079b1c7c9f0b3df19284d847cf5d172972912d28a6d256691b4e19dda68ad54fa4203e809dc848fd0013c09c9546d50374200c5d4184e658ab0b3a91f9586ac480a751e479670045f40e501d90797918784c972aae2330f42d6235d9c66b131842af3c39633734247b6f6094c805661ed315f9fcb694fd786020b5f88a623359804edfab192487124b13957447a991a2b0521131878380593b9931a93a68cc69b39042c8b0767ca1e7b086d065bcf5fc0a3cf0aae69fbc9bf6bb0cb609728231470a03bcb545c18b5147f53b1b4d13f8db407bf1293b286c3506a701ef33d8326285d8b629de15ebab33dd9535b07438893bc60abac931104c502271fa6e118874218f8a31cbd25267aa71c5759b520b3b262e76f98f40cf3a9610be58909c0668da90a5815cb7b985490653d41633c4315c6fe756da17c43d3746a1620969d0c3246556d1de43fba50043a4c0c43f53300d6639c52770c917bbff6cbcf1a5a3016388d0a92baa4a45cd408ddaa6b8fb34bbdeccc5e46325a742648b010623769d34254b1c00d74f090b1d382058961eed6225e804675aacac9d11bfd3c481d1956cd51338049839412b85bba85601025dd64bf23a15a000cc0cd5633b0583ec944c1e79c23e1816d08719cd9a6b8625aaf5708210214008b2245a8b7a5a4daac753b16a11874fef472d0c65b99bcc27b84b4756a01a8c88995d711c97b464d574c48eb9b9b7431cfb707b6d3c7411bb6af5580b99998a4e64a3cd72d46b16496964519432eb59a82659949609bc3dcd46256fa6f4ad5b6d3aa2b3e152c66f41fd35b0f7ef61fc8f4408ee98c9ed69c9f82791052603b696c5543516a8a9a709966e7f92fc9b1911a16361b6bbb9e6428713059d412a5e5457012925a05e7863627311ce5b76ea2103371ce9e60317752b484d4942f529d0341241994bdc37276afb1929f063bf3aa2a1b6a63441b295c14b018887a04f6aae2aa6fc907ba1a381d431b87fbb65a94ea8818474bc4b39e85375b33d100aee93f35b16802814962dc8c1a574685e4c5bb708c0e125d2724039cb34270bc8f2f438f82d9c624161bc1ba3b96ba8867b0616e26cabbbc92b6fc575c5420fecb1a386342dc790d2491b6d640a25881ba715218a210b9812cc5eeb531ea441421594e58386baf74af1893982af8a1ef968996d94e2910b9553309dac84086d1abf3274350f0725e42a8135c8f78361cf7504876a8022d6811a154273625c6c3235871427012ab013de321de098f47f01f57cb8f56a43e6a4a35a5c0aaf80097c377c75e20b227c289fa44b332bb10d76ac3ff0c3470c45440927c8be32bf2c35618c85908f2251d5c126c6296e2763072a69cbda852e81977ec2c259fe89c07615816c867483bb07e08acd4e63c3be2ca162935900c4bd9e2ca2915ab7043b793e021a0c65b91b77e3a323d7d1913b5a90f68f48388d26d0a4b6d981c3509409fdfd21ae7d3a254d79e244c1c6f82a8b7268b09f250abdca988a8656434316a7ab1470327bca55833725bceb399d236b44616259db52ba898c6eec13b6e8ba1868413fce7ac730c18604b0e5dc3030bda9e437848ebb5bc52c237d46a7ba5c89f3a143932ac3c1e6b0af3a66c2731624f9281f59c7cc7884896c88e013729503383d492c28bf521fb2c388c457b11a099bd7b8c3b055e07e3268f8ca62582936306881c65cab7715c10fc27b3a04d7885173225717080691a8a024cc36106b2a176ec6c0fb5152e97928c3b77a7c75c0be51b1c78197311a203ea68887b6358d067e5e7704e5162b79b643d7340e21216880c747ab52d1e588792cb59f5029095e35e1802b3214832dd3c4e0b393de4169605941ab62a2d27b931a038927f3518461b71d701c3a694035553a68eea63b4a7b519b59c632632bcf07443593f43046372441d3a791fdfb6281cf6687f9472159042c71c8586627158905dd8ccc1142402ef0687f1fb8a183b4a5cc628cdea71f8bb445a90a253aa8c6e6b5efea7626ba184e76994de9946b1487262f04e040765722b414a6b485d207f4d88063fbb650c30a5caf04618b2385e75b08c0226bba86236f297d5f69bfb9789ece339c207ccb5e087f314bc05fc5ca382010e88c2d8412693002321164dbb0635b727ae6e7ba21e910cf16678d51493e2e9beb7d7518f17a3bddab7cc640ac49b5e09393931a9bde520c97c24ac50f030e0e559a4e83e1ed5531a293c65799b02fcc940ab8ddd274c2c20b034cb3cf698cb4f6207c9045a33e3a868fab039999dd65c4aebbb97f21b71720489dff1a05b07c1e56803c037b399cb7b9eb2192d896f7a8b9b51288519304de082a81f279d01e9948557014d1cb185013c3bea472f0844ac1684b38457d8a31faf097252ecbcc66ab591913fb0755d796165eba33838018de8c58191176e815329b3fa9847a159ac08945cda3505447addb123ac99693a09365229118e5c3bed50510637be321320b0a9af90f5c3372736aa8106dd865ac337c1aaf748b40b7888d09f13583c6247a8f9b46356fc0b83077605aac0d9ab647f193bd3977505b51b9c169091c67d48e813a8046af837891129332a83ca56e97beb6431bb8055eeb77f8a136246892cf3356e24a98ba878813a1839a7bbb457e5c537575c21e76dea193102bba652a446d80c319a08ced9650be2fb630da980d5f94373834e769b1cd7275263fb978bf62f6478488f81c58fd876c85b6799c974f94a0b78da8f1d03a344fc60c64650937844f935b32ff0ca7d8aacecb22ed0ca2f949ab262987ae1e28f9b02465ba6442a06b5a8d070bad4a98f217598a2464f095ff2a0338e58c6325451d7c0ccc592cd4716bbe0b07d10c68e5358c941bb955333b6d5f3364cb1a95ce16750d32dce19c33129b8e6aa63ea1454379b7b42c5bb9878cc7bf4cffd9866c473a9ac5b9a22d4670aa56304c0c00294c805dc515174b9e0545897325ff4d861efc79d826b109c991b5c49110461ced9562e3fb03831693fb79c29310cc2daf528697686d46ba342688424a73f86693d0a74411cda836401ab21b094e118aa619c8b0a2a6b2aea6b2913a5beb3b63ab8137d519ffe25501a94ac41b5a446e16b6ab83cf5030c7059663acbc7134c407e02717969ae7b025fc935cf0c77a2fa34937eb84e0e98ae6f077acc775b04a2724b00881088cd9e853b19c1c51ac9cdb696b4525b0c14d265d84a7dcb0c8486605c133c0a46508457160752a81d1188adb981640d7c6b007880adc1cee5195e9919782339285845480afcc0c240971191c8b882a78eeb505ce6811e14ca13476d9e5b79963b67672c3260c9a9867473167051ee967f3cc11452759bf4d56685571604372b9903026d8c3c5c676db6211f176c2d5e0089efbccb3820c7dfc42c41205365ac1ff7b7b743d35503825ab5faafe14abee2fc738f3575c323b6ca7a174b787962f5c759b672233261c7f67578db1e6955a9658039a4d75ee3a1371d912816ec637b7514cb0770deac1a18779128576dd50511f5f83e54677cdae76071bca9e7d755701c8709518f24f7c1f51c650261753a5b11899139cf110c4b8bcc2b9abec6c7a0bde11100412b4aab3f89d8896c18405f24225e21916ab3af3609288cd96f75f745a995b164a59b502bdacb27ad698d8f27c58a5985a2528b63fbcd6764ff88506a604aa3a2fb621df1be6f55b1cb026fcf3e4420415558db156b3e5f39220c859085da83b47129711a63c2c2f6a5bcb701237b2b0b66814eec9fcc1c560992a596 +ct_n = a5bc0cc690767b203da8b72ff28459b5970fde7d2b85ef05852c086e8cf1c52fb4e5c8a75b8766446900419ba87bbeb06515ac7234eac06b1ac6070aee288c6a549c634397b821233bc340d133e79f22be2e1a0220bc2c29f8d2d830cc591362dc48eed220cde66b53db04cf7ecbec6ba68a1099c01ff0a20e1a0e380782afc83ff626f907758d06ea5695272c1bfc357b0c9ed4f899066eb2e6992e780fb9b50b6810285a197a0441805618870317c55323c9e72fb01977348ba70c9096072e9b7f26dfd099bcb0dc6e5feb6925fae31673d1f517da79db0ff4066fccacd0f9411e3e83af3ecda4313147e1ba774c9d3f9b5c702c20596861f85183e5a0689c2c63c61a45116a2bbb4ea0c08598eb30526a83f4875084b9dedd864f6ef179768be340478c0d1374e2ac46b5626e971a2e299f3f2a6252eaab43741e259ef18217bb0319161b9d90700c3549ca4f803d4c46cb25463c6e9907a3c918dcb74c2b94f4cd681b9ca7e74a474f7f88d3cd0964920d470532c0c151d91128581a8af55bf7d8289be3a2b8e08f319e7dcd658a64296f7ba919acebfe275aa2455648d70baf7ce15bb01977b70efe0a1a82f7922b06c64ca15d45c11d3223d289da13bdde901396feb31e059f94be05786ca9b4c40454cdfca4cb85c56ecf529c67c6414436632c6776d8d87e28866584422b19270a9d2a0c548482cfacd05351af60ac95888dc5de848989505f3f781aa388607742a29858aa85b089431c1e9f88a9c03320cfab1a895c75caaddbe110e372fd2788eae4b9d7c78309b438105f809a9f1a8a0cd0d1b944ad037a5266f157eb4f56222131bcd7c0d4d93714d36b017d946075f44c19168897a25396679c73af50f5ad697f1481e9e456f9e98edb0929919e8b1c5765c5309b55859a48bb2aa78ec96e0e7e22f549694560ebb359309a8032e84af4c1d6f918fc7d575630d7125f73979b3a2113af86b125d3ca574d4be0b6193ab98bc2628063de2d14ddf2edfe412452b4d365ff831569aba8e3ea43e858b75e150347299c2dbdae6930110bf1f217588391b7bfc8031cfee0db083a45633ca609a3e3a31f6e7a113544f790869701efe71c793210c9eb4e351f79df841c55500b54a8a86ffe183c1be8ded8f878180ac311adffcccfd21da927814596ff71c256cbbb5e85c78f439a790650c9879b0248007f79ab42f9212a37a350bfb9cd207c971752927d00fafe88eb7a632d6a73d5a499a6b8404d59bb617410c326a8c9014f0eff96555a3cb190193e4712ff125993220164ad8b21fd619ba0da210653a502174818150b02b66ac0ad5ea8568fb907898775a256c8bc9b2c9e7d8b35d67e26692fd8fb40fa84740848c9ff4a7ce248da0994888e3a5ef404997f4935ef94db37a33064c28a6eece82e9558f35f883cd2143002f52f25d004541b7db59039afc971462affb66a1cf4bb9f5727060742320f2cee871f5a1578e411a9825b010ef5b1a648f2ca5c9d19aa480afe661acc8c39073b5894882a0fc8572b33cebb5bf9bb4a93114bd6f988d4a629128c9854b2b0c58bd6581ad4c54e55a66115962193b3e7c9dc8cfb9f140bf1b139c47dcc5ef2376216aeb3ca3a94946c6fdfe729a0e49ee2f6a0fd7da68f340bceabd4c57c14ef98a69e9fe068e4a9dfc618e3ebaf3824862920c0eb06bbed8b9914910fc453177dd1dca548aa1b11757a5f35ddc3a2c287a129d061f00b5c5bb605ee02253782cf4e291fac15c6c7063b875faf0e29d8e69f67250de85a6ad0692c88d27eeefaf6393d4eaccf43eefc5272d221b66c237250a7d00b3e498b9e3831a9ddbf058b4d4fd6ed8608dbb1a83b5a1d8a77580403f261185ce51d3e87e497553ba475e8cf2e98b24d054a797e764041564a8439cb98276033034a36683184596507529d23ac44fd2ebc9a4e6dbfe23490edb22dc37db264d0a22b2a88c2fb8f0138fec8d247a1e56429d13eeaa7c2cdca6a615aee21645e6cc3948aaff2d58e869372e0702b1c3227786f0d52e7e37300b5e6d0382682b0a09a31aefa9daa567b1662624991cd5f2fe10b9ed51093d273a4ab975667b5e903371f2f77df5d16999cf579c9934fa504fa868bff8fe06fdc25e7c0fc588fb10726220a8b53a83d8ce2594747f19333a6e67865513f0c7052d887319f5f13824c10d28e9ddaf71f7b4b79323fa2ff97eae2afbe +ss_n = ee7c27d1da080da3ac3e97a5f3db19e901a5107030935e96b6666869af1afd1c +ct = 5a667c89a8373d0c7c39175d3d2fd4928045538d4bd35d63b88f1dfab4d7296ce32bf7cf94863d30dbb770cb55fe3b4752e15d60e70ed4b97c9e1ee5a26804dfdd8f00f61278e76dfd950e20dc74a6017944aa1572f2e290eb2698a7fcc262e2b8598cba080663a37cee3af7450bb994d121dc89daec8746086d587493cc03a029314483374fc40d6c9ecc68a18c8d8e83e6d6c2e97da8399be9411c223defb8cb93643701f15d0f1f44bec751715709e795b9ff5fa82eb1e1538d8d5f257b5dfeafdeb8bf42a3dad9f9680d2d979afb212707625fd42f369b7aedf60420858f19ba32c23c6790d2ccfab6efc147ecd410193d6bf0a949f643838715611567418c250cd18af021d00aed66008e1fc241ff3a7cfb15ccb46a23a5cc3a1045951e3646fdbf26dbb9b37b76489a5eda6756aafcf9280152c31df34af1ffc7bf9fa44ab709e8415dfa0c593fc6e61f2b0412237fcfd884274cf050d7bb0c01e5e0a1d277348a342f36c505ae6b614f4f90dfe8c70f67a139f8129f0e3c745152b4036a1fc16a0e08ad4dc141d5b35179fdd90149aabd9625d7503337c72c5d184124d5d1919c32dfb6d495df56b2a957a753eeb5a48b8b60339df30578ca492c0e63bdd1cf21da18d4fd6df15803668f02a9bd7579492b48ede4fcef7854062cd82030c9cfad504272d40fc48717413ae14bbd66fde4c0d334cc6df68bd955605076f79e9581d67447a3f7b9d14af9a3c5112eb98d7a40095e4c24e51e0c53543e7679dc2f44b4db701bdedcc301c65a0537ad77c3351569afc6ca795080b729abfa07a7a61dae8dd295b04d4692020b6a946840331db230f06f708fad2ddfc6012d36603b3576d647e98d902de032613087a9c5b5f370cbee786a5eba9db322a7d86fa8017898762664bbe8cb94f60a178ab7a4ce37d06b53d1cf799f8ee206985157d93597435894fc90cfcd5d6c4c37a4d051bdbc1d003d483c12f1039e2091b4962c5bc572a239e938151a52f7ed8a97e155f1cb30c6f3f4f691a3299458b6567f26c0e13af26bde268470be468dc67f6c4f80c018fb011e0a700bd37d3fc574a5c3272a7c00b4480b1b8769b50b8ba933af5aa38bb7531d0a39824e973353242b4c32e64bc73f0c02b1d982b5c131f2a9d539cb99101844799648fbfe4abb4fdec1cdc205990b4ed1a719f98039e9997634de58f2596a98ccbc0dfe77816666d7bb0702fa7c63e4ce48f234be91bc14e72dd2ecb33aca0218bcab20f64b75d1bd4c0f87f9deea0f4d67bca3c476faad680abc92d725d3d0dc53129bdaa7a1939dcfa460262825aec9c70b6b8593a3b91a501f7e6a7e8ddb8ff613dbf59e500b6b867dc2b79c7b92a9e53b57b743954fb5f3d94dce2e6f14afc27ffb36d4b33dda1fc5292497cef3763776b56e423390173511d2642a87965fd86c49bdba4531baba3c5d177a6452890f10a8fcd4243f4935810fa3ac5fbba85a12c8c5819ed05a68df5c91ac91fea61c288bfbd4d8aa8d26dec178d2b1fd3ecfbf3adb3afbc3a1f3f3015701da59e30a810c776bdd8a63995d40676c20dbd3528c8981e94327ff64b4747a2b3c30fbf56f42fd68d2c52477c76d0fcf45b714cf26fe7c4f8b44a0bd8fba232d7625d21688994e723fa85050d30dc3a2e61d0719e2e10faa06c619c056bf7f007c38b87ef8b632f3a23b83d933820aea705e1e9d43ef4b83c4645ef44a3157bf99451ae0c70ffaa61fe49a04a6188dafa56941d27c40fe17a44021cb42fa0241137ef8c784ffeac66a1f8dcd68c8d15c75f1c2026a02e5f73b6830d307d0698fc3d1e99d7acf77adb20f583e03346edc8911a3f36cddb109ff5821815ca12dd193806b639059c2a2b3ebb1ec65ed2ca54e032a8f923661e626e8d655b9f07959600040412efd8681ea153ac60cb3dd3cde699cdcc88c32404e04a279c17801300924c105b120741e369ee91af5851de3be7d421821600db10991e62d0918778da27cf28103604ab5eebdac8febd517ccd91ed9f74f210ab6f8b3318aa1664ea2a080bb8674311e06b3d0b8607df468ae1f361ee540f4a7ad0fca5d3c3c3a547101ea8c6cab642644df1271f4afe82a50994ff88fcdde6d11f493c0a8afd5a3ef3d064a7e9074794b9af4a497b13f66b49356f3d8de47fbe7478121b6369ffea1150d6d08dfb857f5918f194a2e4523c0e0a17061fd91e2c1c3b2 +ss = 8c38173cfdc8f0fe7446e9856fb0e33dbe79b23355bc20edc0ada3b8087e5816 +count = 6 +z = f7ecfc9143ee45e44f5e98fd9ca1455340ec5db4fb098534365ebbfbcc57d34d +d = 7838c35785aff8b54be30841ed41a87f420aee847452a4561cdaccff5b38dfc0 +msg = 9bf84a7839f40faa71b35fcb695c5f41a9443bd94041a042a72c701f0d1d5df9 +seed = d3880d1b7802b4a3277687863c5a248befc95d3e4748403f3bb61f83abcddeae42ae6c8624812fd38f463122d99d59a9 +pk = e2f26491d9370c69c5866b0aa4e5951b2c9602c74b7ae4c27436b130f209dd4915abbc14f0c154a67369c8504461595310b43bdc10a577f35eddc16154f587baa0c37f663739c8aff34533c56947e4a637155619ad471162e9bfd6d18ab91b6f639b231865840a032e2b617e9a307301d0c27d977c4a2c7d5e1006fa15329d550e1e27b116a400084bac35e03698f2035bfb249dcc5224fc3c3b7834b0b0bc7c09b6d48a3ae649cb3b95a131479e609715357a30cbb0c19781a9bb819d55e4385ae7ca53b58ce699084dd96ce2361f47e97e82401f845909bb67707f8b876324ba3c35c712e313d47659147bcda125349e7767396492e6ca09b3db2ae2f035769c8f200b4874435098774afa97b6d60164b797665428850ef70b51a65924865dcbc4243b9cbd6cc07489772f8f64260bd666efa2768f3800d8281a4c97b1e3ac8382a62f4c24b65a17322b75c7a63b74724c1dfbbab7c9b532ae44b020e675412c768210793fe464d8aac738780281710afe3ba5ee1a7e4f15458dc27d0ec3b3ee8b41065456bc75767f713bfdca6222543619c705474c922025351334c71a595f38b31427b40980571a6804a1974b3fc21b6ea52bc074187576a3b062c3712dd69d99683be6800a1196739fc32e52606b8cc4cb10838af8733b3f638d03c3423da7cd5ba971b66c8fa3ea6b60d5b04ae14e7f8c4a66c01befdb4520e62138d76667595ce06828bfe31735d73d2228ad88f02545155c85435e4d62264c665b05503e93a7881f18ac11fa12b293056b695ad275ba41c45adedb34d2bccf8e2c715417a41994270f52c155936363a80850ba70b2ec53404b7470cb3fda8b117b138b81b195a51a72acf50a1ca07f59e420f41b561820336827415c27b093794124c38b68709e7c2b5c8a11abcee6c7a6096ee2545e0f58594ab57aa86ccc3ae33b94e4ba475403471549253896404715e110933290abee2c03e301bdba737d280079362c8fe30143f5171c4349042b421cd5a1565824c21e6a4694f92eda35a178383acd854597308a2dc68290b56006dc4c2b6bcb6184835771950b6a590a3b0888578dd9e1135f857fb836a6373c914a429e9bf62a5dc855b954a8b8e606187425e6922dfd975477d32479f0b226f7bd0d0952a6c7ad07d31e4f8b803bb5b3a8071f98895a0773c40d902ccb4b6a6af24e550a2bf547bf03c00a7236ac7fa82cd31ac7d4a8212db1ae417006bbf73fe3fa9c155557a449c51eb56c60824105a33ee6e175a51191f1c440f711cb670994d3fba08ae608ba598fc39b80338c96e25b4ff41b945c56c17baa946a18ae275288f51571b0f34d67a74127957f0dd979e362b5ad7ab53e5c100d422a0c1400a0ac5acca081a07c195b75139477bebc313dd0e76acde0ab1186c18f3aa52d87a2f70c1a6673ac7e1a6db24b52d2aa1c96178b75db0ad53aa9db8a09ffd77d8ab6447ec1429ac85d1bfc361e1ba35a10715a1153434b3e5d070c1bc7a72a4b7d54521213d429d0d30668037e8b2465b03c7ea170b0428aaf2e0a2a26eb432db45fc642a20ae06d8a39282bb9246743a77bbb12ed43648fe06236f3b1805c5b0373760dcc5225424ad3e38971671e8e083b922a52e300225171147ceb7f9e9a1b6d155f6987950c62b9456c7e3178cc5b9022a25b25a42c057cd05876936602947467c88255a848ee048256ac2ff7d56e4a250f9cd476e991449faa568e8b432901b394cb6ec54836e62c38cd2b3c62d732ee7812dc987a6e8cc5e3d60d4c856b39b703e7ac2f799a2918dbb343f79c0ae7787438692e780b6444c2b5d8be2ac06157b65101f77df8905bc19915a9d2548a096e79999b45773cdfe18f2af6461df2ac82a92f241c450886569c03c9713a457784afdd0a7b24db43d3565b25a57e0f766c6cdac4778a8b5f7074260394e608000efbb26da17282e908921ab37019b019cb16593b9f9296735db96123b4a3196cbd9a5596d2e6155bb357f1355de4159076b8611cf07851331c55c835f33967db045d855b5cc9243e1d16bef176b9f20165f0a1c073bc8427132618f86c3d731f8a3736aeeb7aa537624a56296273c3c057c1f0213e912a870d672f84fa193dcc520a514a2900c4c075c9ce0125e11a69ed86024c423b068b529e4ba2d7234c72bd4a09abb09e4dd7f3c4789027de5891d7108547f31b006276dd01180c1cfa +sk = 42f5cccb940279345082b439e2a364cf249680462ea0b36d2345bef367c600f6c0cf802875dc8b33a006059cbaa1a4c896a0b5be4c6bce833d84f508ca1a43149367dfe3929c2071b38ac2eeba4bf2db24e37a0aadc114fc853b6d40c1aff3ceddf6c67a1b101f275bc6c3434053235219129d42911fd9a916966ed618214e0a87d20950bc40ad78b741aa164b8f590ce5eb4dc20a11a33143dd699194e2587f238a1312ce81647ae84c5ac5e43a89c3287cf93e3a9a9cddd95bbb072c260aa1320886a312644c808ecf500ed44842cd3525086678ecb2c64d519952ba51d38823b754a1a6c76a7a6a133c721913a86b84616e12711ecb7cbc1f27b9edda92e9223f5c046d30c0bd87728372ec3fd513784f886374622ceae3a06718711c600fa524c16ae18647d322ea588cb985c15882794a49142dd590466890ba767e6bab53bf33856a96486e9c8f88d53b53946be5d16f5a48c294d5085d5b411ed018a14396d6850cd6a80cc37c72d7d4b63f404339ec912c4c68176575861107e35096fd2563fb86059584813a8258f728966963cfbab6ad0f27c58da5149746ceb8ba55c3110ed4a10443506d4457968ac6cc7948cf6664243a70691b89146166335424393f4400a0c28ebf61cf7f2a14e30aac32ec2495677c646291fe6b7e20544358a5b8d70b6bb1c1791fe36ea6a0a1e3761ab7dc1d188385fe2cae562873959a5a1f5a18fb696ff0dbbc60d542cab720e53a31d528554707c369ba34eda8a4bb456d6a85b14959c3fde80a25ca8d4a2a81718334ea53a20f2305b77816b3593a2ac54f5c46b902b107dc229de981556dd24311d7b3ae70745604580524456d17924713a1e4a72307b81fe2c16002c2b4a7c31f06b9a76375082ad1b2628396586343f1f0042c846f12192668710c2a7a198bc72aeae358c85acdd448c7b0f83c21573dd9c50a6f31615ca54dca66cc4cf9acb9865d10231bb99bbd9845a333b5204ab40a4d69a61e40b910d2499fbb91af9a3aac5a96b2d968112c7df6e12c06e303ba657b24d708ad0bd06463ce28488e971c6440b3283c66a61ac3b1e827ca211511ba9bcdd9753f99cc0f3bbca352745b3b032c5070be1bf91a56991adcfaa17db726f8400075c2ca937a76c8c353632a67b82c814dc35b8b2b7cea192096a89b10542a02b24aaca3144cd1047c82955a7ab512f74c68b3ae6a108831e284661a2bc25c97c733b1942563a5437979718a60cbc59f066ffc441800f891439a1db4e513b7481b3a20adfd40aab3139f6bca881be9c835a398926190a98481dec655e087228fb54f3a99b24415ab7356a0827689aa225bee36806be98372b9c4c7a15c271ba3683208cbb90e271bcdea9076390541cff648ca7252e0d3b035a2a01a7830ee151a77a354b9ab0d02a6412c45af565093c2a9595ecb6ecd73c5938694ef545b3622626b18a19da25f7522509b2a2eb3369795438a59818d0be143e6008336b46e544b47bc6ba15e95c80b2080f5eab1cec7400ccb1ef6f09a6cfcb17ea6b087f178316bb31bcc2425f9409e38c110c8122dd8ae44253e3cf70fbf0330f7b960525937ca0ab2d8fa693cf314073427db0943f0f77c42d3adb20b0b41da0ff3e81adae78dcaf717b1598d513b32f1a853f611882a6814a308b12eb8b072a777b6f979944b076a3179e75a9ad11035111b7c83461a78acad119b3286dc97fc1b44be6960fb68bac4a81a49572e87ac0333590a51c8475f4250dbc1674d72356e7ba801a7126696576dc83faa66a6d5f5068cd59c9cd1163549870828a7e539cb5ce537fe1224563478a457ce1c6b31c9433ae029cc64d68dec4678ba133d5497b6752b2dbf179f3bc8a53fcb7c35924e12bc72b5ccb00dec6bbc3c2e1c65b39be33651cc86472c941b681f72809215179355d2c193340180295ea791af47a4affdc9c27922c560d300914030b9407a1bd2a1d7cc26d4a7445cb94a7844a2a20463c84b2baf551dd6ccc2bd4b9dd2634554f22ea5cb68c8cb3de18b2d26dc83171c8582566a37e1ae4fe71e56793ad888685a9b4baa75ac7353cf22ba73d37430af0c9d12e381403648977044196992b3988597ba7d77a44300cc1164b27c234755433148ea870d10e8c399e176625a91db95a0619821c3fa6113025be2f26491d9370c69c5866b0aa4e5951b2c9602c74b7ae4c27436b130f209dd4915abbc14f0c154a67369c8504461595310b43bdc10a577f35eddc16154f587baa0c37f663739c8aff34533c56947e4a637155619ad471162e9bfd6d18ab91b6f639b231865840a032e2b617e9a307301d0c27d977c4a2c7d5e1006fa15329d550e1e27b116a400084bac35e03698f2035bfb249dcc5224fc3c3b7834b0b0bc7c09b6d48a3ae649cb3b95a131479e609715357a30cbb0c19781a9bb819d55e4385ae7ca53b58ce699084dd96ce2361f47e97e82401f845909bb67707f8b876324ba3c35c712e313d47659147bcda125349e7767396492e6ca09b3db2ae2f035769c8f200b4874435098774afa97b6d60164b797665428850ef70b51a65924865dcbc4243b9cbd6cc07489772f8f64260bd666efa2768f3800d8281a4c97b1e3ac8382a62f4c24b65a17322b75c7a63b74724c1dfbbab7c9b532ae44b020e675412c768210793fe464d8aac738780281710afe3ba5ee1a7e4f15458dc27d0ec3b3ee8b41065456bc75767f713bfdca6222543619c705474c922025351334c71a595f38b31427b40980571a6804a1974b3fc21b6ea52bc074187576a3b062c3712dd69d99683be6800a1196739fc32e52606b8cc4cb10838af8733b3f638d03c3423da7cd5ba971b66c8fa3ea6b60d5b04ae14e7f8c4a66c01befdb4520e62138d76667595ce06828bfe31735d73d2228ad88f02545155c85435e4d62264c665b05503e93a7881f18ac11fa12b293056b695ad275ba41c45adedb34d2bccf8e2c715417a41994270f52c155936363a80850ba70b2ec53404b7470cb3fda8b117b138b81b195a51a72acf50a1ca07f59e420f41b561820336827415c27b093794124c38b68709e7c2b5c8a11abcee6c7a6096ee2545e0f58594ab57aa86ccc3ae33b94e4ba475403471549253896404715e110933290abee2c03e301bdba737d280079362c8fe30143f5171c4349042b421cd5a1565824c21e6a4694f92eda35a178383acd854597308a2dc68290b56006dc4c2b6bcb6184835771950b6a590a3b0888578dd9e1135f857fb836a6373c914a429e9bf62a5dc855b954a8b8e606187425e6922dfd975477d32479f0b226f7bd0d0952a6c7ad07d31e4f8b803bb5b3a8071f98895a0773c40d902ccb4b6a6af24e550a2bf547bf03c00a7236ac7fa82cd31ac7d4a8212db1ae417006bbf73fe3fa9c155557a449c51eb56c60824105a33ee6e175a51191f1c440f711cb670994d3fba08ae608ba598fc39b80338c96e25b4ff41b945c56c17baa946a18ae275288f51571b0f34d67a74127957f0dd979e362b5ad7ab53e5c100d422a0c1400a0ac5acca081a07c195b75139477bebc313dd0e76acde0ab1186c18f3aa52d87a2f70c1a6673ac7e1a6db24b52d2aa1c96178b75db0ad53aa9db8a09ffd77d8ab6447ec1429ac85d1bfc361e1ba35a10715a1153434b3e5d070c1bc7a72a4b7d54521213d429d0d30668037e8b2465b03c7ea170b0428aaf2e0a2a26eb432db45fc642a20ae06d8a39282bb9246743a77bbb12ed43648fe06236f3b1805c5b0373760dcc5225424ad3e38971671e8e083b922a52e300225171147ceb7f9e9a1b6d155f6987950c62b9456c7e3178cc5b9022a25b25a42c057cd05876936602947467c88255a848ee048256ac2ff7d56e4a250f9cd476e991449faa568e8b432901b394cb6ec54836e62c38cd2b3c62d732ee7812dc987a6e8cc5e3d60d4c856b39b703e7ac2f799a2918dbb343f79c0ae7787438692e780b6444c2b5d8be2ac06157b65101f77df8905bc19915a9d2548a096e79999b45773cdfe18f2af6461df2ac82a92f241c450886569c03c9713a457784afdd0a7b24db43d3565b25a57e0f766c6cdac4778a8b5f7074260394e608000efbb26da17282e908921ab37019b019cb16593b9f9296735db96123b4a3196cbd9a5596d2e6155bb357f1355de4159076b8611cf07851331c55c835f33967db045d855b5cc9243e1d16bef176b9f20165f0a1c073bc8427132618f86c3d731f8a3736aeeb7aa537624a56296273c3c057c1f0213e912a870d672f84fa193dcc520a514a2900c4c075c9ce0125e11a69ed86024c423b068b529e4ba2d7234c72bd4a09abb09e4dd7f3c4789027de5891d7108547f31b006276dd01180c1cfa3bb45011db51894486a55d663b293bc87c473fa6062af506a57a05e05d9488cff7ecfc9143ee45e44f5e98fd9ca1455340ec5db4fb098534365ebbfbcc57d34d +ct_n = 9767d90bfc648f8e99ab16d4b307eeff2bc9b577a235ecd5efd5e87dc8e297cf222363879e2dd47b01a6df3e5a004321c4f1b571376c2e40ee8232e5d6b9f8c59d647387549b908715887344bc43276346ae681b0123b9bbf1a6ea08b776866e22d5d81b43090f2a38dee3615db654edb0bc2478c2d13b566869f17ea78e57b803effd14d78a16decb42118d14e51b63060b8c14d3761c821b71b5fa724e89a8e4629a454521c00ec3af1fa0b709062475f0ee942113d654a3248a82904047e02a16264cd7dfccd1d10f1c3d32634f38f58506975b54cb57253d94dac612dce59a1f5ab508e6545e0a1d7b75e14e0dc92d52e3b4c2be5759d73097f5226888ca3b05264eb4bf942d6a93f5aa8a8ed3f1a22cfaa701c19779a9975e29158957b8395f126e74306770f48dfc7104f5f410751105a89450dd638bc85ccf30e05bdfe276f5a4737fc5de75e7cfe09575f47a00e57c596036f93c5907e3f262311382eb8a7490f0502172b740c8df226d637e0addc3671fd4804b150127c0fe27eafa23d609442c73bcd28eb7428eb98901f63505a58cfbe4c4c42190e83801acc741024b189a9811f244d4ba2eef3ad661066e00448d97ba88bb9d0113abbc327d1fe3353045ec54ef285e9748c67375ad6a6fd3eb85f33d5cfa05c1edc1f9bedf6c590940a0d7c602c78e31124928bf02478de67f9dcfd350eec85974abbcf420fbada73cb1026310a4309b774b33e4765166d6046ed27da971e8c7d98c02e2c7a015a25c8d695d01730980be2c7b34eecc988211f7e51cde8230f0f713ff99106c510bf9f9cb8977ceb046834046218919b4861c9c31cd667c98fc9442f4b798e935c7c59f40a5b0e47d555e67910eac45d639e77b95c545f9825e54db18401f84dad11a7c29390a15b34a18e2fe78b914c44cbd8822a57e344734fc127f4e6a205df872631bd2c2fe40f4a91413a18100aed952eb282fccaeb33b704a082c80c4310c86f1b45bd9500f91b7229a2718d81e420cddb5401816a60fd185531d453ae0db1c175b063cde3a8c7f89d9378c932417fa280d3a48c9cbd61fdfc330a905ed3380926a1304a2a5753345c0387af9524dbd56c0d4ff1ee4af85e9c28c75b1d2da181ccbdf761d5426d8bd9faa3d6af0ffa502569971557cbbc833aa7c066e80ce83b55a3ea7a425f4e0fe71060e1bc19433a588ec6b2e0444272c899a5ba9903fe01f7de7b62476a50599fb62350b8169f7eb55d041be6cc979b273f25912157e4e39230d9e59e40fb81e4a5eaeb50cec3b29cc09d7c7fb663ac03d9545e1584adc04ada61bd86cdd03bdce5879cf6f96d80a4f5bdcc32a85593a44a87f2b6737f07361abcf205e28c2e7da31e2ace99d9332c0291dfb8c6125ad1062248b8d1fe31e33db661140dd39281e18041ae1a09aee24a6deb16c8829ebc5cc92aee1c69566f0078e51d0b2f0f70cc7474aac1b954cb3e86450eb783c8190d2bfb3608525650b489f4ea487ac2d6c9dd46c8080052cccb87cf55bb075d89eb1d90711004ee8ca920ac9fe8115d30d5040b6d3119d11d1e0094772563b33bc50074e24dcf14929c17a9143d17dd443251f7baf9929526b14c1b047a9d5e015e237e9040b80445f6098c23dabe79f2de5f1f7f46c4fa4f01a753d1b002fd3d5be6526e1c95da4b87fa022f75b14170a97c55b83e36c5dab304deb42b2254f00f98d94d8e20f4d3fc629d03d873243eeef46d0a8afc8b8efc18a4a73fd5e2c3e52bf9e5e00d09e423b151b0dcb07abfc12b52a35b3c284e498af120e2ed24823a473741d63525134a0582e96c58c2396822aea785b506d217484e968ef2810f7dffc68b2f5b7bbe212092fa1ca792a352ae93d1e420f69af22d4a876b1395aaf3d079d8e8c7f746b35864ae4d15078248af6c32d6103ab0dce1320e87bd8953804af10115d7a7f1b4d6fa2d455a759cccb05fc83e32961f8d0c74400bf701583562a661b6a0bc3adec9802b54133f0a6fe8fc353fdc159267f6fb4a5f7313a6277978bf44680190f9b9b5ebfca8da6a6861eae99b601d35d90dd02440a8505848966f1d69b6677aa2b18e93de15bde4a8a88e2c405e274db045a7a594961f020e0de7d2c982e5f34b7587f35e9a6ab95aef8ca393c57d53a221d97c45ab84b7fc8f85896ef757c2550c747a76d94b6d2a6aa9eda82b701f200bd81ff62a6fafcd112aa +ss_n = 1d247e5a55014531c587639b8af984caebc075168ecd9759002a25232e3845ef +ct = 7f69c89494c15bec8c947dc8b743cfd1873adde5af6645f7a8ae24054a7d0931045168298da2084c7422dbfbe9e521393fdce998c5a36b7504fba632daae5a61107d0960b318a588d05dc8a65c3fcb8270d2cee48d35c495c8609343c88fb4d118ee42060fa6aee25c784acbb24e5a16445baa7978cd87ad8237e97432896b592bca55e82e4b30a654df55b2c0c89fa0c538fb32c739e21c0bd1d72b3e9c06ca06794ad1f36d95cfe3881620fb224a79ec0875663c1f187aa273806af4ddec68fa2a1b62dbd9be5c849e146c3becc30c3f8afa8043881567f8b0a121cd1a5e4ce82e1d081b484d1531ac751f803ba5f6ac86f43987e6584af03a077784b797b62496984812c1703b38e4d2ce5bb05e0d0d9aebf69b20deeb30d049dfbfb866fe1a7b177ca97c0a6b3fa6f4f98079a29d3d83980f5afd4f58db4e11ae73bf94f77823247d406d3f2af9a095fc097df5af9c34a3c566f0bc9879dca62efc055e05a43ef554e9246618372dba19044dfd6c5a5fdb858f46b50652f1fa1ae6ea6d27fa07658a8a8fb9b4936bce7d3a1a54b02e2e4e9c75a62a5cde9501a075ffd7b8e553bac31245a43610ad857a9c902c77ffeb71cd35c934c61d4c984d6512b54da034217a076c3ebe7f92d42f2bc76cc1723cf77a6844f547cfcfb1b6bd1f8a827037d58c787ec5bc2d5d01786881ede0a9bfb265109b83d78203b13f4e0d3c89e750c8de284074b7971f1f45595d48fa2e88cdb72ad6bbb97e5e3b1d8e0eccc29cdea9ee62c292075843aaea9484feac18e87b91716893cc8f79d8432722dc9f1581bda0f81446e677fad05f6dab03799fb3c011512b7340dbd8e2d53de29a29937299d856d3efe62f11b2bce0985320291477190107ae93526b3e7f5f804cb530c9b1de20783cc39e45c7a972935c18349312e900b25c4c0f1d10d51f712cc756cd9a9883c63d36c00dd67acff79e85bab91a8a286f1f63fc398045361b91c02df423dd8165850ede70d3dc63b315451b06b7c72926e136d6b80c182ef4e49b359d2b88c91b01ef84de222ea9bd81d95eaba7a1f04465ebc29481bf2845606745f95f0dbe07bb0c2b0fc760d1c77cab0f7a1860c4aa8d27133d3a8f903542f1a89b0c6b52aa07bb55ece46a3fa9455252a28649f6663e05d80caf912b9836052ee92947178c40676060157005dbf2784b0287e216f012626dd7fe14d6bbdc20b1f9ffccedb95c61e3c0926940b2404c0228ab2153dc8097ed58c2b1cda0561464cc572f2cecb10ff31ec4f3c29016861698d5a0f5d1fbabb20ae33a4cd0d25b8077b251bb6169e5f3e0df72f0f1f5ee52f90992772d80b34ba88aad0dde27948d9992d2ad1ea58edc45615738ec7ae7a5e1d765c081c64ae8f3bb06f0fc8a64402837618bf209878e4412c9588983c2e377233d0c8920c87a0823e5b51355cd15d4db4c071e956d3b9221bfc87a78b3cac2fccf2f7fd41240796d776b0c1033b42e902ee5b16705d0f2548fc80f3cbfa6bbf76f3e2948ad5eaa1197d1e3b046dd2fe1652cbac9892d641bdb59159840ac3e5811d887256c1920c16dd1ef4ddebf61fd312f88e2abf214248fee41c14dde538777b5592a3ca309db8425a60c91141d8642f6481364393627fe6559d096abf4c26d8f3595a22f8d0a3f961258dd3f9387855aa9a5a8829a03d53635102542fdb9c99072f80a236b794032c4c29851bf8c297d707522bf9bcc1697fe238064c1b5e8e7856d3f4f717cc18beea8371cc298dec7695ed4d27542c06c836d771da487a78b390ea05e4c14cd5d5187c672e77472d18fd0cdf6991c9f84a46b6331b9cc5318122f3031a31aae17ffde3ce93961c06d1ec341f4fe0dca70be68cfb2c76f7e8db6eee20e66e83e04cac137d1eb731a291b68bdc99918b3ef6fc39516f6ae4f07ef9dfe0747701aa86cf78f567c3b3aa993d95249ae04aa4feba2b9c484d05652f1c22fca8e94045bb3b867cb245a9b333f2c7639b305e033e1515ff4fce8000b1039ecf555400d51dcf374997b9995df673cce2d071754c06c03b7d07696807700191c9ed579031fd5362d32fa2043b35a90d1171e68fa562dfee5a1e4b9ce8ee3aba0d55d4b24405794a63248f2c5afafb4aa94b91ed3d95ea7205afbba6b1735aaaf5f8daaca081fe097b58d76e40ffe6f906fc58d92ebb1bd9504077d18f9397a7250eda9e6e2920267 +ss = 8e012f050fcde79d0913e1654a7d939a835a4a57943e13ac0fa2541eb3245ba9 +count = 7 +z = daa360ecbb51bcb33f5d36f92fffe77c2de7ed43d281dcb5fd68cfa0ce19df2e +d = 859c3e3b13f3cbf5cb860bad2fc6393a78390b0165800661a8f1a7436787c669 +msg = d38cef643f9c6d2f6a4ba6a784ac1d81b32a073e531f79919912d4db70b53075 +seed = 343b81870e2721dd75ee0ad7fdb269eb5aae0ae83a6316ad8ece3c76d3dd3cc391f1b12b22e988c1257b5f56d905a06c +pk = cc8196e5f1b1ba054644d0b27d952bf3e7aed0d611cb428641432da8601aac66acb6fc3bd5907d2ef7ceb1344a17e656b46558ed53a993472bd5976994356803767f656cc550e04e3f4a256d94244cd7c8f881233f31c54a805696e5bcb4380bfef6442a06a98789a54d38b25eb7088145a6a7811d3a083db4ba245f851d9357b48216b9f3c9cbfe610088f70cb3a018465b7fac4744975729c4703aa5189b1f88c284e258fae81ef93c3f41c5b3141cbc1e5432df767b471ba378b95c2ea7174245941e9227250aa8027b810d8290229742cfd284c137183f6950e372a4b8b03ce8c89b9c471203542ed360474dd663f0a0ba9d804d8c339753ac5b2d2b8edf33bba96649f7336a42732917c902723a7b6810658b95beb31540555600c0b0bbec1823a273a405c6070990bb80f66adb58bc1b502603e91b6ada6af4780a65d49bc9655ec0b2a919aa2c98c11aa72a0ffa50742ca4907357335c897edcf25006b8ccb580041fe0061bd2160ad1b42b2a10e2e98e745294d333b6fd5159de66557096b4ba3a96019b18d6eaa92a0b6589f579f0998053b8c639a0134241a56de420fbb82f99b1b3a5292d83bb83396a0e9c5b2cf97145670c6f34da6e9c0ca3c0c51b20b561c1b85a1f42b7af8320d3196d18f3a353a942ec676e9da68b23638ffaf80ffdd55f87885f73c76256358787945217f56634217c91731dbb1382ed765452ca80133a2952b3155165bf26e2550435644d8628efa974e45b1eec12ce14c54e76826538c610d76662b6b0251a12cd5b3004610a12b8276a84ca76aecc9e14e524f05b75d445920647c332358cd779abf3f97ae54963d8a235eaf0ac94c99fc322a7650890b904b91385cdb4b716f6067abb353be5557fc54461a74c415f81abefa227004768846192d5e832c8284763285bae3a1fe0c3c94488a4fa932465e1c3cc6a5a7f6b780fab431b078e226a237518874747605090b5f3c83b24fa84f5559540c0969c00d0b370a6c1f51e3c4038b401c93ff46becab9ad9408de62a3486e3bac30a0d3d4b21082b1123110b196bb294f6509bfc698f520c5d427036aa8d3598b9dad641abf8aafd2574ab741b14903d693851db705309dbb9c21855fdeb35da3078aa51629e9537771c877a5c914cb05d8e0633539acf93ecc0018c4e6ac40bb4c959bff0450ceb97e24838a9dcbd8037b0047c8eafaa4483aa3573ea81e56c2a21d17b302095d14cbfd9c0490f68857c90780c2a1294e08ced2b9cf3ba47d025b99f1c1ce37c4b470529462ca1b1f5547ae01d44400d30b2a4809984e4b53519e604a4086a62ca6bc21c3f23631d4e188614e72f5e50b976bb7b8320b897433e9d05bea780280e547df5537863a761575c8179c49025811578d55adae48b88f7a975dc4fb0b4b9c46c020f02303b68987816b2b0792380ac04c8a411a2b226ee91c4b1a45177a83a3aa633252b410f60c7c532c783f15891f51e9dd319cd6c4a5995944bc0695a160f2979c967017598957a2463bc7c943a2d852e410148f32c8c88054900ab0c1dc82f8a316eedb966078a72e3537b5d969a3f26b93fa3927f774681413e3de47ef9a5c1f581c2fe40345a3b783f98cdb9926df7e93a0eec4b3201733d1607e5e67366c1cb08dbb1e5aa6dee3231f15062776c1174c722abec857e23a8b21c559ff915e1d67b56ab52e2290276aa5577557edd5731f0c0a52d2806756cc1faca5a26f38ed656482a1733226237d4cc910ffa275e77ce60f6637b7c7c4b2921fd53778383c7c50494f3435310a36d75c75a8404237cc05cc0f96f20ba333690029da033175a16bb59473e913eb9974a033a01d29aa46bf9667e87a98b05809fa8471827c2c88b873a29a3776a7a51911b291c02d1c1c2f6da5915c11a181518f32334215796a350306e1ba29ec5cffda5c312149523d0a87d5b5d6b678c11e6c7dd354e51558bd779a814d77bef6c9da50412dda32ca2a7a337b87124562c0f2c81b652735eeb491d155a9777cc7f4c4884ecc29106587db923a8e50428748547d391e2f282cc4039ecfc5dc902265247381ca73bf948a77916a62ab347c4200cdaf62c30f3ab8036441343a903e6128e1a2803561176f3ae0d3050b0fcbbef041defc72a9a43ab8cf918b8952eb9433cedf82d01d9f00e44e9b7fa173e2dd8b12bee781bed3e220007dfd751280b76563610c3 +sk = 8fa158ca398859f852ee17986423c57837c4119b781bf3344a9a7c4151c52a1457917c24f1a5c95af1342a366f105b8b21b244f762b03361037f594056702acaf407de00642565c23066c2d5155226cb7611b353d5469488a09b1039cc8d9c7cddf4c97a561f40213fda24a796b43d19c00dd960c1748c864136c1eac6bcde2556219577969894b6517a103586fc97255f2403fdd7a220ea9fe1a97860c389a11ca77da30ce368370e3aa8b26c7dd8240f20778b31d093e6f4aea09802ac5a606d68072c81b5f9f09fe1c92575b95975aa6ff38165207142709720e3c10a001503ba26273ba9c258a6b53b09601f35cbc83ac55d42a9bc63313bc47161c22b61d21fcf56c973e3af02c95b9fcb9306b62087ca1ab0b67d57648ad5081602809dbb72b4779a3a51894bddeb25b6abb17e47030fc922d7c56f17773a29f7bcd7d59885849807ca58a9076169360e9ddc2ae3d84922313cce45317187ad38c1a36d112278d39bdf11c3e67cc87acc377e1aaae1f875b5155dbe9069c0603bcbb2b75c89b2f2a8ad7943bf9806987fcaa480e452d0662e8c7005e3f65324a9c776103c7f7bbc4f88b45bb7cc44217d961c3e53846ee1622e9fea588d84177ee9a148411ebca825c7468f6dfb0108708dd19cadbc2993eef26a8e18334802c7119b3536569223343c02922224ba333738271405c504d39094756f0a1cb85ddb0ef99601675744c6b33777a80a251219a63c7611911c17d50ffeb45e5dba7a3ac97b6e2397b6a00ff3b1c385067896a3624dd4bbc5779b2c20810fa15a3aa71adf47ac8340130318ad2b4390640b19c47b3a297b379899a6aa36152f90ae32ac56f563311bb59b02870b59a6bde4c5a1b0b61d10e2c9dfbb1409b9ab341c0ea11b7633c8c6c2f80b974c35410a769125b807f7707de1cb58ea6e392121a32b92ba901cefa40dd48859667847e4b760cd47617b788eff4c1b4ba76e9c3018e1f32098ea322a774de10899407764e76c5942821d08b90a896c75fbe56330a25f719205a1e03aba8b20fc89aa562928fe89568710b3627680f7fc1544526f9b396283aba220610b5266181612bbd3828a10ec2b85b15a258773ed5a10388705c8759a9c74127041266e734c1f4159744c39504b0b082aa029f4801bc565439a6817e006e75995ced3583b49aaa917351ff92a648c1d77300d47f946817149f8ec90404bc7cae1ba004203800ab0b69819ba5b6147747ecea209e3f7482da5b4d3129620db4fe2572b4538506727218701801a3a758a87bbf471266fa4849b5182b56c16216b26bf14901a43b7529aa683029f77032a74d2aadca9c841299b89651f29c064849bc48d43318a9860d1a60fff6231d245739a6a83ca035123318937a534e9f5578f0535a7db20076b4c5a24a24e0b7c409809bb6baaca921623059779065bde13108a566fe30999dce15d530a9e76e3bb06622fd6b2512f18154a40158f541b76523c27416ff6a2c0be8901a6c844e10b2f04a15715c9c9dab13ca752cf438c473521399a6baef894cefe305bf8b362ee5c05dc19399b0c3523621a4ef346be790a037c61120c5494150133b3cc5a106f29d22cb5c026711346215cbbb4d3c44cc489dbfa3c62f90b0818946e1b3d444764750a4ca0b57d1ba73a907b072b109175ac0711fc18b5e0586b86adb8a98db8f429a804bdf5a9acc06709083931074154db4934c461174115675b4b50753082657078134516eb3154de15a4c81b5635e4a9a84ab50dc8020fc7b36aec4c64f037f5883c5fa21b777a604a17691df0606271ad2d7800e59592cdc102fb9c87f100a5a817cd44176d7836b36796765c7a2afad633a71a9a89d909c00643c25b8a7a35240ae81a5ea357b1ca830e86a381230e8ac91d3639b7ea2a7bbe93c56766ab7565a33c8ab516e8213e4b1c5599abae95045e7b707dd420dcc288cdb699346a8134918729a350aa7667732856612553a446c7ecd17ff163bc130c399b018e5e709afca86f1cc51175d70b82c659c0b6696cacbb6db99ad97c92fa949cecf6bc47b90dabec3d1f044c77da9fc8d26c419caab9dc59de778e9c89cd6d0a06998a65b405a2f22167c236380ccc3cb76b7aeab19e0f76c21a2363a9c50898260717a26af0505bcf942bb10472920634cc8196e5f1b1ba054644d0b27d952bf3e7aed0d611cb428641432da8601aac66acb6fc3bd5907d2ef7ceb1344a17e656b46558ed53a993472bd5976994356803767f656cc550e04e3f4a256d94244cd7c8f881233f31c54a805696e5bcb4380bfef6442a06a98789a54d38b25eb7088145a6a7811d3a083db4ba245f851d9357b48216b9f3c9cbfe610088f70cb3a018465b7fac4744975729c4703aa5189b1f88c284e258fae81ef93c3f41c5b3141cbc1e5432df767b471ba378b95c2ea7174245941e9227250aa8027b810d8290229742cfd284c137183f6950e372a4b8b03ce8c89b9c471203542ed360474dd663f0a0ba9d804d8c339753ac5b2d2b8edf33bba96649f7336a42732917c902723a7b6810658b95beb31540555600c0b0bbec1823a273a405c6070990bb80f66adb58bc1b502603e91b6ada6af4780a65d49bc9655ec0b2a919aa2c98c11aa72a0ffa50742ca4907357335c897edcf25006b8ccb580041fe0061bd2160ad1b42b2a10e2e98e745294d333b6fd5159de66557096b4ba3a96019b18d6eaa92a0b6589f579f0998053b8c639a0134241a56de420fbb82f99b1b3a5292d83bb83396a0e9c5b2cf97145670c6f34da6e9c0ca3c0c51b20b561c1b85a1f42b7af8320d3196d18f3a353a942ec676e9da68b23638ffaf80ffdd55f87885f73c76256358787945217f56634217c91731dbb1382ed765452ca80133a2952b3155165bf26e2550435644d8628efa974e45b1eec12ce14c54e76826538c610d76662b6b0251a12cd5b3004610a12b8276a84ca76aecc9e14e524f05b75d445920647c332358cd779abf3f97ae54963d8a235eaf0ac94c99fc322a7650890b904b91385cdb4b716f6067abb353be5557fc54461a74c415f81abefa227004768846192d5e832c8284763285bae3a1fe0c3c94488a4fa932465e1c3cc6a5a7f6b780fab431b078e226a237518874747605090b5f3c83b24fa84f5559540c0969c00d0b370a6c1f51e3c4038b401c93ff46becab9ad9408de62a3486e3bac30a0d3d4b21082b1123110b196bb294f6509bfc698f520c5d427036aa8d3598b9dad641abf8aafd2574ab741b14903d693851db705309dbb9c21855fdeb35da3078aa51629e9537771c877a5c914cb05d8e0633539acf93ecc0018c4e6ac40bb4c959bff0450ceb97e24838a9dcbd8037b0047c8eafaa4483aa3573ea81e56c2a21d17b302095d14cbfd9c0490f68857c90780c2a1294e08ced2b9cf3ba47d025b99f1c1ce37c4b470529462ca1b1f5547ae01d44400d30b2a4809984e4b53519e604a4086a62ca6bc21c3f23631d4e188614e72f5e50b976bb7b8320b897433e9d05bea780280e547df5537863a761575c8179c49025811578d55adae48b88f7a975dc4fb0b4b9c46c020f02303b68987816b2b0792380ac04c8a411a2b226ee91c4b1a45177a83a3aa633252b410f60c7c532c783f15891f51e9dd319cd6c4a5995944bc0695a160f2979c967017598957a2463bc7c943a2d852e410148f32c8c88054900ab0c1dc82f8a316eedb966078a72e3537b5d969a3f26b93fa3927f774681413e3de47ef9a5c1f581c2fe40345a3b783f98cdb9926df7e93a0eec4b3201733d1607e5e67366c1cb08dbb1e5aa6dee3231f15062776c1174c722abec857e23a8b21c559ff915e1d67b56ab52e2290276aa5577557edd5731f0c0a52d2806756cc1faca5a26f38ed656482a1733226237d4cc910ffa275e77ce60f6637b7c7c4b2921fd53778383c7c50494f3435310a36d75c75a8404237cc05cc0f96f20ba333690029da033175a16bb59473e913eb9974a033a01d29aa46bf9667e87a98b05809fa8471827c2c88b873a29a3776a7a51911b291c02d1c1c2f6da5915c11a181518f32334215796a350306e1ba29ec5cffda5c312149523d0a87d5b5d6b678c11e6c7dd354e51558bd779a814d77bef6c9da50412dda32ca2a7a337b87124562c0f2c81b652735eeb491d155a9777cc7f4c4884ecc29106587db923a8e50428748547d391e2f282cc4039ecfc5dc902265247381ca73bf948a77916a62ab347c4200cdaf62c30f3ab8036441343a903e6128e1a2803561176f3ae0d3050b0fcbbef041defc72a9a43ab8cf918b8952eb9433cedf82d01d9f00e44e9b7fa173e2dd8b12bee781bed3e220007dfd751280b76563610c3508ceb9fb2f13a29fa3c0e003b929866db716a9edb1ac9f3dba2a69f5b27bdd7daa360ecbb51bcb33f5d36f92fffe77c2de7ed43d281dcb5fd68cfa0ce19df2e +ct_n = 19b46e942815df5b1cc8d669d0644cfaabf9da05e35243c9c489a48e8d2c470ac68ab3c1f70b3930ade530ffa91af30f4c1757fc50ff706d75cabf4a3c072143f5ceace47aa094be5031859f5b252097c895998ca7a4514a0a4bd76b6707bb7d7968e7529c26e12fdc29e16afc3345b71953fdcee48190e9bee8d6df9f4353a7e12bb5402c14bef998d6edbc74702e0e0157eaa6b048dfac2f7a354408383269cf8ffd6c88969768e5ace986c2c0f848a63a2611230df97816b354073a2d1fbebc98d9c59dfd2eb1e4789ddf855403937d30f8df54b24062fb77bc56803dba2337e8dce2db435e701ec2f8464bf3168ebfe4c71dacb171b43c8f796eca800a638d7b2dc052f913ed9ce08212cb0124f0aa36e46d898a6930df71d04d785e18df4d2a61b426ee19e7abb85cd6263fb43cc9b0bf3a7b9f34b51fe4b0bb3828baf98fe0b1baa323b64231b0ad863f522ebe3b7916f298381cacdd75b7bfaa75fccfa2f1b3684e1fe16a9df25e36982ebac878f6eb45918839f1f0c5d13fcb6dbef1c9cbdb72cf5c38cc4e79ee08f5c7097fa6ea46a19dd6435bc5170ec8424d34cb0f7b96c73071618370101576bfeac0d288c2888083a9b697eebd9f77d499f3d4ab3d612f3d529e3a04d93675b5cc37b07dd1df060e630b93c05815bbddd6e798a1b52a2a6be4b9376e7e0011e9bdf3ad5477c2b35e7b6dfb5f6da8605151cd3546a57d89a70375bc4af0108823ca0350687a159d17a7e87766681f71c9252430b29f72deac7e6f478e3b0d64d7d74356f0823bfe72a8445c3c2b5ad6ba1d1d3fec90ab79243c0c0a4f14a48ade462c47c89ef635437b937f30686d47489467c847db47faf73bf2f95dddc3fee9deb5fa5107a20e683396c21aad0d83133e34a026b5457f17e21f05457e4b489c72df3dd950f7e820f5f2aa0a6409a237108a35efeed99ee11424a79a1aa8ba9ad98f4f5eb221c9b352885653dd062cb155906e07943bef64515b9a61c2aa09385f8fcc20df8d090febe6a63380aa2319913dd9a9165b85b45aaff8e2f6f1df15f6734aeb5ed2e4dbbe6724b2d1323825c2cee8bc34a06cf6aad70201b26e13f89412568acd047a706b45b401fc935a4cf74f520fad7aa3ca75ca449657274cd4bcae3cc7e6246c32a248d741e768224d0964162f821547fa6bc10d6cd511d9cc458d23c5edf78ac3839ec7465f61f62b3bbc9cc6113bd866ea4329eab97bd9bc83656c0ba1b5a96207dc3bb7f9a922d578edb6637ad74c3833aca08a3abf10a318ccfb227662c0990b1bc2a19ab519a9522b727d00681f821c175d5415e2db15b89c108fbed0bf29224ee1b0088ab74622bb78d8abcbcead7fa28dff83dbfe255403d40715a52d0cc64904933214bb6b5feea8e56254feb7765b978099d33469526f0113e6dbd52157efe97622e4b15c4034cadeb28d3fe77408402088148954a321dad626b988399975e6d647d72995985b4fd8973cd1e8435c489d3c891b0faf2174957bf620717fe273da7f5df3cb26931fab3390474dafcd46163435e1bb14fe645e77235e25a1479eab52f5e49f35decce3a99fa38471439fea7fe6501c260e73a2d044e266e0da8b83d75c53d64450409b1d18dae799b6387e21055187088fe3d3164dbb6be91a20cc947ad112c418b9d58529c602b7041c817dd292d7d57127c85a8879cfcbdf683ce59ef35fa8f18921972392610b73e7b965055bd8e6abd6a11b5b701ef54c21ed9da25c858649ce05ccb5a86dd870da256d8bb769731b0bffe16747fd3251cc9b3a77503bd8b68f4622a4de217085ce4fea4b197caeceee70b3adf4b486def7f4ec50e53df1fa6111c06360adf6c422a05b06f62ad56d550f25875f8212eb978ca50eff047bdd639d1599bf317b80a41a6a56ef700f6126bd36bb53548c83a0167c6b78c790a8cad2a78bbf24a38ce3c514e37745f3f74d76de8522e47ca7c72fcc809bf2f813ecc959f1ec337b763b9de49c610ca072772bdae1c3112f9430c82791f0b96c0e4e3af2fd9d81a16d3dc9ccc97257b14fa902788cd2ff00aec2e31319552e109b7efbc7ad6ed445de8f1006b4e15fc4fb33308b14f610aaa41296b2c557ec1ba984fdd87d30a6c2e870b5d39779d95b1b5014ff0f4bda1da995f7a57ac978108d4c66a335a301dd9922911084fbc6ea6e498e8bbb2cab2d6dc6f7848fc308ef5dcb +ss_n = ead1efc9e0926912b00c5328af5e904b09a790daae2db8b03e1fac1b52404969 +ct = 069bd50c6d7a5c549dd1f2c55a99bbad9dfb566dec63024011c97d19bdaa9d855d217686d8d7a6863b90696dba7b8f8c40c30edd5f2d622a119f274ea4bfa4eb5073751126e68c1f2ff5a69e72c9a2414ddd7be9f70815efcc0f0d0b745217a65b6e5f3aa9cb634037804507e80a67949e81938b0017a7d65602708297695db01dd3778154a5d644f5f294493503bd6d0dbe261e92c2eb19c8bc1829fb14b95c2532b5cca04b3f84e696c3f0be6118db84aaa9415e34bbb80f134e40de6cd27c61b6890c99d7b8f3e5f80e20ba96ee31781efd25670b62ccb3f899c626bcb735ba855096eeee45444d2b0c3281c3b9ca0f69564469df843398e3fc83ea12da069893abb72236b28f8547f2b73f871b3298551fa263f60d17a3d46c4a3d9e854d7db3316f724e088e85f5191c721e7e1baf95f4f68ee61668b270d0873977584f0e7d109078c8135d8775816402fa8f3c9071e0488a2ec4af00398a8ba619b4c8b4ba1841caf8e9fde44a80d2f46417ef529ba33d4cdf69a8f5f8822c7df18802c1865df6e094e487f992b19aa2c770e1f1a63677a6dc7edb1d19b5e4f4140acd6aa79c2826ebad4d29ce7a75c2500c3a96d5726ce038c05d5a89371d4221c42474558c95cce44479aeb2fc7972acf43a92b86fe284a03f0258588397492b13f0e186fb30531d66e566371218d2d90920e997420570ec77ae1b5add185b05c5732545a86d0d2959e30c4dbeecad5114eed7524444290e0652a502af1bf3f305df79304ffeb69d3c21780262e398b002fefb1bc849403c17e6e418b7bee7137e8c4ba83a05f1451dff70dac548c26adf5f0faa2170388de2d2d5f4a4201ada19eab0007d744119d18f948dcccc5d1a455e87b39a4c6dc9eba7965423c44625aa34ecb175f288daa832390aa98508467c7a928cbc3177e9aef32974697085ca8b9f4b028d1f7e0ebd0ec3e8c40781d399d041ccbd29dcd6357fa32641f9b24eb4d3f6f331cef508a29771da72dbe343d934b177625ab3d90d9a14986e6395e4e6fedb7567016f0f9f14776d19bbdfba46c083aa5e32ca62c8961499c0ffa9fd726331e426bd78ccdee5f3c6bda448c0a0a84bef5e3abbbb421840d45d9d22b462dcf23cbccdf72d45680d81ddaba76ad63f997978c9204d2f3fd49f54fdb34377753abf6bd1b96aac1ccd90a13de231f3529646feb01715be5f541bbdfc30bf6941e65b90cca98be3f71522ab8193098929baf22e85c4dc4f04a949de89363d8080fb1131ad0ba0645fcaf583e3854c53de82e2711ea60bf90f72f97f3bfbe2c4dc6def6b1dc1adc96c68484de80af9b9caa66686754fec89e16dd9c8ff6d91262558f2fad3b60a90c5fb7b57c12629f70cce9878fbd6497977969825f9b3aa45ab186da85b5f30fd46127c911e5afd2899d0bf291b106686eab6a4ef6842e7a7674152a7f42d831fd467cd71b3e5e49a89396fc3acf6b79d6f278de1da94ae8c56738cf41aa2307ddc156f88c9b6404ad4f7ab8826b4a7b109051662c665ba63d37b29650e2376ccf7a433c9426f5a3272448a3ac74773abe0d9671ec234f3ca3fe174bea73e32db3eb7f16eee38e8f5ad8826b6d5aca161e463bf2694862b9e6238bb72ea8aa73058053615ae7aabde2b57a69fa5433953c908e6543ab335d415b600cec73fd2b71e197d820b7b3b80f6ed068fb78156889accec02cfbb729a98de42ca955f69e15ec64b33c70051e7e32fa30faf76abfdafe06c01e8c2ac3ac4d4498fea8d34b914adeaf54c679971e05eda66895fad91cc754382c734edd5d9e85c38a313971bc2faaf8c562c272640ccadd0f3b34d318aa06a8489dbce598de7a686566b4b989023a7a45672b2d0a0233f2c67bd81950dbb76774578644959725381a402bcdcb0843546c3ff67aa433d02c22a7ead87fb395c501b53c25b4e493a07a077a64972a558d57239834cc2feb31f49e7272b79122bec47c5a1c870e89187a679615167dbbc20c93992a20ab79833681a103bbef5c44f7326ebd0bb4ad367c1e0bb05daffe6ba5688f5635a857fbc5b4f7a8b2af103894ef49692bf13ee91e4ed0a453965656b245ea879b303c27ca30fa70cc50733a205a5efcab769bd5442c3882fe5d2e71e8a80ce6867c5f501adf0e053cb8963777a89bba8a190fdc2f0803510244fc62834ae40215c90ea76f4860567077dd4b45eabb256bb +ss = f36ace28d4f9f75afe8fd34ff02ad6c402af33567c5b33f91e5777ca74f8c840 +count = 8 +z = ad10ad3409a90c4b24ab0da526f289209abcb1f05c86c7e4437a144c91e1c867 +d = 23ca80a61c0201f08d6b9bfae101fa573fac5581ea3e54daaad3ad7a00be5716 +msg = 81c5839b15d7335676dbeee048f6bca56c4976331b5df39a212bbc2a450f4143 +seed = 406d9c95f9813ca6a9e6071d3a7a63093f9e00cd15ee968c3ab28cb7368699491e5662f6b63721fe059d50295c3a7516 +pk = 9945c4e2db5b86e311b3450249742a0fca203d514b68b7898e2599b095123370a302934c27f79c169565f4267bceebc67f39cc5881807d68a3ec61a07b3081b2069bdeb27402430aaab193619c8562d486b21ac8cdf1c571f4cec0cc991a99058ea3c6007a8a118a385f86a9a8c811a952caaa5c5b78cc76d553b39c518415ea568ae5ab26353163d94efcf9005a045269e50ec0c2006bf1589630877ad66b623b52ae4924c8716e32c6833ba65bde5a86ce4acdbf3721c7908a32e09981674b446b2b1c2ab9b637b8105c143b29b85e55bb7a36a03de3395765866ea65bc0e4960088b6d617903cbc14ac12ccedf8305f0622f83a848f9313f53c504fd8b6eaba4d8420c5b1400224d165a5ba521955cf93c22fd358c88d385c9b349410b50115abc22bb83010db0a2a6b227e986e9ee0abc7c471a719a7ebc7b84d011053bb42538662f7249df53b422146016997aefc43398118a82585af1e700b65198feeaa2c001a3ad9372f4c9a12a3c3525ae2c38256661229cb567a0c2ab214702cc7fde1785a41597e4969100bc2153bc7ea153582225ec109afe2ba851e926bbfa3103df4a2e72a1ad732365a697e93f90038296de5925c719423c413c33553afd8105bc9c7cdab690544ea5700ecc2f592c4063085c2375f0cc9bb3a5bb057e243da632afab9916ac78dd45acb5204368e47b20313475253b0a2c152809734e09abcabb6934041ca3a8b5a03fcbb29116d4e456e89a0769bea053e9a888261145d0911e042724a41b35d154f3a266e9a389783804f4e239f80868c1ec459a2f2c8f5e44ea240b2ceba3da2da93b1a6711de01009a67e14985416c48830bb56ca6371ea007f87ba3177f558e3383798579f1f873769c053bfa8cb6fc4c53030839b1343d2c367e2f422bc1c7c00ec392f94c17d4524cd98b071b09693a73b2dc909c8ab26f4a12a8c46c1fdb11a9d6428930351874bb49b919e7d245aa2f14ef183b47917b39fc6b3f8c664a217a11bb1c256d896f5fa68f6250029d49d797163db011f5067a1c4158a71f8c52a02c4bbfc67621b4a1ca8914d673e25b0c587d1887c638c438459b141849ca906d0b363484a7a1e5778de74659f05a327470e960948feb01f66da1442e1516cfaa42d6bbd5fb6c2f5eb49e50cb7a0d31462013f65571e6deb53fa65890d394474d33e1c0b022ff4129e8671ae275b6492886fa94e024017211bbe60638124a76e9f49234e210380b46b3d686a24713e4f9c47d82bc4501084cc3932dca5bc1ad02c5426272db0880443726c4193c2337119f66112c1997e97c6d602562412c9c3a23c0723118f7a4e1383a91a4b7151a0454007066532440e93cd76c6b24163406ad276a9e693f085ace935ceb3dba7a3e49f66615d05d47a4ac12972e8bcdee754baa0c7652612745a5889518062f46fd00086aee62731e5557a631d7d19a420398f2e66a08179949f2a9cd7325289252fa714c9fd3ccbb3ac8bc2c531cb677845749e6bc911ce416708760e8f281f69231ba0893f10a4b4d7ab8ff78387f2db6d66a9a0f324a1073738553c901d8c3bde6c7e704159b7f0949210bcc35bcd8e7c1ce92ac8b50564bae5af6982174789cda0f9cffee1a3f9c36df035122642ceea535cd860c4634b981dd2cbd3b960a5878919abb9893a2837a0a59afa98d5d858ff9937fe46248d8003ba1cbf6aaa0ba39876edeb36fac726f4052155a85c006389550ccf4bdc20c2363a9d5726ee58806aa878fe7b2f1488953e500013a96441f643df095195c844487c37b05b70afac550a67ceb69659e38a19dd02716cd42406369cdf75c6056327aba4cceff301cfc2290a7458593b599d4549aaabc4973c735aa94f308002cf10b4afc84b9f445e1a127852db05aca68b8cd850ec768a8bc0cf62560246643bdfc08698c3bcb1f1a5771569f4ba951746845043781ce969b775b08f997dc37ac866c13acb153957f47be0338b286717c348455d85424f93cbd4329eec94a533539a7ba06103fb7079739fe0e08bf8cc4f7d2bba6a89b100e219eb7c5899e94fdc2caa385ccfe9e0703ab87317c5c57d2c5de31722ba1841d7b204fdcb6d66180b43cbb7d94b91d6f48eb478a95edc71d371b55acb1616c220965b4bf2b907420b4b4663374dc682e1188a411933b533f8692ab637028c5d029dcb7a310a3bd6377bb6fe262d26cd38474c +sk = e1319a3d86be4cc093f20c915bc707c25808486cadb3d55b9273097606b62a2cb31a25cd84005f08ac956eb684021488ee993c502b7968192b9ab8a72c118ebbb36a72b9a22517b344712629b8662accc28d36400cf219a0bba6afd2999ff7364551c025d04d51b326c2d20b6fc12ef0d3a59111b60843a09df0aba4e236b00b4e59840140107b65901aa4684e22d570f6e603ff53870e99834beb8efb87aef266cddd0a8754c5384731c6ce069da4c2accdd751c3004eb5d138e4e6994cb481314577582c788355c4a5c0604dd1147313ad3b829a829b87a06628b02173542c837a024dfac885efec7d78b84f762640c0879d0983c3058279f3964e6b3bc329436061cb95c7a90d752a1a786aa028fcccf9a54861e7ac55d6c987cb5c47d739a326004eb9352d778cbd9c11961351e6359b9ea40faec82a1e225b98d14ce28c6a29f007b96a90b74693cb69857cc65952943a0305609b3a8b44db55bfe08765c9afcb029f0cbc5ad27720329bc78c5070c35662f785cb6bc7512a04a5074466ebbcc0fa51ae176c5ccee82687aa727a44c2526c7993104143d7230c55b1bf0c2898a80921f6bb31153d96f53020d5567a408df015a6031a77c88863006914882380ca4850f0bbae5d32a39ad3aaa9e63b6cb8c0f14862e3d86bc486a7a8900800b4474e1b95bc6481d8d6b31be0bb16844c579a7f9edc9655d79b02a950c3d2c201ea337e7398330209b3f35e33294d234550a015c4b506ca67107ac1224f650352a2f7032029bb4ef68bde5ca41d9b19e6a21ad3bb7fb7d57a9f9c5246b207a9b33e35b18cd21a0f82e3c6ecfcbd1c32aad6f792d627ce8aac36d086a7e2180e8ec5a516d7ade543beec201081326ab51437bd5810cb79a342267e113a90dcf59b9020aee15abdc9f0afac2c3c5c80a97351010478aaecd1062be79613eab0e8e1ab7a6b5bd2eb7805c8bf3926aeca93937e1a5ffa3b903e6189ddcbce5cec18ca0b975ae68e20b95acb79a6e4021350ab765ffc64407412635279e1a76e2366a796d7190ca99146120d516557e26b8769457c71b169288923e055332bf865a33789e0cc18b40883fbca3d1eab139809a0228711992374e0e762549cc6520562a87a54da3860bc74840e67c167a607162533b24610214b477da6a53020bc7832b993e94af555876b33c4c190aa58ea1850f2c551619a9f4c785343b927846367687b9637329e039fce764c66140744908392724340616a5f76ca7de19e577444c3fc7e6efacc9b001221b2324d14a863fa3091d08ac8b42ebdb77fccdc24e8984178e6cc56aa6962964959335e5c0c82ee8405655621b033bb19e94791966b8facb0be85a9d71c2baa496ae519693d170e348951767ba9d7731eb6869073471edbb7c945a1cbf4a18937bca424b4a78bb9a5036b3dd8386ea546702d9584172b1e1bf8570032787d85277ac27b94aa3b7e700aab4a23a13322bcd3047e18aeb34749a68625f5199916d0140ba35581747128c01f7baba01f0150080b7ffc1a5f2efc7491a5bc4ab6148cf859de07a4f08c002f61adf5c6cfb9078dc6470166a4884efa2051a57d5089078298b981bb600f68877495b575c8a424075ed02305b265cb2b617897fc8422c8977a780b72ea6b56fa1ae3c6a45fec4e68abce95e10d83719e20ca71432b864a906c96c590862899193c67ce651654b46abfd2c58b0354219cac9ec004b57b9e718b6e8cfb72d209989ac3ad11e7a11c8a24006b9151f1c07f644097d878e9ea90923a81a59c24e374bd402bcc51c84281216aa5e564b4a71e6b7a72c3255149a899ae320874a4a85d665520cc8bf819b87408b626aa590a42a62a232e043a2f44558f803cb549f7b56cab96254b7bf94c95a887234927311551b35a499253227614111f7ea4840766cfb63984b9b41ef8b1120a4c5a9971a15beccf445313fc32a15537ae54729e6e54904d662f70c619e0791ea752477755b2fcb6235afc38d2f21b60aa7019fc9e96d17ef1e168a8674f35166e93c3afdb2b92dbb2678ab4ca0b46b9e8c062c70158c2a707b6452a6af261fef2b173556d16ab442bb9a65d575318471900589af42cb760d8016011995536470340c16cf37af860c007f607a4148728d04965a9b9c7fc757a55880e560f2fd06d9945c4e2db5b86e311b3450249742a0fca203d514b68b7898e2599b095123370a302934c27f79c169565f4267bceebc67f39cc5881807d68a3ec61a07b3081b2069bdeb27402430aaab193619c8562d486b21ac8cdf1c571f4cec0cc991a99058ea3c6007a8a118a385f86a9a8c811a952caaa5c5b78cc76d553b39c518415ea568ae5ab26353163d94efcf9005a045269e50ec0c2006bf1589630877ad66b623b52ae4924c8716e32c6833ba65bde5a86ce4acdbf3721c7908a32e09981674b446b2b1c2ab9b637b8105c143b29b85e55bb7a36a03de3395765866ea65bc0e4960088b6d617903cbc14ac12ccedf8305f0622f83a848f9313f53c504fd8b6eaba4d8420c5b1400224d165a5ba521955cf93c22fd358c88d385c9b349410b50115abc22bb83010db0a2a6b227e986e9ee0abc7c471a719a7ebc7b84d011053bb42538662f7249df53b422146016997aefc43398118a82585af1e700b65198feeaa2c001a3ad9372f4c9a12a3c3525ae2c38256661229cb567a0c2ab214702cc7fde1785a41597e4969100bc2153bc7ea153582225ec109afe2ba851e926bbfa3103df4a2e72a1ad732365a697e93f90038296de5925c719423c413c33553afd8105bc9c7cdab690544ea5700ecc2f592c4063085c2375f0cc9bb3a5bb057e243da632afab9916ac78dd45acb5204368e47b20313475253b0a2c152809734e09abcabb6934041ca3a8b5a03fcbb29116d4e456e89a0769bea053e9a888261145d0911e042724a41b35d154f3a266e9a389783804f4e239f80868c1ec459a2f2c8f5e44ea240b2ceba3da2da93b1a6711de01009a67e14985416c48830bb56ca6371ea007f87ba3177f558e3383798579f1f873769c053bfa8cb6fc4c53030839b1343d2c367e2f422bc1c7c00ec392f94c17d4524cd98b071b09693a73b2dc909c8ab26f4a12a8c46c1fdb11a9d6428930351874bb49b919e7d245aa2f14ef183b47917b39fc6b3f8c664a217a11bb1c256d896f5fa68f6250029d49d797163db011f5067a1c4158a71f8c52a02c4bbfc67621b4a1ca8914d673e25b0c587d1887c638c438459b141849ca906d0b363484a7a1e5778de74659f05a327470e960948feb01f66da1442e1516cfaa42d6bbd5fb6c2f5eb49e50cb7a0d31462013f65571e6deb53fa65890d394474d33e1c0b022ff4129e8671ae275b6492886fa94e024017211bbe60638124a76e9f49234e210380b46b3d686a24713e4f9c47d82bc4501084cc3932dca5bc1ad02c5426272db0880443726c4193c2337119f66112c1997e97c6d602562412c9c3a23c0723118f7a4e1383a91a4b7151a0454007066532440e93cd76c6b24163406ad276a9e693f085ace935ceb3dba7a3e49f66615d05d47a4ac12972e8bcdee754baa0c7652612745a5889518062f46fd00086aee62731e5557a631d7d19a420398f2e66a08179949f2a9cd7325289252fa714c9fd3ccbb3ac8bc2c531cb677845749e6bc911ce416708760e8f281f69231ba0893f10a4b4d7ab8ff78387f2db6d66a9a0f324a1073738553c901d8c3bde6c7e704159b7f0949210bcc35bcd8e7c1ce92ac8b50564bae5af6982174789cda0f9cffee1a3f9c36df035122642ceea535cd860c4634b981dd2cbd3b960a5878919abb9893a2837a0a59afa98d5d858ff9937fe46248d8003ba1cbf6aaa0ba39876edeb36fac726f4052155a85c006389550ccf4bdc20c2363a9d5726ee58806aa878fe7b2f1488953e500013a96441f643df095195c844487c37b05b70afac550a67ceb69659e38a19dd02716cd42406369cdf75c6056327aba4cceff301cfc2290a7458593b599d4549aaabc4973c735aa94f308002cf10b4afc84b9f445e1a127852db05aca68b8cd850ec768a8bc0cf62560246643bdfc08698c3bcb1f1a5771569f4ba951746845043781ce969b775b08f997dc37ac866c13acb153957f47be0338b286717c348455d85424f93cbd4329eec94a533539a7ba06103fb7079739fe0e08bf8cc4f7d2bba6a89b100e219eb7c5899e94fdc2caa385ccfe9e0703ab87317c5c57d2c5de31722ba1841d7b204fdcb6d66180b43cbb7d94b91d6f48eb478a95edc71d371b55acb1616c220965b4bf2b907420b4b4663374dc682e1188a411933b533f8692ab637028c5d029dcb7a310a3bd6377bb6fe262d26cd38474c0cb46ded2b427bfa15a8f2b30d492e0dff51c830514788bcf037cceef92d1846ad10ad3409a90c4b24ab0da526f289209abcb1f05c86c7e4437a144c91e1c867 +ct_n = 48a940fd8ce0a7105163738acc8abebff47418a4fbad5d680e4d3c6c597dc47f268597b2c4c67ba3043bacd853e5ad8a07158f518d5b4d5c59e76ce44978da79866a7aa968290f550b97e2588bcb6e15a1b7c7dbc4b2f06c2b51723ab3522c05ed6139b5ebf4969ab80ea9e48b6159b79056ebdfb152a1d104b9652294bbc74aa482c7f5778c460d17bd912dbead475d1737afcf6013bf9e20c7fb697d4e929a9d1df5a3a9b4b89f1c0a8bd6b72ef59a6054cce9e6dc23d37e25b63f95a709276a3329843ce95131bf9e515e0f86daf834a11fc2d005b3fab7a99b8b52efd75733a2825c77b7eb1d6f199843902f6088434d92c104e9a606abd6c91b4deb3aa5114bbb8cf94c5008b3c66baab6ca51569481207f27306f10d2a4e308403f75d5a62eff44d9d69485683480bd32b17c0c3614f7d3230686cf95e3313504afe319358f670ae48ce542288c139e0bffcd4b289e94c61b1cc90b3f73b39a8df71996cc8dd3581c49b66c8f3b981d14b8bd9f94ec7f3368649f8610819008a9127374246d98edfa7bf46dbbfa6c9781c6fd09046c775e3c682af91226b6ef39fd85e9571b39f4874b9133c63d27ebdc426a848cc5642098cacb641655244dd7262835efaa96ef236821915e87e1372656c6f882c11f6b9570d29e47d29fb40b452d8c98e2eb795e5df84231475c83ffd9fff771e12ea83fc789f9941027f0c9eff1d379ffe1abb35cf05d5293506f99278df98af82586ef33541527b47362d0f91a48e1e0d5e0000d4591ff21095ea93dcc1b8e4a77b23d19b5999ce4fa64325e1be4295a54819b1965a7b4691bd290f3a08ed3f053016e0a745e4872a9bd7db905d0d2702b4a264db32846f547d9ae6627c27ac4865cf498520c71cfd8f983f6ecae28d4aa8b6302727e65e21c94dd828a84474209737df2a96438e8ad4b7a528ef1ff4fe25e47ebcf723dc0bf8bd35dafb2d99dd4e104e26f8a0ce7b8cc8ced69db54261c3f86fbacb3cc443ae6baa50b627678ec9bbbf38711cad228188887ddbc68936b926c353db32d934f2b40c76750e59dd73c3c1f5d44ee82976e375cfe4a4989db5ab779126304b25c4c3afc460235fd123706a3f9f80b27751342d339aa15a0179dee4086a39cb0b4c4880340353acd36b31ccc90abcef46e986d221d10c64e7d2a6df1306e35b101864da0c9d2adcbdf869fac6c25af28268e8adfd24970e0be8ffbca889def0ab7942a528da228012db8d4ff77460c4bd0692cf398b848b32f0b93168e4a0854bcfb4178aff690a7f2e985ca4ab50b9dbcee17a754655d4e9b93bae575d9e07fc0294e26d66a70acacb83cad0cce4ef6501c8f3dce246d62a3744643ea4f220296f3fdbc1bc489935fcda5828bfba25126a983eb5ce7d15a9c33d5a7403649ec5336425f88c3547b6622ae29a23b0e4f6d3cb56006b3097c9c5190968404e35d4c9045ae25c43417dde753e8abfacacd98e93e3dba983512366d3750cf5837b978e5c66146e70ab19e42ace110c2110d0c24785f148a85e5cd9e4a33c27b14580028fc3bded6c5f8ef93c79aeb280b367abc2221d230790ee5e18a0ce41396bc61bbe01b1e7b24ac67682365737b70dbfa55cdb89c3521b751fe605906cb20a88f18dddc6ef143553321097e366635ec23138e1db5dffa13faf88949aeb294e0bf0c7395feafed72d81fc89a5a16c126788947f1bf73350797bae252483059fe0db30fc3d26c36ad0969640adec33ef92999bbea5cad976e1fa22e6a91bbda8f8ba1ecbb8aa867bc23a6f488e603e3049e72bdbd009f58b6f23058097d4b59779c16e833221c2a0cbe8afe8200f4a0a03b3f874fef9372e8b437f5410bb5c7946c287793063099a040fb60d3c96eb4b343e6e1ca4e32b3f96830c52ab1381083ba4039ba7dff5fbb415f488a2afb5b3ab016d3c5765b086daaefd6b772e1f022703d40027f076f06e3fcf40a4d4f2369fd652ca6307b135b281ffc0c02a594d77c58aa8bb6a76439666097a3a679a552f5ee6bec8f2fb558e5594def7c30a58adc93b4211b8c83a9e71e028978727cc7513c471f39c9461ead9b8b434e6c2debc9ddb45fbd4631d3f28ac97d87530768d9f06e4a080ef0d93ab96057a69afd881b2e22ed8da948142efcf8511dea217363670f958f86add4265944c044b3ae2df46ea6258926ad5a580c25e728be842679a68923ee21 +ss_n = d177d9fc8ed732284f117b75ce21e24dd4e9e480c2bc82a4b3247439fb67854f +ct = f82392974467d1dddd19ce29ee8ecd1a03178815a53839e00b8f8a98d34b32615f3b9dc4bbf7e8c8025dacf7ebb01f90519a58939a8c576a1c302750ce2f7cd5c9a26410ce8f627cda7fadb99fc85a2687ea4a209959e2d562343f1aec5031b460596a69f5f5b16ea22a0d152f6b16d62d1a1c1f8167850217f8454e923a1a52b93d2dd36da5c196498b69b94c34a74336b9cf27c545c878688f84e7f9863d52c87abd3ca30aca781896eb77432eaece2c76027e6025b25017a0b02ed6c559e06a7f27e19cfaf39ee184a5c5fcf7137c58093466ed28b8a8f9c99b8823156c2dc6cef755af978b14fd1dc797cf73047deed138562f468c940a3f266afd6ade448d96062be6b407be94f137b0a42fa5b124dd7aaedef4423776dd643c78148939a4f1db5bc9ca7c270d9287d5b531eac41fc4be3a127c511959aceb8931823b6d4ff7a5b4aea6406b854d8b7c54d4a953d554de0855214017d379f97440787b1076f71d54c7055256be69b761be5bc7f1f471592cfa2d7bab779b8ccd3d13e208353bc7e48bc06d561f3151de61e4c58087844e036b0c1804919e13648152cea8acd62736661e7eded2c126873b10cd3e6aae80c73714359e2abef4d708ac856ad64389e92fc9d60400410e51007b94487f6d7c7efc2bd264e315a27cfff6b66e9f776d6a600eee00b9278c411a7fd3151a3a8edc4909e4b9aa4feb143b836dcea125166b3f6e969a71610b5011e94d1d2460d2a7f0d12af9d449f791f8b54f5d3d635f473481a082d7a7e299caec87fcf9311c6d52b178ec71dbefc38eb665b1460ccb54ab81c6592bbdcdbc3ef8408253fefee270d12eb65ec0f357364db94ae6dec859bcafc18a717c7f0cf8ec3f459773ddfb2df789572bb545bed09f60da1da0cfb1f6219242e6e719e4422475b6466094a211fece1653c397892725f93e148eb13f02502a20b8a8fb836493132eb4ddbad06dc2240ecf1f1f8b8c1a99ed877e1934581b96906c0e917edbf520bb68ac5e8561a643c54ccb385e6c760f6bd37c2ab7e79bece3902b4bf746313a236b81a70e7613c95a8e2ed3bff41e7130b9a0c8a63717e703ef30ab8500abffd0f377faa5436910fa8627b3c8e0bab4226f73e542a35a2934eaca4a6e18342fc322a150bc99a68385f6d61421704950e717bd26ffe0d0526f825a8ab4e0562c581b0548c3b7e640c71c981b1d224608333ae7007159c199149e3632e43915cf04449afbf5a5e0929b187279ba227b59b0c75f988b6994245053e366b47ed3ed8c504dc060f2165b9c657cb767aea6c14fd5cfe942c4d9189684f812dd3096a1fc4c4a3bb6efa63f3629aebf2494ea6e544cc18fd9c2700cdc3816bc76754eeeba41d836e10280c081a4278f3f00aba9571ded482f57096950c42bfec563a154aae0cbe8d57a9e5fd813bd021aa6f2412c6414539b9e7d5b3a89c8e3d3fe0295a2e6d473552d11171b51c93f35808a1f574befeb37c4282eeb95c506efb0f982984a68422fdfa2ad0b570b57db2138bd6cd25407828d4133db6b91af5e372ee71fb2c4fb57f20fc83b5a567031ca23bdd0c9affd8946cc13b16fc94d411ea021ef50aded2d0a9a0e879f8ae48ada145f1c7729a5c677793e865d16207d2f511ef000fbabe35ea6b4c9eb94a195d1a1a4c42269701d3a7172a1fcba71b2686a83fc1b5e2771a463d2b852f464217391595fea32023e1cc5a0c78529a4f989d62b0ccddc33ee961614a71bd001497037e7e37b7ce00884e387d9314b8612a45bda618c4875b5b7854f2b46b1231dd3644f1406be71620f2ec7d98763012a1620c5e31e96c8626abb4c76f6a8a5655e5d224ab314075f196dd349b2387fc307916dcb532894f87337baf4197e168b430280a63e9bfffef57f88e15799a42f5bac68c2355760a4d3603f72760d30116f746ca56ae59e611e3a0f4dcf179927301e77e149baf8ca839f97c2c6cf61409285df9d5bd947f3d7b97e7dfeccc5eed111d821eb1e7dc5e71b9d74e5cc0640a89058cc4244183f0700e1a882a6175ffffea9a10b0650a5653f42e09b1df35630914d98331b897f58a3352edf8ddaece3d97ae2d31c0e58d929a6cdf96b3b744a0be91d3cd19339a93997329426536d7fd2081b620cd6b136c3823744ac3c2b133d5851aa897c5eaef909e06dbc1173f69d1dab5121d0c95810c500428837fb3e40f34e +ss = 9cc4abfc04234c2fd68362d14c2ea03342b0d777a7be4222594f768aa8ddcbb6 +count = 9 +z = 793871afccb50f4035b9788c7292b717939aa28f5094d99ee262047b15e42deb +d = 4873d1be6c8d109c0a8f765098aa6467b2a1caa74b4c0875fa798ac727ec4f67 +msg = 9aa488f44bf182090015d67ff8db894c355f1f588d32dea8dafdaa1d1404ca88 +seed = b3c83c13dd15dffe58fdb6026d32e33e5ef24b094be16741dd5b587ea841ad19b6f026a127678849ec1b459a365fd645 +pk = 29bc5c645035115c754dc75d80034dfd494da413a46dd858eb085e15f787ccd26b2e849463a08d23ec4da6463648ea2567366462e7a176595eea1647c1e68f5c27cb2cc1382b73a05b154f536c81f325b568e04d38797ffd6c5da5257c0b3b1d99b080eba1c4c78c65efd17d4dab0244f0363879128c3292749368538c829db552d42b15bf14cb17e49f5cd56c5de69139cc2fe5d849dd6a2537eb491ff36b703018a7f8c083b39fa386aaa842c2220152a545889e26c0e1594bcd103f4ae5b97f7454f883b38a5c9bae2190cf4b7088277b5b251e6c427898e166f01341dbdb9f233c68f9c481f4286b10499cd7caa650662dd10ccdeaf67a8c46b9e5725b50f64915976137f093b6108587278117fb0d635a04ba6a6c0cf03a1ce16dfd3b0ef7fab7c98bbb18a720933038b810747407cdf6685aeeebc8221597b2224aed185289561847382ca1bb04347c0c7d16cd2841a926a3a1db03cafbfc99897587462573fe7577826bcae66ca655db09b865148fb28652a515bf827616994f80b98839f1cbb9a8cd34e9482c9c63268186db8635047076f2d4116c841097b8029f1531520070a7d51418a14d9c04c531e73fd70136a82593ce7703d0e8a61bd77166aa725163021154bdaea377770465567a606aa714696c4565fca1d16a980cfc1a65905fc128cc69442614603423eaccb4e91c45ac2f5683a45b51ca9b6133f6da35e2609bf3c82042ab2ca03042c8e1a9dc3457771276868140e3cb638c952333438f2bb3c541d02eaf35b217666fb9cbbcee1a64ed04b19139c169910b85e9b826d360ad84130274818790cbc2a2b104862bc59c5128f28631ba3abc95a4565ccfeb05c34ba2afbdcc925a1c7c2600c8d1b521f213a07054a24e6b9c41832e1868abeab36932f27cd04682a1e1c4b7e300a0b69fe341392eec1eec714f20f70d1bf7a0fe2a3d4664344843b2ffeba7a225a452073d333ac35dc22bdd0b1e2f439426512085b352b7808b2bf0828cca3393426534dc08d0205b98d032e39cc1c7e771466a085440713d6b52629771f7458400a28861c1415604a69fe9885890ca87e0957d5c43e7942fa0c94ba1840bba580bb8b7a11404c44df25109102e19e459b1d321e7972a63044f0579c39f6451cf058a132c64a737480aa39e96207f38c7004f94cc3adb32237142bb403c1ccaade6a0bafb82c6d2d9b3f86636ead7837daa086ad67084f1aa80f273d823a112b77188000a7d420eb7e2bef516b50d8a887ae7a3e93b6f89bb4455c9c6ed3889323958f04a1f78b329047492cbb834da657b92d1b792c67cc601aded002d754308f7941438f9062ad376083145a184363c8323d9423ad8a19cf8c655dcd6c5a25ac664ec2a53ea4a8756307ef364524b72c210a34eab0840929a84d0270c7048b045c546c01535369622354fb7306786bb5fc6d7bfdee57ce2511d25d44d3f3446839450888c54862955560645e8c3acb2f811502c52b99938d41264cd8775d64043ab5072f09a238668402f50350c080b55968964c3c619ac5f81314caeda89591cb34692aa60961f3783899617b89fb1b8c3a16115634015690f1a271d35786e78e40e4cf9b75a6844a86c9b69ea82d4a4a423560e4e106e1ef609cfa560735c645976c42511931d67308d638fbab1922755b162ec8aeaaa846705091ab52da577a481b05ba02a60e0348924d6a0639941beb26acc3aa4f66c42e49bb541c8a1f3786b02ec890fab5475786b8b263dd3d5b4944908f2cca508d41e89b1c32d51ba84f5bfafab02f1c33548b832438c926641a3dea79e0078466fc1149b78257446887177717fb25735ea24564c5558111b4ad61dbff8778c82900714883fe7385d226f2e59943df4ba37d1752ad6494ef932ceb578f7e7c12019851f799c1ca40f8cda926ec393941123ca71cb44c9a890ca08070568044318a48411d1386b80b406d575672231bd949607012b4b78407890e2639869b2aa11c2c91a2a4ce07f1789399afb4603b999f895b36af276d8863e0f372f97bc2de15382757cc324d63815f9031a488a70c94e38a40b48dcb5ae06ce673175b57a7a07d7c6b8c8c642cc858c6851575ba98acc15d09c5d0f7580897c27c59c9fddb1be71ebcd8b64335b2c9c560056d61737159131c9444533b3613cbc49875ba63c3b317560df4e586cd17cfe763bd3e5c9847a0c4f0ab2 +sk = b580b607d02a949107d7566038230e62b70e55007369b81235b88dc77178776b55e206337682a535088315cb774733217161ce8d522909c25ff0c29fe617ccc5a41202fc7822a92c9bbabc84078c133647214553476c74cc212eff946ab183649372cd8677631cc3437ed25d3d250cfcc4ae86e417db9222015544af975f76f824b151679d8677c335cdbb94b403b6a6a4b267e542073b0153cf474ccb9224c3b5b2df338cc825a81e8b64609ace800cbfdde15ba607846fd247b4489dd784191b9129db636533a044d252a35a385d0ecc099e151e96d6c37ad6aae1f17b4c41cefa8c5c06b44a6e65329fa64053f59e48135a8c9cab3cb70d3f99c3603559ae745899572c567b11f9577baf120081a78f4a04b09810779247bd9f5c141876c35da1b5b4383878b3c2c36b8185bb5bbc1583a90b63f5b32a52ac1b9ef43aa36c503c9c9d50916cac124fc8aac1e3e30539cbbe333abd3b5b61e9e075ef131ae8ab4f43ab51a1e078b4198ce143751c862a64b0997150c3292072735c59339b29ac60c78f2408dd5276cfc517788684d859a84e86a87e293279b61ae3a235c278400b0813e0d06547a5c83bc985a8e5ca40cb7437808ecba10735a48560745828516a31b66fbe507e061c062d8923d1fc4c1f781d567a8615e8336447c1e8f381c1a3c3d2092dd5f16619bc053cb01a1d698ce042cd6d929e4b99cae2c0b8d59c4153954601784f585a420a712adc82822f3a0b323630e11a309688c3ce9a3c9d6564fbc8c32589b8d3604dd8231cbb7aa037083217708bff695ac298b26dd5ccbc0bbaa48c21d7a019a6e2b783350e92d35b4f592a63c337dd3aacd17035a6c81239ea81a5314607e2ba850c40caa352e160237c307323f251350549ea173afceb6da7051322f139704342795ac725631a71426ebc0b5bc9858696f8ca4ee8c897c796d3b00c47b91a27fa0890e9b334ac74ca8282a1ca190f1bb3188685e2e97b02d9109af970bfd1c847891beae69d9a512a52021144a392f25b534a4a19cd63257cd1c395b41018e846461277e875261237199f34785c2a7f74c0829bb520af742894c503d02044dc63cb421077fb8860be86cab2e6abba22b49bb45f90ea53c0d4699bc22ee91a8376ca8b6a04af02076b88719c71f58eb3f30ce8f16d56f19146704f1e384c1a141b3285836fd840cc72b9d9ecbe1bcb2b7586cdd22ca4332c43fe0a6b64d44f36175ed8e62c59e4a925f748fbf08f647b5979557b50862e17d0713349761b85087b315c2a10400e058bb66bb4f4280d2eda891f6c65108828cc801153337de5d4a0d0e1a127c2153dd6291e2ac1e9a897209835c169bf0b4c2b54b665c4b9109de050fd1468d0d56da43402ea71ac8f87a1840259344c8114c0bd674a324fe7767d7b8a40f5b2bd4c63068b366cb558b3d291ef3b2ad51a4c4c6695c8708b3d5630c4822127c2a904369ac05795fe6b7eacab19a0aa3fac2359c8378b069a47823252585c4bee39bb95959ee6273a3b351a07a8b68418b3b5686d3295846cba2c2c040e5da13e61e54b6b853d84288d47d992ecb172bd1b9477236f5bc416bafa365e9a89f4b242e942194d2125a871492da6ac1f0bcba276c1cebc8a86b69d22da26eed1134040a731c10dfb967b69430a81f849b7e796b236983e8cacf4b2ad10fb79bf028310446238b32dfba3531d6509856b3ac47679603a867d84319ee9478975a3cd0843d693287f435ca9736b4289ba5d2452a48283710b565f115bb4eb5fa6c11caa13128cc82bf05b0586cac527b82474cbce9bc99f68b6780dd90c908573c4f301318cca206081aee135fc52b12b176d67805b7e57135190593cb41013745f4bd607bb9917f33143626b1f1b5acda8c57209f58b927683b86812ddb3092c36b6e0ca79880780c9b235a05501bbd781b3bb36325c6871e062159a74b87b2b08e7beec283d4e7090dca7c0c022c627ea41c0281778242fd4576365430d6689bf1a3b47c2f90a7f88827695719e99c4ee42cd6632a5e95a9676290e0c7b23cdf8830ad27934851b586a7a8734276a536959b2ad5f20c89b03982fc11aa615a2c7f7ba1b988be8c93a22c211b5056df8cb88ee768697264cbc85ae8eab853e651d4827a26dd62a315ac9473897ad406b10545b29bc5c645035115c754dc75d80034dfd494da413a46dd858eb085e15f787ccd26b2e849463a08d23ec4da6463648ea2567366462e7a176595eea1647c1e68f5c27cb2cc1382b73a05b154f536c81f325b568e04d38797ffd6c5da5257c0b3b1d99b080eba1c4c78c65efd17d4dab0244f0363879128c3292749368538c829db552d42b15bf14cb17e49f5cd56c5de69139cc2fe5d849dd6a2537eb491ff36b703018a7f8c083b39fa386aaa842c2220152a545889e26c0e1594bcd103f4ae5b97f7454f883b38a5c9bae2190cf4b7088277b5b251e6c427898e166f01341dbdb9f233c68f9c481f4286b10499cd7caa650662dd10ccdeaf67a8c46b9e5725b50f64915976137f093b6108587278117fb0d635a04ba6a6c0cf03a1ce16dfd3b0ef7fab7c98bbb18a720933038b810747407cdf6685aeeebc8221597b2224aed185289561847382ca1bb04347c0c7d16cd2841a926a3a1db03cafbfc99897587462573fe7577826bcae66ca655db09b865148fb28652a515bf827616994f80b98839f1cbb9a8cd34e9482c9c63268186db8635047076f2d4116c841097b8029f1531520070a7d51418a14d9c04c531e73fd70136a82593ce7703d0e8a61bd77166aa725163021154bdaea377770465567a606aa714696c4565fca1d16a980cfc1a65905fc128cc69442614603423eaccb4e91c45ac2f5683a45b51ca9b6133f6da35e2609bf3c82042ab2ca03042c8e1a9dc3457771276868140e3cb638c952333438f2bb3c541d02eaf35b217666fb9cbbcee1a64ed04b19139c169910b85e9b826d360ad84130274818790cbc2a2b104862bc59c5128f28631ba3abc95a4565ccfeb05c34ba2afbdcc925a1c7c2600c8d1b521f213a07054a24e6b9c41832e1868abeab36932f27cd04682a1e1c4b7e300a0b69fe341392eec1eec714f20f70d1bf7a0fe2a3d4664344843b2ffeba7a225a452073d333ac35dc22bdd0b1e2f439426512085b352b7808b2bf0828cca3393426534dc08d0205b98d032e39cc1c7e771466a085440713d6b52629771f7458400a28861c1415604a69fe9885890ca87e0957d5c43e7942fa0c94ba1840bba580bb8b7a11404c44df25109102e19e459b1d321e7972a63044f0579c39f6451cf058a132c64a737480aa39e96207f38c7004f94cc3adb32237142bb403c1ccaade6a0bafb82c6d2d9b3f86636ead7837daa086ad67084f1aa80f273d823a112b77188000a7d420eb7e2bef516b50d8a887ae7a3e93b6f89bb4455c9c6ed3889323958f04a1f78b329047492cbb834da657b92d1b792c67cc601aded002d754308f7941438f9062ad376083145a184363c8323d9423ad8a19cf8c655dcd6c5a25ac664ec2a53ea4a8756307ef364524b72c210a34eab0840929a84d0270c7048b045c546c01535369622354fb7306786bb5fc6d7bfdee57ce2511d25d44d3f3446839450888c54862955560645e8c3acb2f811502c52b99938d41264cd8775d64043ab5072f09a238668402f50350c080b55968964c3c619ac5f81314caeda89591cb34692aa60961f3783899617b89fb1b8c3a16115634015690f1a271d35786e78e40e4cf9b75a6844a86c9b69ea82d4a4a423560e4e106e1ef609cfa560735c645976c42511931d67308d638fbab1922755b162ec8aeaaa846705091ab52da577a481b05ba02a60e0348924d6a0639941beb26acc3aa4f66c42e49bb541c8a1f3786b02ec890fab5475786b8b263dd3d5b4944908f2cca508d41e89b1c32d51ba84f5bfafab02f1c33548b832438c926641a3dea79e0078466fc1149b78257446887177717fb25735ea24564c5558111b4ad61dbff8778c82900714883fe7385d226f2e59943df4ba37d1752ad6494ef932ceb578f7e7c12019851f799c1ca40f8cda926ec393941123ca71cb44c9a890ca08070568044318a48411d1386b80b406d575672231bd949607012b4b78407890e2639869b2aa11c2c91a2a4ce07f1789399afb4603b999f895b36af276d8863e0f372f97bc2de15382757cc324d63815f9031a488a70c94e38a40b48dcb5ae06ce673175b57a7a07d7c6b8c8c642cc858c6851575ba98acc15d09c5d0f7580897c27c59c9fddb1be71ebcd8b64335b2c9c560056d61737159131c9444533b3613cbc49875ba63c3b317560df4e586cd17cfe763bd3e5c9847a0c4f0ab2d34be9fab1afd57a0b5a8a85b360e9251f32d963940fae63e8cf245c5b0d9eba793871afccb50f4035b9788c7292b717939aa28f5094d99ee262047b15e42deb +ct_n = e66b5d39721e9168ae6958942e6baff79da05cc1ba00ac76f49191806b4c1081f40d2ea5acef8813e8ac3fd763e2a1c4b0155fbf5117c35137320a20c05c9e9fd3c09e76919a2b3eae942a25410cb59eee75ae1d60cbbe55fe11d05ef3b5de8c7c81b7df004674c67b8039a580d70582576355914804dedbc4d0ffb21f40acd34058bdf08ab48d51850a26ab79dc8222f3a1be18ac0bc6780da8c1bd099f7384d254adb683e5bba9897260828fec7b8ffe3086456bce9f26b20cc22faf8618ef7b493ae8c940c06cf6dc5b534c2effa51e51e6153bf77aa8911532b70ac2b66c5d916924dd36f3268b09975ed08cab97097d2d268e3712c249f41531e64270d9ef29a44e7db14bf4d51dc937b17922e6dacf3c18fc8aa583e5ee6c1c6752e242306566fb67e06e7e4564e7e3606e7937740006b71e69fd9c449bdf915c80042af57dfbeb7fffd0b5bf5064b0cb63562bee0d4f9a3a6e0c53dbb7831399a0b7207362cdd695beaca092ba797f7b7c2a32a7c012ce63525d534cb7ecad2037e4e326d7bd5ef33a5f643efdad38cee892c76306288b630c622b3c192595e4c1dc3cc581d1a25374e177afb13a94fd0a937c6b63730b986677bf10053dfb07c6c3816c7f0a491b9de173a200a330f2fff37f9589dab5e2dc7563e9120f402da8724ea02016f48d59ff754174ce6cee2af27e581e82abe56729920cfb778f11df83b7048d9eff1d2f7ece76dd839172ac5b7ed17433f4e9d7119d1b3e1b29233b3696eb2f4c57fbcc8e39847403e56c82fa47c303aeec6a9947f6670627d04d32a4a22c667432853c473362f9f65100c9ef01fb33fc2605009d8bad5c7d9581e6f6ebe38e250060f9ef990174073c7b34a7f144bf4263f6b3c240d264c3b203abcd99ceceeed4610060c8d109085d9643646ffdc9e89c86f7e545d5dee4ca3220d4cd04cfc430ed3ced5f6cffbe1962fd76839a76cc971319dc618055cc8e3d41c1845bddfa4677a431d7a1d53e67b99c9ed3775d689dc48b29ab6a2f77c6d8f10d78686d818818a5676806d79846b729b34ede2bf06d78d9b11fad507a2e563d3f0f1b3fbeb09b0a30bcb4c7ca7ea597393bc6373faac724e97db8e9933ea42a2db8f57156557bb0c03adb5e362bfc1a56161602ccf6cbaf93bf2e6d5aa65f89eec5ac7c4351be897694483d4505ec98f31e5fcb020cf2e00036bccafb5980017a2cd0f85dbf05b7ab9193f4a6e01185f85b500a0dfb3593bf692748e1a2aa28af90fbe0a366391ee3c9b05ffa39f6718ba101047963e12f5fe6bd29cb2815d64a34bb6189240d28109da2dc80e26de2f76d8f023bbc04bb6fa3dcd0ebfefb2e7e67ac2d3d074bf63136346870512b8f08b02ff823c1d70b7daa01c0bf72139d6c85c034ab927a3e842b0eaf3ae35ff975d6b062dab4141b0d789a0b659a90cdf78fd2788d973aa3ee6134f68eec21801fb89e9a50ba8197fe8219deb5e04a4d62fc771f59e199157d108759872b30c08dd60d1ac45df96c4ccb7a24ad51fb5dc60b8254bfd8f709ea325f9c63942754a3f2792db3fa905a5f814e91c1b572ee826f834291529057b437f78f99b88016403e4fc83aceab18b0aba53faf5e3403d5c1e338e072fe5ea513d0c9fbb0d3071626d40b13e718dfd00b980955f6d7a5da62fbc1288965cb2db576fcb9f5a0a9ca1bf875fa1219782954bdf1e3603109e59c622720ea3ea10adec5d5f1ec841ccca50279d2dc6f275bd089009e6d0e2bfed247380da0805a1d28f356552c0d3551f8a4dd7a5e4c6d842ebfe60d1aff0ecaac7b19e39ce16ed705fad4a4c2237535986819d1b9654dc838a5e145d936931fdc1227b5fd6add694f9662e49ec63863db987c9320b52bd14cb6bd4d64a92be53ae17c3bc3a44f0b11c90171ac3f9a992470f3ba9ade84a85deef17598b95974149b3dd4303e7c36b0f008547bc95388a6cdb7ccadd085c7424f9ca1b3451983c207c8300346f987bbc196f58c41902175b2ecb89b8216e499a2b884c579f9db1301bbf4c844194ad9871fd7f210af3d34c1ed725e4a2a613ef5c06ceec21b9248b95a476e0a68454bf1a306c799e2ef5910c6cee7a44cd7eef74bc3712426e18e9df669fcd87a914bee92ea0df16deaf528d63c97c2cba435750bbda33738a70c5248bc66a4e859648225755e1a398ae159d3318e53d704b45a9e5b4aaae31b85 +ss_n = 1cdd46e0bc9f31350fd5d707221cf6b41d940a8fb204a63cf92b30939c336a4c +ct = 805c5c756a2070c6e2f68800a28fbbf0aa5fbf22cdf0a6017900a8e254a564e462beeec8512f2013fd69c90cc6abc41285004f5938dce204dfb736836d0d3bb2c0ed2920d19d2c6bbd3ccb133765cecb82f980b75a7c6821bd0137650a821cd1bc78a42ee0617c680050716e67a13df9981e3e26532d5dff7745f8e5867730104ad488b1339cbbe21bcf1fa27b2a0db1becdc4061fe15c56c575bc99944045dd25ca8fe04d6b337db251642dd585620af099ac7e4678cfa1c725da672251b3096b67970e577e6bc67397fa905281cfff112c3ecf1d2929177e18afffccfc78ee2f761a731015c9a4a53a3b501a8fa4bb4e6c1622ee24f932c38302c7c96428dccad157905edca7e0ae7f9c8ced26872bae0f9bcc47487823f7cf69b711205e64fa98ec4eb286d256634c3cd127c710bf527c9092b1313bc40adc00144c28e33fafe4a0fc1fd23d6063dc59bfd79111480e60d39a3e3c28ccaeb1041e7ad74c26bbf255d718fcbb8f81eb4ac3fea9dea647e74f4ac4769c4548531a51c38c25635b7a9f94b500f33865234f08308253c8cf900b08b6d5f43260b9147b2c7181486d7e4c3b786352adb7d2d9dab1cee66e3bc7d150e28a78778833834ce98efd6bdb851182d3144f50ee75d015bb84fc86b59a4d498bac0e7c58ae3590052dbc42289c0a05b59c8e7c2cceef3cc8c8d61d0406f823ec8dd014eb66274780d5edb0b211766af1ca884e8d9ed257c5b6af622504c310ac7f33bd46b3bf405677fdc69d622f22ab693ca4b63985078d7864973e2ea6d8118a61fe2bf0bd7be0f26871967bc83c8c7665bf1a7ab1743a12cbc7d6d5f93e05ca46684e7b566f60b0b545525bca5b04113c2f8903ab1d172f58eb370892b46044b8f9fb80c9b729a576d5ac132cb4d3eba698f7583c056a241e7fabf3a6cc1c2165371ae2dc91ab55826bc7ef99d0882d3e7d9f924a4d5d353bf901ce74840f27939eeb2ef3eaabf1672d26d15b4e778603e88dbd932510d3d40bd8a3aa194585a925317df7e6834f55155ec8bdb985709fa20c90e7dc763f41f8d5ee7e1a63e40371ad1a894eb240190dafa18dd684bafb812cc31dba9509a053677419230ce5dc7522b4f72f2f92eecf147484c6cce4bee4b3a9080d4a179726269e662bb197e8f00314e9d4799cc8ca2c25e106c535abe467e32da5d993039ed7900dc0637d353232f48f2603e16b0357655061e6113537f4f856243131d509db047c1c6cdd1f28d6f4c0a6ea861d20cd2172b64e1e92eaf836b75055e288a0365a313785078ca36cff9f0dd3e6768ecde057c6f0137bf3f674bd02ef44b86a095cc0acc0cd28145a5e16f5fb48e0a79426d90199bcc7af0bbef4a40fe6d1d5b6932ad9d5faa859cf4c7bbf3a928ae1edadcfa6bc294bf14a49ff82f2eb66f156a987034cec56daf5589d146c5d1fbd0aeae60ebfcbcf84f9146f9f481b0603db60a312483bab4f38554f26fa4ac211117901d28064455af9735ddf2e8891c588ad5f9fe1c3c2b8ddf59e414bc6917f7fdbd604ccdfa1f91feb8e3d6d34edca8f10d57dd0968e7298c5c718c3a721ac26cff53af7c9797e4ea1e8f1217391e1bfe620ba89e520c3ad5a597d011608cf4523f73e603c78060e1c1b901ecf389cddbfe3aeb8f9fadb6e2dfa0975eaf9e4cfe782468381d05dde8e29dd4d637ba236437db89c0aa293ab192fe76d7aff42e2ddbee858c9edb5ab634e2e105143fe6218785ae52f0da198039f7b7cc6116915978c6105d8fee413b507fecd3c5e9c00f8b6aa668ed52d14b6c52680a006ffe7ed834e7ca371487c91706696b649bc3b1afa0eafbe1a63f402999bf0a824ae284ff4b15351bf632297882c4ca81ef6cc362516644214c39103899c31ab39ef5b688a49d2dfd71b6d3490ca59febe7d3f6fce6461ed33c08e196a60548306a02c54c8cf06381ffc5613090a6aba7be5519f7c4f3495597aa569a08112e6aba22ad8f71ca3550144afa3877f982a0849b2ca7484f3717daf0daf20ef6eb9b7a2e7ad623a110ed60f51239173a396dd514c6e72420b852fc34f2a4a00bb606aff73afa3a5c8caba347504eff6bc111d71b758aa18e0e24e16c761db651ce5441151ea636a0ef7d10ff424a2670bcd7684fa3a7270583cbacdf19d6a05b52ad7bcb47e4ce9c0a3b944c257b16f6fa14f04257939ba58ba6d2846eb3844518b8504 +ss = c7b9a61c3dc45286c83857f3cf188d198889b940416e92dc4cb7c6e3358b73b4 \ No newline at end of file diff --git a/test/vectors/kat/kat_MLKEM_512.rsp b/test/vectors/kat/kat_MLKEM_512.rsp new file mode 100644 index 000000000..a3ab1a0a4 --- /dev/null +++ b/test/vectors/kat/kat_MLKEM_512.rsp @@ -0,0 +1,110 @@ +count = 0 +z = f696484048ec21f96cf50a56d0759c448f3779752f0383d37449690694cf7a68 +d = 6dbbc4375136df3b07f7c70e639e223e177e7fd53b161b3f4d57791794f12624 +msg = 20a7b7e10f70496cc38220b944def699bf14d14e55cf4c90a12c1b33fc80ffff +seed = 23f1c88bd0e65f2c891ce865bd3275a7ffdbe4f9036e75b96aad0412650e9cd2ea4591d4ab7131ea971b34c23a4ed245 +pk = 80b70100831d7ee168f47392483119f93863ecb0bc605312d35728876b00f5f57af4c85eda97281d574390bc7256193668dc98625354ab52b9bce781c5771cc26099f6fbacbee1784d194887731f097c87e082cbeac57d30b7b9a293872c841466f2244cc65ff4ba653d6751dfa22051d553369942c31c29f91307af573292d697a8c31612e07b5335cf08329fd246bf2a32200a8cb0c4b03b9d09c5ba1c3919539e9229c696924348282f696b1525e5603806b4db618b3dc8630cb286e4311721bc5031f257aa925bf80960445aa8d8e69788e99da95c1d10cc3be858528db0cfea003c74693780a65a36e62843b3be15406543d22d83507c87b2786792c80fa5628454a310394dda4c2ab59493850257d6d3bc107186d9062707f354e81a1a10fcb763d31a4ec409aa243ed2e59bb189855eb1656266bb37500785ea08cd88c222a8c53a8777cab42c9c238a00d59369425026e99d2ae6040af6709029ca8789c897b329fba748d69c8a7148c95abb0c71787c58f12f21f2213e389242aa7fbd320c12ac42c611606cb8c1d1b4625886a145a535bd65bd0d996b330c1657d61a87e90417003225759820a3bbec505cdaf11193229aae173cd12bad22a7a30a76a9fa7636c3d5aa48e1784012a012f14168b7853d2a16f90ca02cc33b2006c08f26c15fca29612cc792e1cf02e1321a75a810891986667d4148af36e65e1a592589029617734c315c0e39b7518c8660cdc265d0c813ef20a043317fae5b8e40546eecf71d6c054fa66b49401309bef30fd51a5519755da9104689b26f0839154c847bef2365943c0249483aad9a7367c980a3d1ce46d2008a15275ca3bca4834e6f9a3036c0cd80ba228d34b9780244d5c0cbe907c6fb43824a9c0746471639cb86188c60c3b253215cc91692bcd1493d6a444d536446e02968138001cc287e0e518f3aa25d8c3b95b3c35c59f4819d484976029af05a263c35336b261f77b2cdc29389f084c04cbb370c48562b5b50771c0fb816908e198dd6d53f76e48bf042c2b1f82a3a40b8daf51f46d76fa4bcc9d3c894ff850c0faa32e0ac33901a4c79139f5f20417ec1a190607044f18bb824cf350c78ab3ddf3c2c86ca5543f715 +sk = fada6a79a379d2cb36c856450c446f4484b86a560c6170564d002e4b74073f66a6fb6a57bce1be92a1a1b531c61f50882a0084508542a1e1c3b3a950f2072e9a16544e46ca20284b6012a62c697ac858615e181e1ea0b55b002119090b7b871920e9b894b07a281269dca15faf4a09b0004cac61a2cea73f28057dbf1219d07747b381cf0de52abad30ca0f57873b2bfa012bd5bc24805f3657ad0ba6bc4988cd9c6de492c0d433ce5aa328bd6c6cb502463340dc5e029d2c8713d780f31f441c24c4000e56799a6bc66b4a193c73ced560f8ae43f9b2075ceb778976b7f111acb38a306f2b70a2bd8752e828086ba0f3e811a8c3b0d5f8b9072159e56ba1e1008009195af58a85a3e271f00ac25ccf3233cb8716768ad98e7b1f2890db6170f2b614f56c1933871ae1a413024ca9a2137795c8a2e9e15280ff108aee328235751e569ca63a7821f29ad26706b231224d95160bd7522dde0bfe6e0a8261974885a2fdf217f8c16c4f67c0e9fb2a2f7030caf881d2c8b2e6a6863906192108b004260b0adea07c0b349d588110a9cbb699b3952bb112cc7c8d9a759b9554c1f991ea1f51f4c6178e43827c5149bda077fbd769a3b818df71a42860783fd233d1b26a96a573e99eb915f6bc18d813ded14a304c1358e470570d25478a6b6ba2ac5612890b5a569e5263342459cb9ca7674f228396954af748d9d50135342713904cc59106e0bb21942b4066f86bf5d9c3cf1b6c08692c5b9881b29971088a8b415e26c4a2567588b2ddfb68d11146fcff0b4cb79c57487018c25541d3267a10640e430bfebbb4f45a799c9f554d1b69d70c79d17124f9c01cf3ad6569e77a4e1b65704701006452f45a72f3298c660820f1c206af700c9a621923c3911cd518e022404c870c3d3b3b6831a82536a3170334e3159b0c959036c432cf5b484b12c75ccc3c96ce328fbba79e2f724789a8d27f7af8bb08645d2c9a3e87f8042c36227194a3c0e14d09129d069d5379dbd606565d915a3bc9882e87423a062000a5f4c5523ec9447cea1643a97ad33c1986246ad91e273ce32acaff45335996537072180b70100831d7ee168f47392483119f93863ecb0bc605312d35728876b00f5f57af4c85eda97281d574390bc7256193668dc98625354ab52b9bce781c5771cc26099f6fbacbee1784d194887731f097c87e082cbeac57d30b7b9a293872c841466f2244cc65ff4ba653d6751dfa22051d553369942c31c29f91307af573292d697a8c31612e07b5335cf08329fd246bf2a32200a8cb0c4b03b9d09c5ba1c3919539e9229c696924348282f696b1525e5603806b4db618b3dc8630cb286e4311721bc5031f257aa925bf80960445aa8d8e69788e99da95c1d10cc3be858528db0cfea003c74693780a65a36e62843b3be15406543d22d83507c87b2786792c80fa5628454a310394dda4c2ab59493850257d6d3bc107186d9062707f354e81a1a10fcb763d31a4ec409aa243ed2e59bb189855eb1656266bb37500785ea08cd88c222a8c53a8777cab42c9c238a00d59369425026e99d2ae6040af6709029ca8789c897b329fba748d69c8a7148c95abb0c71787c58f12f21f2213e389242aa7fbd320c12ac42c611606cb8c1d1b4625886a145a535bd65bd0d996b330c1657d61a87e90417003225759820a3bbec505cdaf11193229aae173cd12bad22a7a30a76a9fa7636c3d5aa48e1784012a012f14168b7853d2a16f90ca02cc33b2006c08f26c15fca29612cc792e1cf02e1321a75a810891986667d4148af36e65e1a592589029617734c315c0e39b7518c8660cdc265d0c813ef20a043317fae5b8e40546eecf71d6c054fa66b49401309bef30fd51a5519755da9104689b26f0839154c847bef2365943c0249483aad9a7367c980a3d1ce46d2008a15275ca3bca4834e6f9a3036c0cd80ba228d34b9780244d5c0cbe907c6fb43824a9c0746471639cb86188c60c3b253215cc91692bcd1493d6a444d536446e02968138001cc287e0e518f3aa25d8c3b95b3c35c59f4819d484976029af05a263c35336b261f77b2cdc29389f084c04cbb370c48562b5b50771c0fb816908e198dd6d53f76e48bf042c2b1f82a3a40b8daf51f46d76fa4bcc9d3c894ff850c0faa32e0ac33901a4c79139f5f20417ec1a190607044f18bb824cf350c78ab3ddf3c2c86ca5543f715ca875d7c7e8501256071ea518d2f185b05626aa3d1c38cdbc2d006ed0051aac6f696484048ec21f96cf50a56d0759c448f3779752f0383d37449690694cf7a68 +ct_n = 96ac6243c9b1272be77b975a4048bf00ff2c48f94a3483362449273880d45e54bda15729682bf591a74382a708beb78118cab29ad74ac2f405ba720076dfb57188dc168487cd20081f6bf412f257dea03406b23a6a752e478ba4ef9c7c0f4810921fa32545be64dc5d9f18d4e1320efc6508154cda35ab912d059e0291a1150ae0a10da5e3d7bd221a851c598df4d0b18daa920976556099d1c0de4e222d5304d44fa9cb9bd4ffe15769dd6c4793fa809f5264cf0febca4b5975ba287639783aa1f4b645ff7a00d46ee7b19fec17b3e83bcaf4361d5349e30ceab60c386b6b0d1b90d8b336ee6a627ad2a38670cb5113b0fb4ac2ddc4250097483fefd182670ea40f0f45cce90b9ed58dafaef657d64e25fd6692a69721994e7d00b4949205ebe4c4f9c46ee5a1018b220a26d80ae2d2b486372e974d75b20a005b1616ad1e13d162915cc24f274670d1e5e8bd345874a7e7c9759c8e43ff33689200739a613395f7ae78d73c6a7b90f65ab511f0df3c5dca85d0b9430b4e97098715ff823b617321799aea0ab9c72234780339ec7b541d5e6f8c1551146c24a65411811b23674c26123356cf233351382c3994cba5dc6c25a07e1ba9af33eca18bba3e97935e3abdf07e9fa32cecf241e7cafc6592db4ee487ff2b98a4a47805dee17fd93448dc98457b753ed4995ee6b1bfa9ff1d386c91f396ca8f48cab5b09a782ec3b616a87a6448a96236c4655413af755323d36a8db2e16509454489e6ec83629130cd2a54817918af362c83183494b4b590dbaf69cf399d3e2dc3e9c0c1224f148e65ef68287341ab72ad58adfc69b28e27e91ebbf830fac53b94f762f01cc9b1561ae35f16edabf51ff164c1309d1fdb52cd2bfedb5a492eb65cb9fc86b8f05ed26d13233fb0a3eb33a9dce2cf98e6516cee42fbe1e97e20ab6c9965f58a377dc73e530667ab8f45e6a70b23db50f0df411732d8acdabe50c51adb886c0e5a5296d4aa1b13a336f0c17812f79fc69418a7d8901c568f410eff2af74baaeb8336f46ca17e14e060ce2d45cdb376286eec8b8befa5ab8025802720a1e7393af579db13 +ss_n = 6e5c522a6d19b86c61bd983b56a0bef351c5ce716f021b49bdecd7bdfd5ed55a +ct = 917e59d1e182a29648a61955a154b304a842f458eba593f3065fb7d744fba24fa3a0d538854e32844db248d48100c389c4c4b3ca6c234f2f61a67932aeee808dbfe98d896d1e9668820965c6343bbb4a4de64b7a99fb53b5264e3199d587ffa5e0479f6b7386b23cb9c243fa6f5457fc97dbc96dcc039bd6c4e7e85a90b5c5232416434ea942cc71134bb9a2f4991e0595e3487feabac479cab9510d57b86250ee7c96a67a9f2c6121f7daa02c5cfa3b23b0c732c2b15694e1ccbac82b787cf2118d08425cbba121882217940c894cbe47aae2541f5c6e0bd1baab31fd2b2ecb34b9e693f6fc0fdeea906716d08818f51df0c4694029e8c3234be0b62471b2769d9ac4ceb947602380f3a497b2a01ff7b8746c1c7ae81983e016bd65c7cd1762c191857e41c2321981f6c7aa8d7afaaa9fa0b557ec1ec1285f8b4d6c788aff159ea5862e814d0825c8834b7ca45db7c8eda3fa6a6a7b8a40519529bf74b6a0f80c484917f40c107d182bce3e344fd36d1b377a982f6bf2361b8d662875c166dcca73240b86df5ee0fa4231b356f0cdd6b3170ff89113db0b1b9dd264335783222cbe7be844642b0b1988d18b268da6f78cc944f43b827143c4dc5ee1f0d658b87b9c00862f263d6f5798fc82e8be079a1108defdd4c7863c3147e9bdf0fbc84deba215fdfb9ca4237a8419b26fdeff63a7f95c442bce67966ebe6b5f9af1fd2a7cbed648ea7276db742dac3e470f6cc741d82e77e9c0dd019b5458177551975b59633be67b35c0d430b725524deafdeba6d3643c5c82ebb52479669c411bb56b397f8d37b8f7fa4ced0316546caaee419c0e7f1d96a0ec614c6c9c8e03e010031765121f1eb8fd549fde046a50443ebab9fea2e78a29f4964455928db1f9e7820e533c5712989b3a3637ea00a1de3e469a800c431d4df243c1dc7d6a89ba7900d52b78bcc103474f9d2c2128025c3193c4d1a09f50905ad2de7fe8e09f047e0e72e6dab0edf7e3b08ed1316acf857254b6c1fbf64ce582f2990ccecf9505fd7e8517998aaf583be1aa641e9b54dbb91ca9d0700913967fb0349201b5d679b32d +ss = 2b5c52ee72946331983ba050be0f435055c0547901e03559b356517889ea27c5 +count = 1 +z = 6de62e3465a55c9c78a07d265be8540b3e58b0801a124d07ff12b438d5202ea0 +d = d69cfc64f84d4f33e4c54e166b7ff9283a394986a539b23987a10f39d2d9689b +msg = 0121cb32acd1871135cb34e29c1a0e26ccc001b939eafaacc28f13f1938dbf91 +seed = 6fb79c668eb6e0f65a09135cdd243ce205d7065a0924f86024adcd111f654a6dfe2e398a12369064c2a217229113e570 +pk = dee78922bb8da2f4764dca45f8ea4c1f530a1c571d3ad1924b589698cb2719e069fd943c1452c5d168b2b357b265831c019cb3557a0bf7187e4d108bf770c74db40389cc718f3bc11ce3aba84366ab245194b941f81b7ae702419bb98d73ba003783306c7b3a3677a543a0100c3175e8c020ca266512909c3550c4f65c0ea3e24a47237d9a4a0b5ae588f983311faa36e891af8ea1b308c83179246154c765ac5b5a15456e193308002837d14354e066a34a4409afbb15085aadc9e22b8db5583d45b0a4ac72474a2ab94b792e531ab0cb882c13a4139a71ffa3783b537178f34e111b6c3f120a76d4cdcec461843035acd285ed627d8bd2b0b997ccceb4adae3615a73bba0a7c7bb9b13358bb51ff8a574d86b5000272cd270a0a1b24bb917506701c2f441fc5b79dd451cb3cacc740127bd411604bdac464da1a2f83918c5b2fb6e5284c972b93357a837828b1132632bb6f7bfbbec3d947bd403d86990066db6553722434c7c0e3992f009bb238f7a6b3e5251eda943a7703fba289aa2053a857796c2cb945494c0ba791a9e3cbfa800d8988c8121997d975b3d03595add64a3eacb8ba36a4d8b3bfdc11b7d56239087c90f352c0eec40857f089ccfa7c9a683a1de3cd8ff28b22153dde231e5f74805d683eb8c346ba16c7fe68064b2059c8738e5ac19b64d4343f5c9d8bf9780302b0676c202a21292cc15fc1589a69838ad1ea3d0c3706f8e1b011f61299a56ec2515051fb94734b308af3c35e45abfadc128fe69838aa37080514d6c3748c916bd655080a1035ff1a763e450b56864cc232afee53919ff889a820a7a6558631b88f7318c033800f307c19b2d0a8b65882d8770979a5701ac602f71b72a26b82525aa67d77c75eb6871dc019b465583a250db4704906187e8dfb3b70726988f9c52c12266c6391d4926cb79978007ca46ef60882806ffd59c64ed70333989aac5186990440b89c3cd1363be404706dbb63a5a007a0fac261a0288f916faf0aa4e944552f10801a3a5dde263398015cc35227bd1711356251aa935a89bc2e3d2c08e1c9a8c1e4416f303bb73b314858ca4c210c959283fc865b027768c5d6047fd36dbcbc4edf3ea5cc6a50cb052bcd31 +sk = 9a5c3688a0c2e3e6b14804a90447c71ec65fbbc9c45a1b9e58ba552223176f3687c12ab49af96a8290326f5c1d6e9a1c83eb3525d81e35763656e488dff37288662a3bf799dc385b8e04aa3546c283c20bf8c605faf72849f649fd1284526282c78cc67f58c9a2d14f2d294812206f91fa93b0369e54c4a38b5a4d550b95e520b7d5dba904a564e37937cc850323ccbce0d69a2b8840e4c459d97c72139a2c1990612f90adc2d2aa7bc84d16e94271574f9c1736b9a35516575a152a02e538150d6c9d48c6ad02f6958e1cb92270a01fa1372ef1609f928039712925fca69fbc835cd240a3a18b0cbc1432b1cc7bd3aa151394c46a0d26385aa243952d9357c06360f5b37a945c26deec919862aaa8f1b502416259411feb2cb275617ccfb198c315170a13c52302203d0ba770f5c52f31394a12303f149e5b45929fc33b49e277ba45b1ec390cd76a96404439836558d9c7007eb42e16c53d9c77caad6b1e71cc0289b44c9bdac9e54156e9d74473d630b71a473937b6c245aaedaa4236fc53ac919e8a895f3a839d16932b26a1a7688ab247118eea16a258f367da101aa5c9b617e2b7cb905857f733d3c3bebaf9bd80b8c92e06ba453bc84ad5c62d475079b9569124ba897b611d44111659c8eb938463ca896569123bc32aedd637932b495627a9fbd2bf15e77b9fe2ad20845fdb04bab1878ef7c71973965a42d6ba16755274493d8c99c39faa4ba6368fc93460d734a666d374c807b17b4bb25fd5879778632b9468efd1139c4a37a7cb0a87ca893bc914a3c4a0f346b157ab331df30b5995076a503ecb586eacf675111866228a14644518a6d103c2747f18d09237dbbb515cbc48518ed082710d1a6af9714c71c164bce61fded31956806cd941ba6d6c2a5944001a20000fd46f8589443b211014898bc69333adf4bed3b06f43538f8039971762609fd2746595b5f7f348e631c76dc1c63c147540425194981b5afa4493b4176a87aef98a0cce843b1db9036fd9504d60893d19c13471b64f6095c02c522bc4a21a9c836ff681bd507995b26f4ca90c1e188ce8cb08f12603699892dee78922bb8da2f4764dca45f8ea4c1f530a1c571d3ad1924b589698cb2719e069fd943c1452c5d168b2b357b265831c019cb3557a0bf7187e4d108bf770c74db40389cc718f3bc11ce3aba84366ab245194b941f81b7ae702419bb98d73ba003783306c7b3a3677a543a0100c3175e8c020ca266512909c3550c4f65c0ea3e24a47237d9a4a0b5ae588f983311faa36e891af8ea1b308c83179246154c765ac5b5a15456e193308002837d14354e066a34a4409afbb15085aadc9e22b8db5583d45b0a4ac72474a2ab94b792e531ab0cb882c13a4139a71ffa3783b537178f34e111b6c3f120a76d4cdcec461843035acd285ed627d8bd2b0b997ccceb4adae3615a73bba0a7c7bb9b13358bb51ff8a574d86b5000272cd270a0a1b24bb917506701c2f441fc5b79dd451cb3cacc740127bd411604bdac464da1a2f83918c5b2fb6e5284c972b93357a837828b1132632bb6f7bfbbec3d947bd403d86990066db6553722434c7c0e3992f009bb238f7a6b3e5251eda943a7703fba289aa2053a857796c2cb945494c0ba791a9e3cbfa800d8988c8121997d975b3d03595add64a3eacb8ba36a4d8b3bfdc11b7d56239087c90f352c0eec40857f089ccfa7c9a683a1de3cd8ff28b22153dde231e5f74805d683eb8c346ba16c7fe68064b2059c8738e5ac19b64d4343f5c9d8bf9780302b0676c202a21292cc15fc1589a69838ad1ea3d0c3706f8e1b011f61299a56ec2515051fb94734b308af3c35e45abfadc128fe69838aa37080514d6c3748c916bd655080a1035ff1a763e450b56864cc232afee53919ff889a820a7a6558631b88f7318c033800f307c19b2d0a8b65882d8770979a5701ac602f71b72a26b82525aa67d77c75eb6871dc019b465583a250db4704906187e8dfb3b70726988f9c52c12266c6391d4926cb79978007ca46ef60882806ffd59c64ed70333989aac5186990440b89c3cd1363be404706dbb63a5a007a0fac261a0288f916faf0aa4e944552f10801a3a5dde263398015cc35227bd1711356251aa935a89bc2e3d2c08e1c9a8c1e4416f303bb73b314858ca4c210c959283fc865b027768c5d6047fd36dbcbc4edf3ea5cc6a50cb052bcd318da43babc9ad69b045583ff680047a5b489b6f8a241f748dd06f4939b19efeee6de62e3465a55c9c78a07d265be8540b3e58b0801a124d07ff12b438d5202ea0 +ct_n = d0bf2e1d6851378cb5de83ae9b443234caa01ba58535242d0089a744c4b12753ff8442966bf563f8972cd0426e815a34883f740c6016928ee070291d8efbbd326088f30d50550b061ccffd9922e5a30468b62a0ebcbf0aeb74f8dfe3e130c2b1ba83e47075ad519b94c21f3c06078f4645d5444b41127dbf8ddc67a8cf440abe95ad1d586a29ff3d8a4d671b05198d2e2eaf06d7f0be6c550f1c544681829632e98cde071b1e8681c78a98081930d1c9809a497cf409bbc67d1d8de8b9a3e8f5ebea8fa79538d65c0176ed2034d74fcda38288c36c6b5af134eb9e60ffbf138fe5d6c0378ee891e69bf5bfed3b1614d25b58d3798a7eb3dc7fe42f1fa3e30953d92e79d418c741e659455a618e7a5aba4f59d12e17d057eb698f3c2f9a6b1d4e581d09a9d6c1da5f5f0ec69f8463d922b185256bfa5c751e0321d02c58e4284a021b1cafa50f7339d5a5b602ee59bad99f09dc0e282dab539cbbf970418dcf302f2b47cfc1e97ae2a83885b7ef6b5b65e662325644504338ee139ecc4b4308cd8aeceb0e9b40affdeac0e02795b54074eb446b85cb4a57122079bd7c34f310d1260efbab0f4a7e04ce438d624e25bec7e0061e253c89d57e84bdd44839343f6c4d858edefdca4fa794db91d17445c5f58ec08b5bc58cfeaacb953fb004fbb8f7b1dc1e1b5622be612fdfb1889442cd8aff5e18a75b02ce6f4ee1efbd96ddf8d02fcd2a42bfc8997cb459e2672af4231a75d59dc678a2185374bec3d98504e6e125a16e58f42805b12651478a1ce8df3cae5b0e0dec53ca78b2c38b64d7dd7c9985f518e02efe08ce6ff9b4cc3c521b3c1c0ac40504687af68708bc27946704eb4900ecaaf41777a223f1668a69c7047e9b863afb4ccac039334f58dd132bfd5534da9d45e640edd9e88104ad0455bd2faa383d35c0c9ec5fc6a6324bc1429c539b0bacdcccb55121f247f75ca6068ca915e16d13137fb95eae128b04ddedf9a0f4a17ffd5f2325008ae121e21f9f4a64b4d806ce2d93135968b3129b4deafbe07bd6be34de1a5adebb3e0002556a1392c77a23e4612061ec7148652d702a6493 +ss_n = 7608dd95ec12b13dbf1785d10622614a907b3c8b931697212d9bd0845eff660d +ct = 1c43de770e9cd59846b6f81f9c61ccd837978e26d32c330d509d8e29d9e7fb1a4fba52101e48880d80616e533aac591febd393cbb1282de153560d4373cb882c66d307329597910ed3ff105840964a640bc762e6329b9f3ba41a9ec31e04c8c9efec9635e0a9b456f619f10658bed36a133ced0c230b3cfdd8073775d759492a7e3be0ce27725eb7c2474c568d039243fe810b31db2fce8ee4037306a5a9bbee1ba745c2b4fc1111659f5de919941c89c8cc661ecaaae3e9610eac66cd4128e3d4bb5abb38837d996db7e5c31fd09222f22f854c25fad8ae12ded3e337c3241468eeebecda5dd682e6e57f51ad352858d04048a4703adc135263c47b3a5d6e6c595ba1ea0602bd34353e191bfdf36d56b20539748ad61c66c250e07f2e3c6d60894472fe7e677c353f70a175f04c60f69dd921e9b9249bd62914405829aefa052c929cf23aba067a7eb7fed0c15f401ef5084a97a61ced6fbf8791487231c05fc23a387c77c0316538ad09be82b10ee8f8d6a9d979f63a2ec2364f0867306e9bf6e3c0388496bec8ad161515b016e91b5ab4e4ee9c48f0de4950aa496b3bac3abfa86b9cbe27a92ac8a817650b2c4c536eda1d2ab58195cd423e0f4afb5bae7101438821b89a99206ba5fdd9d06c39dfd6f06fba8c7194213d0e86f80e4e5a24977efaacf7ebc02b028cfc9673de6c8a0cc6ae1e577350935c912ce1d56c670875c4d6bed8750a9efbb450791c3d560ce510213274f7d4b3b88ad9967034751068580a9dedf0ab3cadbb2f3bbf3719ce73e938666f2a7fe82f10f08d325d203ec0b0585b582216b7fc05a7291481d1222791385b6416e807e697026be218c519c1b215842afa0e58f988f88f3d90cf6cf42187876bdbd7be0b2c261b0dd36d16dde6ed8354bd7432b66d10bcaccb69c8944778902fc36dc70f4e6385b9d59aecc6445ce4ad65bcc958e886a92a1d4d175cf354b4fee8890ea4ce21f5e831f6905ae528db3991834a2452f591c3ea88d7612a599a3014fc8e10b30d48398bb8991c0ff12a7356645032530d818d8aa2500b2521a73e18591ec6ef422daeed66d2 +ss = 63dfb842bf767f89717839642a9b92fccf82bf46a9f39ba1a3292995f3f934dc +count = 2 +z = 1eaae6bb91b27cd748c402c4111140d5a942cf3c95ff7977f88d2ef515bb26d0 +d = 63470357110828f25b23edc80ed280ecd398a9f53251c3332754de2af0b15e90 +msg = 34b961af5d6254af72c0d50e70dd9b4991150ccc09192aa46f1953d5c29a33ec +seed = ad4d2d306639620afcb3753a137f89331836a5adce1c40bebe77b82d43a40d3249000c7aa3786406d5d5fa65462d1a57 +pk = f5e24e4e14b6653665ca0289a3728cbba228fe116726c1251e9992a9f0060934645b262324acb5c6b57d26e39226e22cf0c33f7ff5a4d979234f2b7949f566db66c35b273dc9778a64f2bcfe914c0d81527d418a112579e5d08b1c429587323425d7a78351453457cd868345afa16218332002c95d8406c14938c039693d6c1216afb9983099031109be0193a1b6e12436103fdd084a7b84380acc35817831c0558d4f8082ba58b9174841a840c2964853656c2327f7952132c6dd129dbf5023ce1b3a92f7736fc19528b71d21a27c3d7b7451d5a8fc02a786f75545d2451549bc95dbbb87724f72d2adf1d619b1b94386c14c37128c2c1c60f4c02b28cc536c508a370ba9a2f4618cf1c64f355684f25a6ee99d3f89ce0136b47d7b26f0e6a60cc94fc4573834172a3efb84c9fb66401b76c90007e8f7b19b513292138b79147a364680dbcb211762358cd32a3c44720df6ba22dc8d3019c0c4803f2a567d9ebc6a5bc012d1f634719891da1324eaf228379264b3da955daa3a2fb8836894c8e80006782141257c254d905a238a6b41ac3c76cb87ea342728ea6e48bc66816842ff2455e85c67f8c48874f469bda56fdd83a57dd4076798a3d854ce40bcc6b349a198fc6fa4713c94794946e249201779709ab7510459e2fa325bb3c816b2af3d9caf36fa5c217379cfeb797a9080fe23374fa02f047c775cb4602b7859f7d79c0af73f11b42847915b3d3246e1044031f61baad987f3c6cc93280b23c8390e48a2108092c7b419bae13ae50067813a99b5da80e58005c6965ffe453ae573501b242124515257c406278c2f7f394574894445c612e4114f0a60404cda976fa63b9a285781e0ab3d77ad2b002f1c885ef746610243b751ab4bcea388027c41063b01679136087364cfdb1392faabb9e20a5177b94bf5a393b7bdd83a7d82343173b8781b44334484354b7179b225aabee99f230795d1fb248aa5615e85c0adb49b7f5104712b86d4034d457975d41b7c88c0664e091e47e9798303c3901583c13606eed7883a537ac0e147068b8c4ac056fba108ff1083a9186ec05b338627a8dce43e5c41410cd6bb35a330d20b77bb3a9034b4e3c443bbeb41b6691f11ab11 +sk = 924966384661573c02149787d78c17609c3959f9c6b246ab30d04ea75c95064a8369e8c5845ac38d13865bf5b0db2802f9b52159938cbeac6659536066d51657344ccda1163ad9c221cba444d4ca5f4b2c5f19cc2e5133934959bdcaae1072448571c1fc64ca278ac21fb3cc8258c8ee8a722841397f34cbc968b45bc67bbc6c377993bbbec9b63ad02c0e36c6343c6f16557405631ceb099bccf47760531671cb1ad59160c1199c7be7888639b3d6172b0f968dc7c8c14de6425c7a6fe075ca1f897a9f190f6216461d58a7535b3829e27218f17f3a437e282a9216c33a8cc03affd846cf433a4f263495741bd5d517d0237cb52a6f19b352743b9ff248cf06e1282c0c1dc9105f2f57532e87971503a8a6071b51002e9e39ca27e14636745eeac3611e589b7d6592ba878b3e8c229cc71e30b8583143bc2c516d614bb4b5e41abbfb521e24bb2d79c0f03684d6bb1c33c7b7c334c0ffcca3a687ce99fa57be6113fb09a0b8fb8d58d87886abbc5b6c0482852db9915a74bc3dcd394fe215ce5e7651cd4b425947b61d3887d4e42155f50afba48a51c0333a4a2447260c5dd347e16b899f297166c9262c6ac03cda47489bcc4da3c8934b69aadc28d0f93b3767bd02fb03cce534f22b024e07709316cc7bd0a118b314423a17be6a302c543affbc8a6fb4af5c22a71a7516b4132784c3632f811fb5005dae53041ff0ad98d48020351b0807692d563efef08e52d107e49c0d3574cd208541fe17456da33cfd08c0bb6a7182b39af7fa02b2ba02f7cac8338ab05366b9f85544fdbb2aa4f790742a6dabd83c6bfbb4247317fc7635cf27ac0e86afaebb76c8d0394cd45a64f2a7ce353f75821fa412c31d2c8024fb18e14c738881ba30c521fce0ba887b03b0993d64264b8bd801d569a096a3a7945789018952274915fcc17acba45d6050ba0bc8ad0b231f6ce677a934ce27767222f04ea743403427674539a006c81403a360fe633b6b4085004d8a6c91cfe1ca8f7023115d95adf0d10bd287a900fc4ee1da84ec05809bf673d16b7f8a6a024e49678b0c622c8b6a8c7553b30a44596392f5e24e4e14b6653665ca0289a3728cbba228fe116726c1251e9992a9f0060934645b262324acb5c6b57d26e39226e22cf0c33f7ff5a4d979234f2b7949f566db66c35b273dc9778a64f2bcfe914c0d81527d418a112579e5d08b1c429587323425d7a78351453457cd868345afa16218332002c95d8406c14938c039693d6c1216afb9983099031109be0193a1b6e12436103fdd084a7b84380acc35817831c0558d4f8082ba58b9174841a840c2964853656c2327f7952132c6dd129dbf5023ce1b3a92f7736fc19528b71d21a27c3d7b7451d5a8fc02a786f75545d2451549bc95dbbb87724f72d2adf1d619b1b94386c14c37128c2c1c60f4c02b28cc536c508a370ba9a2f4618cf1c64f355684f25a6ee99d3f89ce0136b47d7b26f0e6a60cc94fc4573834172a3efb84c9fb66401b76c90007e8f7b19b513292138b79147a364680dbcb211762358cd32a3c44720df6ba22dc8d3019c0c4803f2a567d9ebc6a5bc012d1f634719891da1324eaf228379264b3da955daa3a2fb8836894c8e80006782141257c254d905a238a6b41ac3c76cb87ea342728ea6e48bc66816842ff2455e85c67f8c48874f469bda56fdd83a57dd4076798a3d854ce40bcc6b349a198fc6fa4713c94794946e249201779709ab7510459e2fa325bb3c816b2af3d9caf36fa5c217379cfeb797a9080fe23374fa02f047c775cb4602b7859f7d79c0af73f11b42847915b3d3246e1044031f61baad987f3c6cc93280b23c8390e48a2108092c7b419bae13ae50067813a99b5da80e58005c6965ffe453ae573501b242124515257c406278c2f7f394574894445c612e4114f0a60404cda976fa63b9a285781e0ab3d77ad2b002f1c885ef746610243b751ab4bcea388027c41063b01679136087364cfdb1392faabb9e20a5177b94bf5a393b7bdd83a7d82343173b8781b44334484354b7179b225aabee99f230795d1fb248aa5615e85c0adb49b7f5104712b86d4034d457975d41b7c88c0664e091e47e9798303c3901583c13606eed7883a537ac0e147068b8c4ac056fba108ff1083a9186ec05b338627a8dce43e5c41410cd6bb35a330d20b77bb3a9034b4e3c443bbeb41b6691f11ab110b3703b6df765199d6b8939f7f2540f3433853cef53fc44eef819cd1f01b80181eaae6bb91b27cd748c402c4111140d5a942cf3c95ff7977f88d2ef515bb26d0 +ct_n = cf3125a6f30cf0d78f4b76f6c6877dccd180b2b8f7afa1ed7326a18123c0b20156902bb1fc6ba1f4f41a006b15e41d18a76440e5e20b2375665806c3ef5663704dc098d1e6f434a56f5f7579b860284fd8dfe84970cc47ef1afd9e4e3b80a3ec8fd739cefceff6567dca0944ef62af068298afc6723f196b4b71161c6177e2e8ea4a0f9dd37815b70d2d71a2cddeae73b28c9ec9c8fb5727eed252fa167543a77004f94598a32152a22bf611d275d1b249efed12b22269edb10718a49c3161b4a387a8654a509f9de7c8e1dab5a5d13c6b5b480c87a7283aa8df023f0bfdca6c32b18b7ae3f1f89bc22261e1af19202cce59981284d8094bc146aa0a0bcd5fc31f5c3d22f8e39aba1c4f5384e9018c0afdaf395b761b64afbefd50a89ed99b820b09ba286216463213cdd3e5239f263328419d6c8f377896ccc6d49cac9cb3b19a643991d1c1e9a3b3f8482a031f99e1ca839c0339e8141eb48c4a93115514cfadb9c47a6eab8497359fd92ddb442a8ae5b2776bc0ffad5d399f05cf72b872b492abb55f8a6c0c643d8fff627875100662396a849bda878b90895b93614623563afd24d76c9e02a85065e9dba056a342f0c7f516a37235023ebc18e8fb8fb6a675fcbdd5631ffc6930d7735d74bf7d7ceeb79c1d6d827ff1af5fb25b9cc20b9387fb11bce9c8844d1836e65cad1bc3f5087bdeb4cac03de28fc6e31070631f36ab5526d3d2f886dca8436122c605385985cb5dee7b09ba88d6948a7edad4a882a0bf6a38f9ba0e9f0dcea1fa1d19fb68ddf43eec7334c20ea8c7b1d633b55bb3fd43074b5d725a0b92cbcbc35221dba0142c5a942fe841515d191de04ca0a8540f15daa5c5b43726c1e0bac85fef0068ecdedc16b2e7135e1c24677439d9675cac9cf64fcbb76a18c1d098336c76cb5a04fd2ac395ee7a9635375c6ffba51f9c44042ee1df0cf368f35bc71aeabdec02cd35c3bd0b5943eb1d99a8173f43a789cfacea1ce6f1966e869498d097df7dc262c8b5efa22e5ab472461333a13bae03bfc8fec7699097ee8574ecc0e91224c8a2c10eb857325c627c197abb8ac3fc3f +ss_n = f1330554e26700b896758db1cc8eecb73b8c809a4083466e4e0c654f346afae1 +ct = 5533604256120d548065769413b82fb5abd0014e7e9f10492ff15fd45dc782b2dc4c55325fcc57685f134ff7e123cf028fa7b45dcc717cf2d7b274d8f2a8b7d1acd66353a56335f482ec3d04504d2e052ded28112ac7410fa8e47f0d7c5eb1d6a29e948781db3863767b7ea87a591e0d7ea4130c1c9fa5e8142dabf7ee8c02191cdf1b8c804d38e2b6e4445cd8fd341a63ec0001b9d8829d4c8f5e53dc6e8786df67f4ac0bb9d188f064da50c1fab3965510a048eb6b4aa78a851c47b106429b30f8a9a3b54648c8b43dcf76190bbc8c66a6a36df7b95ae3d9784add8758235b291c0a1db1ba805412e8b92c1416fbe64c42db123830ed1bd97e69e522e482e83325e9e88ad9403f7e86d88d535e391ae4cd330ee05892a114e4439b59b30602d9d98704aa55305fa1f85b23d7c3b0f30654c8b7cb4ce02985e6cbe9a87cf0e999a565413099fdfaf577845a407cd6c2ea5ededb04ba434d80e1132467088861d65199818ed4ba3a095e066339f353394877e3bf7926288cdd37ac31cdb499b5eb8ca06859beb5c660730fa793cf11347fbfed73a82e1d2b229a09593279ad0445bc11b4f164d015ec5141dadc10d322c9283e5a641157dfe53bda4c3ca7364699df0bf794d4683fb1fdece8e318da3ff028b63aa7d9f50b58785378be79fc7e8a2b1273a8d78774853357aec523ef7d927644b07d3d0f2876bf0b55d4592e33a658c461c96c8b81ccc2b1d48c3929ad994d015ae6dc4c98a75416767c7ba160bf7491b4a0aadb5e43a397f63ce1cf7f916479f763350c54dc296a22314b4f484c8c22e364fce5a6ca6e150b81021b44b5f49f914927896437213d0abcaea28062db2854138d0e0bec841e6be8e039b8a0d762e60ec8b6416dfe7c7c8ed9b7415908b8dd9a698950697fa5faa5b1926a54de986a0093da976c89edbf83711a4baabc2c21c74f2b7fe96aaa9eb082dd66e3408cd30002cdbd573d27f66a806eb0b3144c427e07ef7a3967f04f0a4336f55e8e12c63a6780251844802273ac901d4f6a556502db496d4bb46109be1f90b7efa76d3403a3bbec6a32e8e5cf4edba3 +ss = 135b9748c6aa6d1ae9b5420c72679ff65cae622b8a7df54cd7650131b5fd77f8 +count = 3 +z = b585d4eb01085111a172a87688d0032e3381a9e9a35fdd6ef2f8aeb3b40eb5ce +d = 89b0c4b23019af3498a27da290892d981dd59fa08993bc05da21e1d72503664c +msg = 0f4a070a0116194e267437545569d94aa5b2e4400645d5de88c504b9dbb1455e +seed = 950684cb360ff0c011fd02a09a273c9f023d0a34ae0aa338c6f5283634ae9bef5d100bcd48f6577e5910beaafe6c52c3 +pk = 3631008f7183b49b55f5c4b6431936a5cc871749cd95e8c65f023af1ab06135c702cf2c15112c129f74893337010424a82c17928538e93904245294be1665dcdf7a468579d03d0cc509b5096f7a043e45c670362dc18bc5245b0c694cf6f492117d1577428c8bce8871b78669c951b07a8577511b08b8657360bcb7a59060a236bb3772887d9b6ff4821bff754fbe840f2274e8195139c472dbbf96a72371a30059e55ea84313c5ffbc961279243697c0d6123cca83654c51c25e34bc5ed6367798905cd934e210174fb175ed03387da1c314d3734cb281db0611feba38590584b419012a2347829519a00fcaa33671e42a53ae0807c11749bddfa90b505b862456ab3cbab9b4243e3015c051836bdb233bb814ef9102900a5cdcca2ab57f6bdafba4b6023095000b19acc110e336aa012ba6b9111a9d6c30a06a2db36842525297e447389a7904d93360d640d48780dfb645922d0a05b8833857834e889a2419c2b97453e3fabccf0642006c6a7adc7a9868759ae11cde6a68adaca3f6ea47ec573a64b89c7ad2633ed571591711d9d5310e9d83c6997b6ae317f3fc7011aa0b9fc171156779b85ea4708276ddcf96bb80017324008e82355e78184fb9879d3f42c87d9562df34c55146d424a150f1112364953304808b6d5ba66d2832aa532d0d4212df7b385477eb57aaef2f385a54660aedcb4edd96ebdfb050bd81deb3a09aafca5115282ce74c4392624c974a94a601295330209d59f0a0033379790aebb5b43d518066a5a4174933688a64141c1dca32e21a6793310b31be19e721b5ae5a83b45d424ed0267ec363a8a956ae64b1c140470656027095b148590260f909908dc82c474abd4e3954e54288e7605ee3381c0c1b453baa22b506c3c3a3e3adc3851a536ebb7483d52a34c3c1d100976b36a21f7b92182fa38ce10b690f57e33861c349727a6d79df45670f3e88344b43d0b790e4bba92bd60b4fd6a5e1c9b60b4eb10b71100d99558c9d126df7984a37c60a84975b1eabaa02629f42b35e5bc907e093e968b56d7d91ea2a6260c866e5b83ccee54303345138ae97c55f578a6ec3b4058b7d1e14ac92e370cf770042ad3f7152359226c2c2abc6bcb87462f +sk = 7eb1be50334821e67d04da9ae18c8f03c8c0a0c5b0098c82b404c70e12c56ad7943d9a6af1477f37a2b144c9c598965cc3da21a1118353f9132da664e668810d50cb31b76f64c76af3647ebe34b5b4d7bc4cf29b615352aab69bdd9004f6aaa21107938804243958486075a8f012707f42cac2567c2ac6a12f8a7e8260ccbaf0cfc8608b826a87ab3c086ebb3760c0bf8fe53b9f70ba066b1a4145ad7c3095dec14f65b533347cbaf62c5d4b830377c6a641e83b54f49ab1f44ffd92c098bb1d1eda4fe74a72477661b6628e3af405a0f6a11e8b2a5cc55c8136797a3370c3505760120beae02f892ccffdf293db7c03a4c65c3c0c9fc87997a5f6c003271ae68909ae012e506abfb7880e13429b5f516ee2592992e942f1664cf43ba274e1453782a454e4bf8c83654cfb8afa90b11caa73e94053bb31a0662894873c76c3640a8c6267b7fa8dce24719d0666f4b09a1c091d2df3bba3c64b39a22d14f8103a094cbc836119b33bd780a2872617be355d67585407967d00651405734d6fc7004705aee2436c1a375e4748a9d700a68d567e9a977eb00850ef35bcbda045b9b45ba6e41f1f6b2fa27b2c173014344a6fc703340d1aca3a184eb5649baf8148e0c041e28c352ce32b9e2750657728ffea6f54e458bdb34b96a2b0168a61e1a0cfae75b9e86cca8f08b1f311a0ecf3896c0142005340c2b5130b4aa6aca316dc9c77bdd11bc1a41b49f93600806b57f2a90a966c89949a2e1cc8ece51386c922ea909a5a36a0ba412ecdc379af1c176304b7d5687c74f2800ffa4f27a488dc5543ef33920896ad01262e00545df1a992d402361c1288b4753a1d641ed70b418d61bd2c48638881604ffb530c33a301172bbd3823f6b01b3ed24cfd392a0da769564c02c6b021f757323a750837d596d6da1845548649a4957a9752e0faa75b15b7a4f7564d1a1eb86484a3a78eeaa3843c853eaef1c6b78263fe27273d623111755f4f68bcdb0630026ac6cbf2b332a349e3fc0d8a090eb78516fa0147c4a1ba9f211e4006571351c0087330ed3c66bd077983251fcdf79d3cf10235d34554dcaa3631008f7183b49b55f5c4b6431936a5cc871749cd95e8c65f023af1ab06135c702cf2c15112c129f74893337010424a82c17928538e93904245294be1665dcdf7a468579d03d0cc509b5096f7a043e45c670362dc18bc5245b0c694cf6f492117d1577428c8bce8871b78669c951b07a8577511b08b8657360bcb7a59060a236bb3772887d9b6ff4821bff754fbe840f2274e8195139c472dbbf96a72371a30059e55ea84313c5ffbc961279243697c0d6123cca83654c51c25e34bc5ed6367798905cd934e210174fb175ed03387da1c314d3734cb281db0611feba38590584b419012a2347829519a00fcaa33671e42a53ae0807c11749bddfa90b505b862456ab3cbab9b4243e3015c051836bdb233bb814ef9102900a5cdcca2ab57f6bdafba4b6023095000b19acc110e336aa012ba6b9111a9d6c30a06a2db36842525297e447389a7904d93360d640d48780dfb645922d0a05b8833857834e889a2419c2b97453e3fabccf0642006c6a7adc7a9868759ae11cde6a68adaca3f6ea47ec573a64b89c7ad2633ed571591711d9d5310e9d83c6997b6ae317f3fc7011aa0b9fc171156779b85ea4708276ddcf96bb80017324008e82355e78184fb9879d3f42c87d9562df34c55146d424a150f1112364953304808b6d5ba66d2832aa532d0d4212df7b385477eb57aaef2f385a54660aedcb4edd96ebdfb050bd81deb3a09aafca5115282ce74c4392624c974a94a601295330209d59f0a0033379790aebb5b43d518066a5a4174933688a64141c1dca32e21a6793310b31be19e721b5ae5a83b45d424ed0267ec363a8a956ae64b1c140470656027095b148590260f909908dc82c474abd4e3954e54288e7605ee3381c0c1b453baa22b506c3c3a3e3adc3851a536ebb7483d52a34c3c1d100976b36a21f7b92182fa38ce10b690f57e33861c349727a6d79df45670f3e88344b43d0b790e4bba92bd60b4fd6a5e1c9b60b4eb10b71100d99558c9d126df7984a37c60a84975b1eabaa02629f42b35e5bc907e093e968b56d7d91ea2a6260c866e5b83ccee54303345138ae97c55f578a6ec3b4058b7d1e14ac92e370cf770042ad3f7152359226c2c2abc6bcb87462ffe47bd2c468870ea492b75bf6439785b8d4b2e08a0f0642ab4dc6c6daf260f36b585d4eb01085111a172a87688d0032e3381a9e9a35fdd6ef2f8aeb3b40eb5ce +ct_n = 2955adb5e21a1f72a2e3cb633a3e0f42fcac9096b0d62e4a45878ffa0fd6bdede4118fe325468a6f2b7e91cb6231413354c4c655d9aabb9d336064673f55857d2e9b0835d165a3bbdf8fe9de7e14be2ff03b0ec7e517afcc8bc682f6d6626491a9bfeea98f961a2a0740ff32da198559fcf5ff2c38695d17dfa8925569c13e5e0e7978f6990f9feb3052ad995b2405a010de041b36ac3c28e4df6b64e6bcc43808e63e1e4b76de4a7dca791c263f107491626a3054c229c648a89f27ced4670dc9aaac3fb95eea408833c318e92ae9f9719192b6b641685c6bf900ed4108245828aa1b7a2dfcc6f882701df533263c561bd28bc3cddf84ed00eb20da09f0089dac580d81974a75e48d52e1449ed97c5973b99a5a5a0980f4b140412a42312ad1a07f23a6d0b004437248e0de79b6e58f339284aae8c365e33c4a757d59805538ff8f1a6b6352a319291bd62e4133a8c3537bc378327d7585d61432c8afdb358eb785d8167bc494dc02dba635d562800a6fe345c7d52f6f78cfe00170324349bc8668ced5596b480658ac7db29ae8193d07056d2077a7c39414bced8f4e7312661caff6bd4cbc9a4722b823e90872bac85d808e805d6b8e7a45d90f904602f4a38e2163ba848dd5de4af6640400c8db59ece3537ca6e8de78df4d59c96f7cec9b525a0c0a784bef4b800f5a22d0d5b3441f88ef10dce8bc20ea03202e4393382f1c688f730b4991e97e94d404b787fd15ab213af68859f6dfa3946ee932fe944379d4dc263a4ebc175a99ddd83b32d9b7f848fe661c60473e8090e005730a770544e8951c566bd81c41d36139849a490319b5bd218d292dc8d49fe7ac7fc90bd999fa4efd83f1b18dedf39cb861e9a861d0c07020d6dac8cc8b8ea57ce890f295323141ee64472a85425fb6b860c25c976d70aaea1100c664d90054defc8caa043ea41f229179dfca9c525e0cbd3e43f797eda02f2072582a8c3fe23883d6cd28269b056e404b99379fe0ca83a0dac9ed33980dbe3b178275c8e0500ee36793e6199df4684584cfffe398bfacd28eac58bf4d83bfe4473cf45a965ae32aa770e0 +ss_n = 1931f243bd6f1325e4be71fc4223bf2d1d4b93cdc3536b6d777c7d4523f32513 +ct = 29c016de7521da5b346530f4e583d8a962193279a1bba3eaf753049f666ba6cb5d90b23cf6c6cb6eef04df88375d07b8e9c02b5abd9df1e737422feabca73691dce4867833fdcab30ced01331adf8b516bf3fa8d6a1b21742af833150c9da36323938c4d6c9d1e14cf14e0e6d05cbdd6052528ef879a357febdceb058e2e9253156cf26ffbb378e8ab14c90b1d1ecb67efde6451162eeddfe93f14a303ad8323144012a8da46f3cf6054ed43cf4837c0a54d052a404ec729505e42efdf9d8f048221c69a263693205d0e221e0114f8a0739448ea3e22470de06c075347bb238b101df3326eb686d7280887a7647fdb8c083c91bd09f881b4e3f20022a63e451f346082a8125727861ab0cb4ffd5fefedbe2fda7b93ea58aa64810ebaa422365b0898e91d2f306bbcfa8091d0e457930e8cac8a844ca4b2bd02e22bed00c7cebd247add07abf50bd929f5b1a149cb32758f277ca6b014ef1093ebfaeebf4877f7e3f405dfab108b4c948d5d5380694af29e944237067382518f13d43dd9e502787066057bafc6d8150c7b04e61eef487f00d5b1101f3d1cd1b5de710f79b1c0ce93ba468819555d5c7b8203a7741110bbcba4ef3f4e0bc70e2482c8b0cb801e4c9c961479e32907c7c9571a9e93913bd81dbc5e562e482e306ba7c54f636f6de639ad37a2e70e788ae39fc554e56b52273a1697347017c2917f97165886422f6f22c5702dbc442a0d568aa96acbf9f6767fed8a60745c82031653bafd825647e0914f43949d799cc579a7cea389b4a9866d30111ef77d298103954c9bcda6e503b1c4033fcc7d6729364d804fdb73b148d348b6849d84d135dfe089f0b1f04eeff9abf3af54bfc8b89207c755ecfafd94095ba3e52af937d95ee1cf16f61f8f8532562b5a6bfb36033a92cf3c3e3f07f7e15a9db5a21fb5c920fbd583f910d1abfc5a59a6846e3c478f9a9861bd28a9b5165e7f759d534faa361dae49ce51f616c47ed8b07fc9f4a41e96d30566bed4804afc121f73fcaa8d0ea3cfb970b8e35ba38395896f002cbe7bc2457dcbcad8136c40427594d698d84a4e0048592ccaed +ss = a1ab1ba60b6fc2f0cf255c0e80ac59ea5efe05b4b3359f3aeb86682d7d37bac0 +count = 4 +z = a9f93c7b791356b66afcceb745a548c7f6b185e4f45ec1ff1a22acdd96e7a6d8 +d = 8d45a2ab49d8c20d4ab5680e5c9d9d0cc9ca8228484946f9afce5b8df6f39d19 +msg = b3dbb0bf61a5230dc0ab9f1d21d5c16566ff9ad805a5e1eb7b2d6913d4cd5607 +seed = 0633ccd19471803e0ceffc7a11b2e7b70c3329dfdde5be18160df0d4c609900d67154893921376cc4b4b8c586e3efe79 +pk = a1dc74332994bc2899c85b59a4d43d2ef08f5c1aa67a4872c4c355d3664f08699a8ae85f17d74450b628c5f31bde384721d73acb51abcfb361d850184d925e013a0a83529535c9b262c7c48f81b95e693e242878d0168902c41c14a8a3d560cd31044b7e4659c1c9cb4c18593197609155594a088b9a827bc4732846aac353fa8cffa486a0d84d368314e65917f7398c6bd12f223700b17b883bebbdf12c1a42e89c958553d0686cf7683caf71243727afe2249b00972587335f6b0052cd2177800a4fa1225725e08b9551cda1e45ba6e3cdbb71730cb72a1f1c6cf1bc58520c9e52203c68951c2798523c2038ba6801fb3c321cf5ca218c680c320b3446ab153a3c4cd7cbca356b58d254b6a24a672258d1a8bd36a81be97b515eb42122f32a7d397b2fcb039946c38e41b5b4c5764c6c50c290a405aa746c527c51358bc09c5b52da33a0946c9d8a2f0da3ba7a24913d83b4d909913e2c55bfb5020f6c87688271e01788889c97b12ab88905b49a6c02d3400b7a6172fbb106c016c85cc7073fa788a8e37ff2a2a77d664aa1a6a0cbc9342e684954957651462cb2db7402c65a2ec98d58441e57166c664a8a753a69987b1930959097e988c7da31942462c83628a81bcef6d42880f6039808c727bccc6d20443956b2a2d48f58a8797297cfe8e32901d468f8054af658c7b3b7ced292c3866407c1a77959681c25b46c345571637919448036335723c17b5226074159219f479b2553864c6653a0bc74b0a152160bf88b50565a47b54a97094755a0c17c8566cd922ad49b54ad75c5bd50016a509d7eca819b36110c93ae0ea47ae46acbc4627115600cb12365d1e6a9424131834c4c4c72442d1a7c8eb7351b277be60b70ec170111a38a3ce0944e242cea26c4cb80c433653045a7bf4d9a6f0906306c0059f42b512895c2ef744db5a7720ad0353a667d43c4419e6148441880f788a78bd94719f010d14224dfc068a1c6c6b4608e8b840d7a6268bff383b7001be6e66fbfe774da4b9c9a01c5c62c55308196a6b72204b50ae39225c31a8aacc59be09ba033f43d35813582b28eaa839c70619814949f768e114b01b84b8787794582f8cd7f6fb07381770ebba5031cc5 +sk = 5df6621f39afd4f69a8f688c01f6331a1780249c02e1857a274357adf43dbcb28831f2cedf46401de1afa655436ba43e4293b70c092b94544c4f522f4831913b9b249383963f6bcc78da5f5bd54419e2cecdf589912859fc47b1340a5a2a095dd9b5657662c03c84200e319873a18f5c035dbdb56444e787f0903abd7a629af87de831b39c5988d0d1b4cdb50d32480c0b9525354406aa91834c34bded4372ec0942bce9141b573e60a25434c82463bc9d6b63af5d7552757524d7934c34e583c3a4cac611cc303074dc274aac8b00a8c452e7a409c5b7bee4371e9a50099444c867bb39ce4a03931054757515902978e09c3aa5820674823f923330a207be545083583131855a0226f409a011266cb590b97bc1fbf9a0f1d0b1be2b81988330ad72a538aa1151795614bc01f6296f4290cef617b2c9919199e480fee589e91c78ab427c9c8563bbab54d28a6c77c06dc95671286403608b6c4b77739bfc5d7b197c9cf66229106f202b941f944614b93a16772eada98ffce9c9e7dc7a237560540323e4ac4c7c6c06733c3ee0ac55b574b7bac089b6a31ddce15ed9716922dc3f122b7e88b62fd514b2634ccdcaf965174158c3387929bcc000e312c4bc153408821af7a9eb8458a90388d32b17724721140675b8777ec4a14cf38138d9990e53115cc2a2c9120316c64a516e769d54738017547e8dec639a488183f69c95e52505678891068d9c81129561b025f21f0bbc41d6544305cbcb0bf5a57453212da638759b220d3c5ea7714eb9f61797c508bee11e11f49bc2286a9462939459456d346ce0f4182c915adfa25a0cf2879c82160c1a887fc243e50693a11a2e8d92ce6ff0c86d7ca816324c3b368a70600ba928749bb815c2fa99d317a9e78427ab5785cb51382b362b42bc52717314301969aac619234ab8aeba7bf7d28db7d270a18a1aa089cf1c9103dac5a11f075f5ab1a6e0301ebc510e45368aa308b2ce5174c2a26359cc9cddca8bbcfc71dc53bd7b86119eda2259942e2994cc506c87f3854a83c823ade1cf0adc460bfc34e534481fdb55e7bc71311904d2a60fd7821fa1dc74332994bc2899c85b59a4d43d2ef08f5c1aa67a4872c4c355d3664f08699a8ae85f17d74450b628c5f31bde384721d73acb51abcfb361d850184d925e013a0a83529535c9b262c7c48f81b95e693e242878d0168902c41c14a8a3d560cd31044b7e4659c1c9cb4c18593197609155594a088b9a827bc4732846aac353fa8cffa486a0d84d368314e65917f7398c6bd12f223700b17b883bebbdf12c1a42e89c958553d0686cf7683caf71243727afe2249b00972587335f6b0052cd2177800a4fa1225725e08b9551cda1e45ba6e3cdbb71730cb72a1f1c6cf1bc58520c9e52203c68951c2798523c2038ba6801fb3c321cf5ca218c680c320b3446ab153a3c4cd7cbca356b58d254b6a24a672258d1a8bd36a81be97b515eb42122f32a7d397b2fcb039946c38e41b5b4c5764c6c50c290a405aa746c527c51358bc09c5b52da33a0946c9d8a2f0da3ba7a24913d83b4d909913e2c55bfb5020f6c87688271e01788889c97b12ab88905b49a6c02d3400b7a6172fbb106c016c85cc7073fa788a8e37ff2a2a77d664aa1a6a0cbc9342e684954957651462cb2db7402c65a2ec98d58441e57166c664a8a753a69987b1930959097e988c7da31942462c83628a81bcef6d42880f6039808c727bccc6d20443956b2a2d48f58a8797297cfe8e32901d468f8054af658c7b3b7ced292c3866407c1a77959681c25b46c345571637919448036335723c17b5226074159219f479b2553864c6653a0bc74b0a152160bf88b50565a47b54a97094755a0c17c8566cd922ad49b54ad75c5bd50016a509d7eca819b36110c93ae0ea47ae46acbc4627115600cb12365d1e6a9424131834c4c4c72442d1a7c8eb7351b277be60b70ec170111a38a3ce0944e242cea26c4cb80c433653045a7bf4d9a6f0906306c0059f42b512895c2ef744db5a7720ad0353a667d43c4419e6148441880f788a78bd94719f010d14224dfc068a1c6c6b4608e8b840d7a6268bff383b7001be6e66fbfe774da4b9c9a01c5c62c55308196a6b72204b50ae39225c31a8aacc59be09ba033f43d35813582b28eaa839c70619814949f768e114b01b84b8787794582f8cd7f6fb07381770ebba5031cc5fd51dc9e95c0d0eaca6b73800bb85d92333799e6e2b087720860b038790db398a9f93c7b791356b66afcceb745a548c7f6b185e4f45ec1ff1a22acdd96e7a6d8 +ct_n = 954f5ccb184415b8f504f5107ac7cea3b97f2c09a2fff1ab075413c508057c44adf9a29acf7df85ac138d2bd129a00a839336528b778eb1865cbff3a4988ea04ee311fe3f4d17c6f5aa2718fc760c01d3be4596fc9a2bb456e322db7cf68bac12011ec1146b287ee7595bed6dc689f91d22747973e718c02727a8947cda37842dd62b573477230254d1539e7f6fed73adeaebec0af86ebc19febcc10f16de0e6e0aeef839fd4bff66bfd37e52c486d1e1a5e3e74ee75ebdcfbee3ddcd58b19330d15fe629b62663d482e752484e75cd62e16fbbaf52c9039a86f4013c1da7898a6d685f593fcf4ec738c6daa2cb2ba3d08405fb500f93681113430008cef55be62b4464a2e8c4ed6ad49aeb1fe7321964fd6085f28a4beb177b68669def0bfb2f6c666fe3aac2ffcf48068f3264f87ea8e0feb29e5baaac91e3c8cb7ed6447dfa5611b55040d33ad144f502b2d93ab857ac3a76ac609634677115252828c5feeffe26a889a3bc116082f1d511c95364743a10664304be0f4abd464dd64ef9115d814928eb5bce0892f627429a9c733c1d999fa46fa95b6fc4bf110d21dad1b3dd80a5d0f44c337515f661743b0852e343bed5b59d8c9c9a82e1565a5e2ecaf2fb3069bc03656e108dbabf49914a34241dc2076a1e1fd0d9a93408c4c90e48ddef8835fa5121d084610e4cabe0cacce748982cacacd4896dcec53fef4419109fdccd98c25438282be3a2a008577e5d871faa26b4452e353318577a7c749d2a96a1a45878d8eb98ed004cbeeefcc9c9c1044651f616ead2655f21d344a639afd6f925117c28458dd0c7a0c53050e4ee00ec48d3f63e62294ef3ac43c5873e82d4f557e15cc6bdfdb2c12f110ed235533203f5bdb2ade0d5bc19cac1a4c684f6fdc6b54f30186adccb9b8eb2ae1ad4e0632955ff386fcb23ebea29289e8cf328e12138cce93cb9a4b46d069d51c8cfc69428156f67832ec0df7781e8ac6bd15e5b6783b7b21fbd7eeafb791eb4203dcb432a40d0c229623fc7aa00f024e0fc61f1394bb49226e831473e216a3713e04a35ffa3fbafec5e8d8de3cfbdb175efe74bf +ss_n = c66a25a19bc890537d9d7b3dcf4a63cc1b4667e968b8626b4ff58481a10912b4 +ct = 9e47658ae61712e3f06ef729d169267cd0e8f295427712a6faa3a5b6de63bc40b72f8d8bd62902ac9beada0f5378204b7a84933069fb63040bc7179d472b958a534feabfee1215b1782f0b6dcecaa3e1cb0fc3e817ac1111d83ee720539927cd68d024df0ce774fdb99efd50926c587a9312669b1d1576558b9e638c71aec220cc6b44abfd9b739fb47298ae4858d840b48cd5880964263ff8374eb33f6ffedb20e6b32efe807d2b6a0b964036f830bfd6f467a4da2b8bd7e35e4241779756d10509bc897e5f2b58d35740ea7d754a61e6e5b5fadf25b67bb90e93f1aebbb72eb6c7844db878d6c2765b499b3ee8721390b837d631dec896bea5a6afaaa3afdc64781510e7e214cfca655b4b473e1c072206962f520a7c95a0adbd524f8009f5f06c285e9e318a3c5db0c191368447e692f195881b44a58c58600c4eaf26ccc7e0ada782dea6185a8fec9aaaaba6f6eb9f883d9d65b54e736de191d4d74dab36377c81c1c8dfbb3e47bf94ae15b0008fa43e2777b95a41fa30fd0ac29a90e49cb00fd0f828e2c13f51c25c493151014b1039c8e05c5b7b51dfd7c26add8cd8fd0fe6dc6ca2ed799d73e1bd385b429969a653589909fcda2c218a97f4a675688e5ccea4e0bb352cf0e96fdf4dc1746497ff0d87ef63732424c2b99fa088af0727135e25dab47a2b71ec77667499f805df2d8ae0b797c096bdc8fb76e98af2f075c13a69c69c58635d71a1972371a77db4afa4deaaeaa1b463b7a2c76ce5363bc34fb3324a61fdfb3b2ec7a936c5f1c6c3cc6cdf9600331e85a710c69a9c7f4bc1042a4b3a1300866661e79040eda589802e75c81e857f9b52bf8fddc0b0c811492a05117534f2b484deaba192fbeed9ad3248326445edd1b6753311da8c1a3f10b9b25e774f228f0d3d542f25cf31500623ae4eae471fdfc7f96345400fa26c3e5d7525ea7b31ef9c0f025da7fe569f80ee0e114372484aa62c98cb301df298a44a0d7a4d31f9aa279d102999aa5e29aac0311840969b812a2bd7369af76b75810d67ef547007fab7781e54c9b0aeb81663148e1523ae7f657a90fb6df457c9dc +ss = b2ff60f53bd459e9b2917acb29b98c541264159c9b44973f73989ecf50d7cfe9 +count = 5 +z = 85da83b47129711a63c2c2f6a5bcb701237b2b0b66814eec9fcc1c560992a596 +d = 1fd893bd47ed681c7c11c9d00be9eafd9db79ae7e934b03aa6da99e019a28a53 +msg = ef938dbddec94c01a845c7f1192c402f33c10f1f0176128af219d6a0243900e6 +seed = 2605426643cab04b2801416b3239cd046dfe7ba59874a3a05c5b32a4505f21d8b7217b5ecc8646fc6a845211ae4bc708 +pk = 2e2bb750493bf0a0050136412a920e3a7a9910790e6bf5b9e907179cd7bfff0c71d0c83e90870b31f7afd1c3c00dd258de781a3d944c82b3437ad57f81e28c65a8628a83b9ce931d9fea3ce51b8b781853a3a06e8da0b36c023c6ca42bb0510ec1eb2da472af809a1f7e4a962af3b64a8b78451347c11a0a87e5902a2c8569c19070cacae1563c8246934156226762230d9222885637e68693e8578e552062d523a294f64159d52f5a7ba8335089e528a7db09b31313a220f96b9ad85b0bc4babb4760189186ac9c70d96c86af770b8a1c3c019b4e76f97518e9203fa92304f1b27e01cbc8713e54d7662cf191204839a5cb511a563eae58bcb2820b2a25724f4ca2b1aa3ba59274236a12bafb5411c2b44988b84d4cb9d4ba15eba31d0c238d219276ae30059f7055725a3428111c17d22d9b4c90beac1d08d90eee00200fda653ba9016ba4071c7a9276fbcf92a52941bb7af9d27df5a19acc50541b905cd013a2864a7751957848839614695969c09b72d441878207c4333914ac760ba06c9186b6bc2749d3cb4e2af6791d07982bc148005b08b75125d0a12766746bc7960ea484384896489ffc5652ac6d1d75c78e376c05591bdacbb3dc85c7bdbc40c285adf9d808c271a309e67336cab62af9600a961f67ac38eae68fb8e0292ca4b199ba7a845b4dd04948bb500eaa6706aae0c7d4b425b2715afea94137db85d9aca23fe647ae372cdecab6b97723bc9361b0e12d518c84030c5f296abec90c83b5b09c41b1ad31d2a2ee329e260b3fcfa33d1fd6bfd57144e02c09e75a369f6b52a2580911914cca00928c827af3f73fdcd8a4aa03381e33c2e44989678b739586020573269428384a2192f76b56dd33107323bc13f634fc4ab13a7184b9e5c8eb3947da20a123c203ce2792f6b2024e931f7f7a8ac6a8af936b15f2363518ba4fda49ad82c28c8300774bca2dcc502016347e54429681a783b0d93366e055a024c5df31a3e57649859471b8b13cd51356287c8e16347755b59aca96b7d3e75805d574110c9cbc077ba7283995c2c539aa0d21378156a79a476c05a318a27843ba1e1fadd24c6efd4d57e80ef4f081b721cde5dec0c599f0b14eb6222388c3d1ba +sk = 11587dbeab9df643bd8e6b252f912a075b7145684d6454495f40c5ef453a0afc45c4db293a5b671a8a5b6ef1a41b881fb9dcc91bbc1c7a0425a5233556091f447610d2340cd09b12b98b9a517bc7cde012b10586f96c7c1aa74f67f896d545428ef3ce86389b01ec08e3323df66ac36edb6e2c347b065529e2e0273478455ccb4e98918fbcb3676651337e25501ae05e932b3dc6540b84b46a05fb598293387bc9a4575379e92826778828e8375b854336126362b56caded8a2ea6416be2ab282080cd10519eda163811b41abafba077586d665a8133e13f8f5776a3cbbe50fa34e696cfcd29425c0b70dac109c7783b6c107fbd8a785918bad82c69836332b2138dd4dca92ff2c2d7bb0a46415fbe1a1b0029cb32185205e25ad75993b169619b439d7610a9e89ab69e395b52fb2ed6c104fd0095dd3b7338338ef3ba27b2972982ac07988bce095796b9f61b5d08405b99c60e0922a78146a3783d87f07c81aa65cb730f7cb49d20e87d3c0140d5271bb7eb1fdf4393e87b202e59a7b392a890d6a66089822c1b405f93332f4c5523e66b23ac9add13013ab10c8b5318224703756ccaf6823bee25148adc1bec83488f9ba1fca0250b971ace10ae0e379e7dd68a2f049f9ae7c0d92670225b524aab82f0bcb9671b6e9f080690b1880b824668997dcd166ba6e727b273a9f824745ed74aea8376936abec888521e3265416373570a46f9b112c6d0ca47fbbb8e677a435102ef734fb8a07c830915dd1c0f6fa97e223a9238672ba3a3649d51862cd9622328b347037a81d59a2b7c5409c4cf08f338c33b9a7de69cac74c97872cf4db9065553b11ddac52c1484bd53088d3a55f472abc8a5165568a67fc50c10fb2e00619fe959a8cee7546c7c7ee9a8860604b01b372191f13a22b182e67121e9d96117d77977cacc374ca80bbb7ee980a1d1a520c539380620c0a0e04549933a5aba7fcb35625436a99cfc504d02873d8235914c6dc9883d2d1476eefc6ac275c2e8fb7a15100b7b089712a884a89c1e869366e78634ddf54d8ae47e798ac270f91037656773b74d89b928e8218713797e2e2bb750493bf0a0050136412a920e3a7a9910790e6bf5b9e907179cd7bfff0c71d0c83e90870b31f7afd1c3c00dd258de781a3d944c82b3437ad57f81e28c65a8628a83b9ce931d9fea3ce51b8b781853a3a06e8da0b36c023c6ca42bb0510ec1eb2da472af809a1f7e4a962af3b64a8b78451347c11a0a87e5902a2c8569c19070cacae1563c8246934156226762230d9222885637e68693e8578e552062d523a294f64159d52f5a7ba8335089e528a7db09b31313a220f96b9ad85b0bc4babb4760189186ac9c70d96c86af770b8a1c3c019b4e76f97518e9203fa92304f1b27e01cbc8713e54d7662cf191204839a5cb511a563eae58bcb2820b2a25724f4ca2b1aa3ba59274236a12bafb5411c2b44988b84d4cb9d4ba15eba31d0c238d219276ae30059f7055725a3428111c17d22d9b4c90beac1d08d90eee00200fda653ba9016ba4071c7a9276fbcf92a52941bb7af9d27df5a19acc50541b905cd013a2864a7751957848839614695969c09b72d441878207c4333914ac760ba06c9186b6bc2749d3cb4e2af6791d07982bc148005b08b75125d0a12766746bc7960ea484384896489ffc5652ac6d1d75c78e376c05591bdacbb3dc85c7bdbc40c285adf9d808c271a309e67336cab62af9600a961f67ac38eae68fb8e0292ca4b199ba7a845b4dd04948bb500eaa6706aae0c7d4b425b2715afea94137db85d9aca23fe647ae372cdecab6b97723bc9361b0e12d518c84030c5f296abec90c83b5b09c41b1ad31d2a2ee329e260b3fcfa33d1fd6bfd57144e02c09e75a369f6b52a2580911914cca00928c827af3f73fdcd8a4aa03381e33c2e44989678b739586020573269428384a2192f76b56dd33107323bc13f634fc4ab13a7184b9e5c8eb3947da20a123c203ce2792f6b2024e931f7f7a8ac6a8af936b15f2363518ba4fda49ad82c28c8300774bca2dcc502016347e54429681a783b0d93366e055a024c5df31a3e57649859471b8b13cd51356287c8e16347755b59aca96b7d3e75805d574110c9cbc077ba7283995c2c539aa0d21378156a79a476c05a318a27843ba1e1fadd24c6efd4d57e80ef4f081b721cde5dec0c599f0b14eb6222388c3d1ba26856622d65a4d99b3a23dfe398f99cef964e3f45fa00c916c072a709dc9971985da83b47129711a63c2c2f6a5bcb701237b2b0b66814eec9fcc1c560992a596 +ct_n = a5bc0cc690767b203da8b72ff28459b5970fde7d2b85ef05852c086e8cf1c52fb4e5c8a75b8766446900419ba87bbeb06515ac7234eac06b1ac6070aee288c6a549c634397b821233bc340d133e79f22be2e1a0220bc2c29f8d2d830cc591362dc48eed220cde66b53db04cf7ecbec6ba68a1099c01ff0a20e1a0e380782afc83ff626f907758d06ea5695272c1bfc357b0c9ed4f899066eb2e6992e780fb9b50b6810285a197a0441805618870317c55323c9e72fb01977348ba70c9096072e9b7f26dfd099bcb0dc6e5feb6925fae31673d1f517da79db0ff4066fccacd0f9411e3e83af3ecda4313147e1ba774c9d3f9b5c702c20596861f85183e5a0689c2c63c61a45116a2bbb4ea0c08598eb30526a83f4875084b9dedd864f6ef179768be340478c0d1374e2ac46b5626e971a2e299f3f2a6252eaab43741e259ef18217bb0319161b9d90700c3549ca4f803d4c46cb25463c6e9907a3c918dcb74c2b94f4cd681b9ca7e74a474f7f88d3cd0964920d470532c0c151d91128581a8af55bf7d8289be3a2b8e08f319e7dcd658a64296f7ba919acebfe275aa2455648d70baf7ce15bb01977b70efe0a1a82f7922b06c64ca15d45c11d3223d289da13bdde901396feb31e059f94be05786ca9b4c40454cdfca4cb85c56ecf529c67c6414436632c6776d8d87e28866584422b19270a9d2a0c548482cfacd05351af60ac95888dc5de848989505f3f781aa388607742a29858aa85b089431c1e9f88a9c03320cfab1a895c75caaddbe110e372fd2788eae4b9d7c78309b438105f809a9f1a8a0cd0d1b944ad037a5266f157eb4f56222131bcd7c0d4d93714d36b017d946075f44c19168897a25396679c73af50f5ad697f1481e9e456f9e98edb0929919e8b1c5765c5309b55859a48bb2aa78ec96e0e7e22f549694560ebb359309a8032e84af4c1d6f918fc7d575630d7125f73979b3a2113af86b125d3ca574d4be0b6193ab98bc2628063de2d14ddf2edfe412452b4d365ff831569aba8e3ea43e858b75e150347299c2dbdae6930110bf1f217588391b7bfc8031cfee0db083a45 +ss_n = d86de3fde00e87ef655df2786da3bf8f02d35b4a71be9cdd116e5f2c983a2774 +ct = f707f413b1c8ba8a390d27f8126a93c5b5514e230fa328c9a7d09ca98b05e9716b96502d131543fa979aaefefd8455b651d2d54a44e9c681919e16622fbe4cc13459b2362b48705bc1d2dad32424cdfd0e7f92ef6c9671a646a9f529b14be0c2c5177c30efbffbaa5f7ba31132518a7b125755a9df3d14f426491bbc2438f51b314fce73f7e7e929398ea1869c3445c0beecfed9e3dac846b34332a2e8540b534b256f3b6261880508255157d0d23bc77dcc8f4201d7879b6547f13951c6955c789ad6109f4a5ef930df88d21109ade2ce579828f3e7aacbceb9bfd7b5997fcdcb034548a416c0b071606fb4254331e641bdedc53fc4b8005cf24cd23deaef6d5abb6d0ca69006f680a7f4ac073d4be8e1f75e9893a47a6b196e4e84f7f47a917a5023138957e5b5e7030379ed7f7d689fb30968ef2dad970a08fbc1ccbafad4991655283a42b36569c13729dd950c2fa0e76d9b5ed04b1e1308ce564de1210d5d8b1af2cc55b63ec3264d1568174e5ffa8e09268ef052fdd426d0845a7d6a31e1f1df42a9bf8a6dab13ecbacb5f13daf482ef4a66dc8e3c1d706dec9a0fc3433f0282e15a9b8d37412017258af8b77f2ca4613ce2f8f25699fd9b8ee4f8e96881853372d147c0a8dcd6302f2904892fb408a762f134f291b5b02cf6168542b2fe0fa17a3d985cf4a28db5ca5c692f549710411931edae2e01d5e45701e3e4d27832d5d3a6147a2ecb617efbb1f144adb325bc0d1a003437eb70e08d4b5071229657bb21f7c6a4098e09e3857dcac881384e119a15521cd42591bfad9cf910d3c16d305802597d1d6180c3404c4049e2173d2e8610f5ffba843ee583ff9cda59a5176cb4bc7d509b8ef14525b0bb5c802f7b11f99d46cc390fcd47be60a3f8700fe5712509f7a577b6b576cb2daae687ca6c386984f410940166e174877385337a6811a02e81b078bf02c2afe6c09868237e5ce2e7a368e936f2ca16f12f6845382d2e2fdb2956f55da29b7661be755374ff5af2ef8d037256b1b7790bf6dffbb4d3ff05b43e5b530979617827335e8653c07056e878084eb8b347ce4416659f +ss = 67a0ff89fcc6f2b55f2188b7b6c030761a75adb14024054bca1556dad31fcb5b +count = 6 +z = f7ecfc9143ee45e44f5e98fd9ca1455340ec5db4fb098534365ebbfbcc57d34d +d = 7838c35785aff8b54be30841ed41a87f420aee847452a4561cdaccff5b38dfc0 +msg = 9bf84a7839f40faa71b35fcb695c5f41a9443bd94041a042a72c701f0d1d5df9 +seed = d3880d1b7802b4a3277687863c5a248befc95d3e4748403f3bb61f83abcddeae42ae6c8624812fd38f463122d99d59a9 +pk = 10da0a20dbcf8843c2aac7c964590eda9432805658ff43ac147aabaef0915a3b4959737c6eb018e70484b67486776b993b13b411e6b59dc9644185c743e42b831c921ad507dbe2618e75014b1aa488f3148b792899f57ba4351e1277c3957929003bc898849ee65bb6715a0afa07768beb18cb7bc6f563c46a662de2eb3bb7197a19d3ad9e22b1729955010212562706c6674184c67aba1a4e338746c72956d4a71bf9c407ae54459d376464fa71f70c45a372bf3b1943f5798a2d19787b0501a8ca88fce6547af6ce4be46123c32521c061c87c38f58b2dd775bd2bb944a8853b73a59853011d83f69df94705e31a4124ab10a1db6f05c18715403058d3a34381cd6014879dfc0473b804f3a8112928c146bb3ad3175ea368a0fee888a844ab34e6c486e0ca7ffca1160894a50a7768ebaa3a3bccf9765424a00c2da489d0a14a35d9cb794517dc4c232d804074f0246031b2669725ae8659ac6c6d6061468b5b311faba2a6f6367ca5098a07c357e46cd4a613f3138ddc4011f3226e4247069579b986fb975513390c141dec193b2e3a006daac85bd3bbc8824775a55eb35ba61570c606e60a2fb3c3e8c0503d7166f300c6dcba092c519c09363248e83862ec5dd2d3727e92287e40215419b8d2bc4552a585a6826e3861b498ecc398c982f5452b51160a51ca3846b0ad5955c2537830bb727f53d145a5b86fec230716c003138074815929a791057d098f7b437f34d4c18ef8005edc170a035d6d98ca8e844ef70c63394940d2b302806b8c7eec14658b2b53c04231d5a580cc313418b659a7a1a52430de099a745901fd0989e3908bd4e91e4fcc010b487eb451cf36c62c43641c6f648465f980aa06735e15597f4ab5827421d66760357ab0ce675ab2fa18128c9eb52689b46b11ea85ab51d6472f726c2cb09661226fec99a332c427046485e8793eb8e6c2e1f2560b503fb715bbc0e95f88330af0a9bace432aec59157acc4372437913e5600f023d029a1033204550f38741a4b027aa8edbb61e3ca96736d7b277b311194a1f9e21356488c9020261a7c688620c6977863b3dec5d9602430191f4ef3d52f4afd7ee6a2b023db6ba7d083afe03247f19fe94527348 +sk = 1d76887dc35b6914496da318934687cfa1b500876582368fc2b07d9e1b2f6651133d993af870a3f74120c47b3d976b7c5c000e4225a16558c773244eaf75a5f0d67fe436075f4a3fa5447c17dab4fb070f3380514004527160c20a5ca52890b3f671625a1c99983273b941c5a8c750e54604b7b44045402bd8ccac5cbc829eb5ca8017ce442c3958f05d18d6b22c8b35c2e803812caf98d4cf6bb3686ac9acbce919e03011256b2850a93495b7af817b828aa38c6435be1d62bb4cf83c0fbc0f2ee87895d208c381123980ab94984bb5a5be74c896f3d74272c94ee014679d724d1ed73c5d01c98943b6e979c3509a0577433842dcc3530a5b8c8863be9c728770100cd89401424be1298c9c66bbfb8c0d20a12ff884181353a9c3cc74dd4086c4c6232a78bde98a84d39aa726d59a07fac886908789d10b21f76cc7c88213e3c74c2b3caa8369c2b600fd325416536dbba28a798360644667cf667521354a9f2aa6d07cab9edcbcbe6c3de54248ef433aaff1a7cb3815186165b2d6b280d17716f7beee995c98428341753fb5f14098db9b14f96148cc5d0bb7884fb125dae80aca3b3661123a3ac6c1887a94e2941334fc668b671f6e821960a23715d5062dc31c151c12bcacbd7432a5304479829c4891070b79fc73131c892905c2e40901ac6124a366579cb60e84bb727392663b29ba30038e3107b8d0a432e5e8a056835aa684c626592246d6b265b0157eb1185ff48de8d95825bb3252d7361ff0887b9558e0d9ad6b538ba0a80bda97a3b6813d71eb350d173be4aaaabc8cac3af6a59c270207905514f1178890aa26e1569f11af54345cd21111c37321c808a75f815f02999575d877a06905271a9ce5863f6e439bfbbc6828550f5a08c95d49213218577116a9a3a1b0c71548f1eb5e5aecb0e9b15433a4af45465c4c785c24aa3f5d800b8f289692d0b5106b6b9610a24367c5f59055675754c68b171be241ed5a1521aa9eca114d39299565a29ef09a34c65cac69b6ca04fca1a90c375ae4aac647142b419c567582ab313f88971ffe359a31b4051f0007d20ca4c18601dcec4910da0a20dbcf8843c2aac7c964590eda9432805658ff43ac147aabaef0915a3b4959737c6eb018e70484b67486776b993b13b411e6b59dc9644185c743e42b831c921ad507dbe2618e75014b1aa488f3148b792899f57ba4351e1277c3957929003bc898849ee65bb6715a0afa07768beb18cb7bc6f563c46a662de2eb3bb7197a19d3ad9e22b1729955010212562706c6674184c67aba1a4e338746c72956d4a71bf9c407ae54459d376464fa71f70c45a372bf3b1943f5798a2d19787b0501a8ca88fce6547af6ce4be46123c32521c061c87c38f58b2dd775bd2bb944a8853b73a59853011d83f69df94705e31a4124ab10a1db6f05c18715403058d3a34381cd6014879dfc0473b804f3a8112928c146bb3ad3175ea368a0fee888a844ab34e6c486e0ca7ffca1160894a50a7768ebaa3a3bccf9765424a00c2da489d0a14a35d9cb794517dc4c232d804074f0246031b2669725ae8659ac6c6d6061468b5b311faba2a6f6367ca5098a07c357e46cd4a613f3138ddc4011f3226e4247069579b986fb975513390c141dec193b2e3a006daac85bd3bbc8824775a55eb35ba61570c606e60a2fb3c3e8c0503d7166f300c6dcba092c519c09363248e83862ec5dd2d3727e92287e40215419b8d2bc4552a585a6826e3861b498ecc398c982f5452b51160a51ca3846b0ad5955c2537830bb727f53d145a5b86fec230716c003138074815929a791057d098f7b437f34d4c18ef8005edc170a035d6d98ca8e844ef70c63394940d2b302806b8c7eec14658b2b53c04231d5a580cc313418b659a7a1a52430de099a745901fd0989e3908bd4e91e4fcc010b487eb451cf36c62c43641c6f648465f980aa06735e15597f4ab5827421d66760357ab0ce675ab2fa18128c9eb52689b46b11ea85ab51d6472f726c2cb09661226fec99a332c427046485e8793eb8e6c2e1f2560b503fb715bbc0e95f88330af0a9bace432aec59157acc4372437913e5600f023d029a1033204550f38741a4b027aa8edbb61e3ca96736d7b277b311194a1f9e21356488c9020261a7c688620c6977863b3dec5d9602430191f4ef3d52f4afd7ee6a2b023db6ba7d083afe03247f19fe94527348e34d454c5c6cd5d6b10bc7f575ef90d24f6c278eae9842709de2fd3d25d7d703f7ecfc9143ee45e44f5e98fd9ca1455340ec5db4fb098534365ebbfbcc57d34d +ct_n = 9767d90bfc648f8e99ab16d4b307eeff2bc9b577a235ecd5efd5e87dc8e297cf222363879e2dd47b01a6df3e5a004321c4f1b571376c2e40ee8232e5d6b9f8c59d647387549b908715887344bc43276346ae681b0123b9bbf1a6ea08b776866e22d5d81b43090f2a38dee3615db654edb0bc2478c2d13b566869f17ea78e57b803effd14d78a16decb42118d14e51b63060b8c14d3761c821b71b5fa724e89a8e4629a454521c00ec3af1fa0b709062475f0ee942113d654a3248a82904047e02a16264cd7dfccd1d10f1c3d32634f38f58506975b54cb57253d94dac612dce59a1f5ab508e6545e0a1d7b75e14e0dc92d52e3b4c2be5759d73097f5226888ca3b05264eb4bf942d6a93f5aa8a8ed3f1a22cfaa701c19779a9975e29158957b8395f126e74306770f48dfc7104f5f410751105a89450dd638bc85ccf30e05bdfe276f5a4737fc5de75e7cfe09575f47a00e57c596036f93c5907e3f262311382eb8a7490f0502172b740c8df226d637e0addc3671fd4804b150127c0fe27eafa23d609442c73bcd28eb7428eb98901f63505a58cfbe4c4c42190e83801acc741024b189a9811f244d4ba2eef3ad661066e00448d97ba88bb9d0113abbc327d1fe3353045ec54ef285e9748c67375ad6a6fd3eb85f33d5cfa05c1edc1f9bedf6c590940a0d7c602c78e31124928bf02478de67f9dcfd350eec85974abbcf420fbada73cb1026310a4309b774b33e4765166d6046ed27da971e8c7d98c02e2c7a015a25c8d695d01730980be2c7b34eecc988211f7e51cde8230f0f713ff99106c510bf9f9cb8977ceb046834046218919b4861c9c31cd667c98fc9442f4b798e935c7c59f40a5b0e47d555e67910eac45d639e77b95c545f9825e54db18401f84dad11a7c29390a15b34a18e2fe78b914c44cbd8822a57e344734fc127f4e6a205df872631bd2c2fe40f4a91413a18100aed952eb282fccaeb33b704a082c80c4310c86f1b45bd9500f91b7229a2718d81e420cddb5401816a60fd185531d453ae0db1c175b063cde3a8c7f89d9378c932417fa280d3a48c9cbd61fdfc330a905 +ss_n = ba18910321d91038a2506303d2cd4d597a33a78f42a580c47e950a0502ec507a +ct = d43db8d02eb3fe531450e6cb61192ee6b39d4f818c72918ffb0a8f826510d09fa0e5b519c2a661239caaf640ccd8be0e11116d8c74418621455ad93b27d6bd4adf14412e38ba0da52439559753eb84fbbb891b176b3904c24523503f16d94a63aa78f229da7b83a40198a4a7e80a2dc289adad8e21c4d28dddbfbc33fbe191cf3f86d78a680a0cd3587f49e01afaeb82fbd4b657d3b29a7c7b298a5d0586348cc045e933369bc36e50581c9dcd1d26f17277c951572f9aa7fc5c5ea3bc42cc3e6203abad3d6ad3a1b426faa92914607337f6e73aa1c54dc9a8382f7f8f368e60a4b171baee6a7377ede7425770b75f4573abca33cbd5abe439a63cb4ccc1256406b9a8681f07278717527e1ddf3c37a738b4e0e88d77a38af5401eefcd91b79c0fac040881c71cf05d4db2b5c9026f3674d77f06415441866255026dd8b09bb54d72cc1fbb9938fe75104204be15f9306ba3d00a9c50208db9ab757dfa4151dc1b57bc75be06b12757a2a78027a1a208880fc3f2381114c256d402e6d7906071f7cc7a31f76153bc959ce350abff1b975c200cddafb3a5708248f9c22fbe41ef07104173f6ba7cbdf1c9c714f5b2074b6b20b9874887388f660dd62c2dccf0bc1f93b6e28a3973e22a7207a7ae564010034110983979fbc5771b54a06a0fef4e4de86fbfc025b8db684a716805315e0b20e1ee2a7d84025085e4eaf192a5c3ebec3ccb9bfb72746d2833d98c660d9d6634fdedff07c8586c0e606a2c968349465b723cf0b4365ec864d8509079d7a2a5cc567a62d64597222d2791d92215a5d4ba3fa95929f40a157ac6cef9d1d7c25762aa6010fc441761863a359c5a4ec40e3c14655097890403515318820a3793c7b95fab5fe5a7435ec2615bc6571e4de845f06938ddc550844bc85fba3b339a43345272ca3a8174d2bc2446b92ccced443522f20c61d74144d78b081c6e9d38091ed16921d1d6dce47f31dd81c4d91e6e86c640a3e1928dad13693ade6aa803fe44874e95fcb92cc546b607e927093b8f706a5e984490fb1325cc7fc494bacbf360904dbe39d4d65314041f40d737f105 +ss = 223bf148d64d4f49058394868086b514588dba33cbf105fb31c10f973750ba94 +count = 7 +z = daa360ecbb51bcb33f5d36f92fffe77c2de7ed43d281dcb5fd68cfa0ce19df2e +d = 859c3e3b13f3cbf5cb860bad2fc6393a78390b0165800661a8f1a7436787c669 +msg = d38cef643f9c6d2f6a4ba6a784ac1d81b32a073e531f79919912d4db70b53075 +seed = 343b81870e2721dd75ee0ad7fdb269eb5aae0ae83a6316ad8ece3c76d3dd3cc391f1b12b22e988c1257b5f56d905a06c +pk = c6db164c812637e0be6a0071251746b89301c2f75a6cd709bba870729b80f5c2cae7e4a9a21751193bb0384ba9f7728523e8a184e7a9b2953af8d96e23218fa1abcf747701a6934c9ae13d6920cabbb6b9db30a57391352b7b78a071985e4464d321af153190173accc8226c5d5942ccac6d59223e943c30d1755c50db56c003c669393cd0c8509f91165583830f415fd6c9a2db939c2280c52a5a04baab42a488ccfa16598b14a3920b561065bd09e732fdb70ec9237fb420351ca966a28c68ef26035673aa6e6201b95464631a543a78c7e0d3691f831abfb5c91dea784eec3561b39800298ffdb092ad171fe7453878d85bb99619b6eb823fb1846c833284071575167a42ba4b383997dc969147a17fa165621bd3c13fac01dcf87c04f58767a7981548728bebbb6140af9da4076d607db954152f69c4132805bde3cd7a8771a2e9b23edb66721b39c098722d2a4c77004fb38778703a3d9c55ae26e33dcf77911483861fdcc3d202473b07a493b178316c6ebee69bcb04045b991d72b677925000e6272459ac5871f3866fb6a41b70658f4cc669c89e0dea154ef854fdd54565cc0902746face08e4dd03cb707393d21bc4ff23d4011bb6d566ec561999fc69928f35a6af18b339490c400ad5e24292c7baf2936b504e927a3c022d8b9b962fb2b785b8bda7161b5467539dab015f2a9d8f20f873876bb6087c27c73f5c11cd3d49e117469d5907d70798cf10a8cfc16781931af6a9289ca9a136a3052a350bf4977a8b80b65b29aaf95810c05d958b4a3660d085e58b34830f9ba50b4a8b4250c8881c6ad57330894ac0e09c4add20686721b5494642fd07fe368ab2359bf956709c980437eb034f1364f6fca74435b3857c5066a218ec4cc626bf7868531c24a569ae2900de46c48f9a80d99fa06403a5390c527723b0dcc243a1250a2cf5a90a72bab94b66d6d5608238c20c9d423733491237a9d14ca54034642e3c526e03a83f4c3cb6e6b0c8ce83fe6d97fa5e7cad61b5ee73c396f36081c3a8778a63c496743b9b39cfbd27ce9cb84993acc7a1726930bb7aa220c8f6c90e22152230e9599baaf8924686ebb9c079b721d93cd938b900fff7bdbc42e8e1cf3c37d +sk = a2c34e1f7ac5a8f35763d4caab646c4ab12d14950b1008418e45c916f8aac53c8ec2a64dbd6311d4aa8c5dab893dc3a9a99832b4b6a7ca16cbea954bfd814491d3644dc50d8b65bcbea7911aa4a72fe851fc031ba912cd4d2312a5454627a1bccf8828f1928f640a5753401c76566f17e783cdf00f1f27a3dd375bd5e61d3627401b4941b0933ae8db1e2fb835ecea91fdb51fe0186506a2bd2922cb909c7ea964818a0422a1aa2ec938832aa5279c52b451e713cb962588e9409af35cc7f71c362b3ead02847e7a6ad560bf0cf605aad5b57e93be5d1a4e194366aba95716112cffe28d39a54a722426f18c615f616f09805e2b880e677642e10b58b76c1172d0165157c284cc275f84b01b462635e699af01b5d880239ccb99dc0972f35bce7473704a7a585b8121579b9634d731f7a1b518479c46eb8c2db8a048a4af4318690bcc9c05c6725b3044094bc834d5c44b402cd92311b949373b37cee3f338b56b2dcf47563e37b94e811f4b03c7e0348b1529c69998279a25ad26c24bea395b18e2a746e8733b01beeb0856a4c82ec540895ddc2c510a625f971dbcb56308593ccc25081f7aa1d1953440023b86c484c74893268cc348b6177742c09f534d2c635b22b175898340b4b2529c644c2e10128c746afca30d93a8ba4dfc15f7d6a845777ab942c1934b3781a874414bbd187c31d3bca881e7b8e65c22b5524e4024526447159ba6585b246b416441e34c07bd5828d9d42aea883ba4c167ff147f6ff5937de523cd07bb462932310c45c960717dc50802426f8fa6177e22847f222b6e7970ebb3c63c562da3a04698bc3f3689a3325897c3db175224c42a7892b88c93ebd29147685987ab1862c69a69f02c74b8829cabb6473888ca513cfa4b1328861a00fdc18dfa2f9c34833de392b09919f400210881a93830cc1a7ac3fe4c0f7c887f3eb894a68899727a5030047ea081671c6b44c2665b6899c23ca0850bfa6912e39097e333d38003dd58ad273954c5dc52fd30779989286715222e658ba773336efb75e6d24895b96164c06769fc692b986471d2957795898a26b752c68cc6db164c812637e0be6a0071251746b89301c2f75a6cd709bba870729b80f5c2cae7e4a9a21751193bb0384ba9f7728523e8a184e7a9b2953af8d96e23218fa1abcf747701a6934c9ae13d6920cabbb6b9db30a57391352b7b78a071985e4464d321af153190173accc8226c5d5942ccac6d59223e943c30d1755c50db56c003c669393cd0c8509f91165583830f415fd6c9a2db939c2280c52a5a04baab42a488ccfa16598b14a3920b561065bd09e732fdb70ec9237fb420351ca966a28c68ef26035673aa6e6201b95464631a543a78c7e0d3691f831abfb5c91dea784eec3561b39800298ffdb092ad171fe7453878d85bb99619b6eb823fb1846c833284071575167a42ba4b383997dc969147a17fa165621bd3c13fac01dcf87c04f58767a7981548728bebbb6140af9da4076d607db954152f69c4132805bde3cd7a8771a2e9b23edb66721b39c098722d2a4c77004fb38778703a3d9c55ae26e33dcf77911483861fdcc3d202473b07a493b178316c6ebee69bcb04045b991d72b677925000e6272459ac5871f3866fb6a41b70658f4cc669c89e0dea154ef854fdd54565cc0902746face08e4dd03cb707393d21bc4ff23d4011bb6d566ec561999fc69928f35a6af18b339490c400ad5e24292c7baf2936b504e927a3c022d8b9b962fb2b785b8bda7161b5467539dab015f2a9d8f20f873876bb6087c27c73f5c11cd3d49e117469d5907d70798cf10a8cfc16781931af6a9289ca9a136a3052a350bf4977a8b80b65b29aaf95810c05d958b4a3660d085e58b34830f9ba50b4a8b4250c8881c6ad57330894ac0e09c4add20686721b5494642fd07fe368ab2359bf956709c980437eb034f1364f6fca74435b3857c5066a218ec4cc626bf7868531c24a569ae2900de46c48f9a80d99fa06403a5390c527723b0dcc243a1250a2cf5a90a72bab94b66d6d5608238c20c9d423733491237a9d14ca54034642e3c526e03a83f4c3cb6e6b0c8ce83fe6d97fa5e7cad61b5ee73c396f36081c3a8778a63c496743b9b39cfbd27ce9cb84993acc7a1726930bb7aa220c8f6c90e22152230e9599baaf8924686ebb9c079b721d93cd938b900fff7bdbc42e8e1cf3c37d1590c57e48ff8922d1a4348b679a1ef43a24d747bbddd64f1f3c8e086099cd99daa360ecbb51bcb33f5d36f92fffe77c2de7ed43d281dcb5fd68cfa0ce19df2e +ct_n = 19b46e942815df5b1cc8d669d0644cfaabf9da05e35243c9c489a48e8d2c470ac68ab3c1f70b3930ade530ffa91af30f4c1757fc50ff706d75cabf4a3c072143f5ceace47aa094be5031859f5b252097c895998ca7a4514a0a4bd76b6707bb7d7968e7529c26e12fdc29e16afc3345b71953fdcee48190e9bee8d6df9f4353a7e12bb5402c14bef998d6edbc74702e0e0157eaa6b048dfac2f7a354408383269cf8ffd6c88969768e5ace986c2c0f848a63a2611230df97816b354073a2d1fbebc98d9c59dfd2eb1e4789ddf855403937d30f8df54b24062fb77bc56803dba2337e8dce2db435e701ec2f8464bf3168ebfe4c71dacb171b43c8f796eca800a638d7b2dc052f913ed9ce08212cb0124f0aa36e46d898a6930df71d04d785e18df4d2a61b426ee19e7abb85cd6263fb43cc9b0bf3a7b9f34b51fe4b0bb3828baf98fe0b1baa323b64231b0ad863f522ebe3b7916f298381cacdd75b7bfaa75fccfa2f1b3684e1fe16a9df25e36982ebac878f6eb45918839f1f0c5d13fcb6dbef1c9cbdb72cf5c38cc4e79ee08f5c7097fa6ea46a19dd6435bc5170ec8424d34cb0f7b96c73071618370101576bfeac0d288c2888083a9b697eebd9f77d499f3d4ab3d612f3d529e3a04d93675b5cc37b07dd1df060e630b93c05815bbddd6e798a1b52a2a6be4b9376e7e0011e9bdf3ad5477c2b35e7b6dfb5f6da8605151cd3546a57d89a70375bc4af0108823ca0350687a159d17a7e87766681f71c9252430b29f72deac7e6f478e3b0d64d7d74356f0823bfe72a8445c3c2b5ad6ba1d1d3fec90ab79243c0c0a4f14a48ade462c47c89ef635437b937f30686d47489467c847db47faf73bf2f95dddc3fee9deb5fa5107a20e683396c21aad0d83133e34a026b5457f17e21f05457e4b489c72df3dd950f7e820f5f2aa0a6409a237108a35efeed99ee11424a79a1aa8ba9ad98f4f5eb221c9b352885653dd062cb155906e07943bef64515b9a61c2aa09385f8fcc20df8d090febe6a63380aa2319913dd9a9165b85b45aaff8e2f6f1df15f6734aeb5ed2e4dbbe6724b2d1323825c2cee8 +ss_n = e2135160d7b43285fe8705044d582280f77f079d9166ea293d99945b87752f8b +ct = c8e9136fb6114a8d637eb517a386cd98a1d447c2252c854c998d59601b1292deb211a799c7a484bc78d699ddbb542aaa7e38d14fdbbfc7a348c2fec024b3de5eaf534186a70bb615ae6b8c89fce99d2bea210b8547728c0c1048838a15e645d67c1d3008e08e99552457626c12429131401d5a13beeffbdeda56dac8a2184289fe2cb11f24c0083bb86cf8e3c46c36ecbdb94464fb7fe78a42d72b343e551e711ed80d51e0139356119735e81a672f797af02c756dc5ca50ffd32c86115f2b4cbdeac909c1a6b5953dc63d4ed0d301362b04750a39d9a3d6df35347a9a3b9a716f9029b0fe3ff25931c79fb1f03115f449965ac99d75ebcba17a0ba713d1a7e5f58baf3943ca863fa08ec47234ff194ca82a2ff59e6c7eaea06665b8892f51f2bad273361812eac091296f8ac897aa501d406fc54c0e30e7aa6d966871c6d4a1723eda30f84073d15909f2cfb13ef5e9b7526c4d473270d3faa69f75d0affbb0bb69f24a86f2708018acfc644acd047105adcc57f668471b597b0b35020cf65e0fd8ddda29a45e224cbb9b7fd8f7b1a20998811e242c28ae617ee3053fc8c1fb48b333cc633b49e1782119b9757935b922e0e81a2d9e85ecdcb7296fee0c9f0c171c7aa019351cef68951281bbbab7af2cb68988d4be4dbee19ad8ee6e5676ee2f752586f8018c17ca3e7d13d676601a706601cbc207d00629552fbdfb7825bbceee5c58f3507554a7942ef3421338e61ebfde948747db394b61686b55ceb8597cd0cd1909f3f0ff154aaa719ccbbb1c5441cd4fa14b80bd4b3fe81d6e91d4c89d7a66f71bd2e67c13715679b748d32364074b480a022c2bb35c339564b3011bd49b1437aae248756921513d750e1d021276b10b50b83d67c21e35cda52b44756d8f9942035343c8278c4fbcd165f25b71a852b411594c85ae04ccaa832756bf2e5d8f9da2f543d0bcb9379045a1b1ae2d25010bc264cc0aadb6430006a864909ea6c3c5ba79903e13200219b63db1fc24b35958f412ec482443fe842a36e8146330ebc4ae1c168be20389d02bfdc7ebf896dd708d7f9a92d724b4bc7aa62e2f +ss = 5e4c8532e6b9e6b367fca55d2301047a92c25a367ea0278ae1f15a3d05b3e5af +count = 8 +z = ad10ad3409a90c4b24ab0da526f289209abcb1f05c86c7e4437a144c91e1c867 +d = 23ca80a61c0201f08d6b9bfae101fa573fac5581ea3e54daaad3ad7a00be5716 +msg = 81c5839b15d7335676dbeee048f6bca56c4976331b5df39a212bbc2a450f4143 +seed = 406d9c95f9813ca6a9e6071d3a7a63093f9e00cd15ee968c3ab28cb7368699491e5662f6b63721fe059d50295c3a7516 +pk = fadc1a30aa7b3ce44565c67e4884622809129356bdfef2a03326b17caa92a66830d49507afc57989771a9d347a387c817cb36c4b28b84e694712c8ae6de079abf33d17c88705fb4571c1107f2367e9916e62f91c58dc704dc0521b95c3251c60d44ba97ce127f3fb6f1bd88def572073400938732dbd3166738477c24a49367119d0f419903acfd368550c9c0302d72cca633e2b0ac10d17bb8073352944bfc55198ed515ea0680a85699f53b622cb016ca2b523eaa0b4e86306c9d779b1f1783f72ca4f404946243713dacc41367c7f9a9700ad21d5e615728a1d984ac981d00f4ecc3403f8bb4a06056cac5f74683c3224b0f413c59a145d6ac1b84a90967734199162684c8b648f52164c7c7a58d7afbb0b91ee038e98305d56eccde4647ac4631c65d24bfb410bce05c7ee89a92da68dfa38c48123856549cfb1d775f9c73b0d580a324783d874ce27c105e2ec13eb2463b82729947699acbb989e349e8ff97334c11bed3a511681ad3aa99e010a8d69167ecc8cb0db718a691acfc6e490dcd82f771710039b73a8d2381ff24d6d0a0e1780a5877b96647c4fa1fa2a2f8c8b9f73a1176c1874567149636edf069b57ca3843e6a5bc2372a721594ae8bc48b317b323497fa23363d2998b564a99104f29e9cb16fc355ca28f05ac0d5f12c110a020eb955f4fd2546fa584ad679ea0e9b67b62bf11c896742c0e5ad1c61f897d6854111e653ee7ca1dc0b5896c6819664c50c9e24cb6a32ea27b748618a42e9595e826b6895a87d5ac968b439af5281938021b2762a15b9691c3c324747a43814aa0be9690b0b51b0c9981c3f055d2c83f4ad31e8ca137bfc066d1b85451f838a915c284b522b5450e6e0a803a195594a91d6df351fb9a965880bf1ba4a804e98bb2195b225a6581725201e0b487f53f0e4cc6a2773307d932c0d3114024c730f335d46253fa9c7af42656cbe98b15911e0f7b0786492d8f9ca84f625d467376411ca1253b60c0c564c07ac276d7b8fe61a2e0904d12d92e9ac670758b786c974767cc205421992419512f84280355bf314b2facd07216e9a00a531e751a2f597de4c9afba502b1ae411911f919daa583978111262266c31d977684759bf4b +sk = cbf9cc85db8e85d49e48f261ede58d7f6411ef29252ceba8d60ab87b7475b5d6bf416b7fef93501552c22099af787a9d1da3983847bab8fc26a135b875bc989f34a9db48505575bf93c8477e00c2e54abb779cb77b580e4f3ab525684f5d37b6c942cc907396b9b93791fa274008c393118f6963a9043c0c4542b227738fd1a71fc845c123fb429c7c7aaa8571e2e7be85c68396290ecd6cbf5970af71ec84705ac571689420c18f45860599d24c198625a8357405a18b56b2827a2a40d58b3b8e8bc45dc062a4d730122683fdfb771e0a7523d84e5e305d7c4a0fbd5b1b4570507dd2b2670698648a5947799ed23240964a98ba06211010545d0c7483997a6791c0f69841a077a1e6ab80a5b3a4797c87a7b0b6fca5431db0bb2923c5132a700ed16a15a8685185c4205865bf4727f2e02fcb620a2bfb369a11002bd53e93c97ef2b73d601b2a2181b4326c304ca21f13b2a6e345939579503063c179955293cb852f873034b05d723b4c87c87f5d93a22f3b4e5df1310844b18235b06f97ca4065a4bd878f97478f1d2b66a7991cabd840dcec8bd88911f24c20b24cc8c2f813b20a4312cb8ab0847c625b8ee8315255e93929470f95212901f9ce6f887999d6cded4c4826f96e3b97935e31947f93571b66788249c86e167f0f59343e7b7dcfdc822ec71fa6f37a73c080f37833b24522b935bdcb872947086ec1342b182277ca3709ce7a768321b11f0425e50003c1a80866b58b4a009c802523770085b803854421919c49bc3063cafaec6fd551801801176cfc4889f5768dbcb58fd522f7a77b8b28473ec96a112aa78790a76b95a3bd5caa4f33bd78ca45c9c964aab76790542d2de8c3f007c099aa260e253cce4484f7da204406ad2b134d9cb13413380d95f870117b8f63c85ffc2549a6b86ea8ac504646905a7b442fb1915aba76b2304a73d61ae9c525b76003e5f8ba02c0943a892a13649754d18a4ee5628a5303d1732fa1a6c76e7b8c1fe4aba1ca211e8a56b4465a9331cf989403daa9157d04980c5381e042c35560c317382464d334bc309b84cca693790596081ff8bb89fadc1a30aa7b3ce44565c67e4884622809129356bdfef2a03326b17caa92a66830d49507afc57989771a9d347a387c817cb36c4b28b84e694712c8ae6de079abf33d17c88705fb4571c1107f2367e9916e62f91c58dc704dc0521b95c3251c60d44ba97ce127f3fb6f1bd88def572073400938732dbd3166738477c24a49367119d0f419903acfd368550c9c0302d72cca633e2b0ac10d17bb8073352944bfc55198ed515ea0680a85699f53b622cb016ca2b523eaa0b4e86306c9d779b1f1783f72ca4f404946243713dacc41367c7f9a9700ad21d5e615728a1d984ac981d00f4ecc3403f8bb4a06056cac5f74683c3224b0f413c59a145d6ac1b84a90967734199162684c8b648f52164c7c7a58d7afbb0b91ee038e98305d56eccde4647ac4631c65d24bfb410bce05c7ee89a92da68dfa38c48123856549cfb1d775f9c73b0d580a324783d874ce27c105e2ec13eb2463b82729947699acbb989e349e8ff97334c11bed3a511681ad3aa99e010a8d69167ecc8cb0db718a691acfc6e490dcd82f771710039b73a8d2381ff24d6d0a0e1780a5877b96647c4fa1fa2a2f8c8b9f73a1176c1874567149636edf069b57ca3843e6a5bc2372a721594ae8bc48b317b323497fa23363d2998b564a99104f29e9cb16fc355ca28f05ac0d5f12c110a020eb955f4fd2546fa584ad679ea0e9b67b62bf11c896742c0e5ad1c61f897d6854111e653ee7ca1dc0b5896c6819664c50c9e24cb6a32ea27b748618a42e9595e826b6895a87d5ac968b439af5281938021b2762a15b9691c3c324747a43814aa0be9690b0b51b0c9981c3f055d2c83f4ad31e8ca137bfc066d1b85451f838a915c284b522b5450e6e0a803a195594a91d6df351fb9a965880bf1ba4a804e98bb2195b225a6581725201e0b487f53f0e4cc6a2773307d932c0d3114024c730f335d46253fa9c7af42656cbe98b15911e0f7b0786492d8f9ca84f625d467376411ca1253b60c0c564c07ac276d7b8fe61a2e0904d12d92e9ac670758b786c974767cc205421992419512f84280355bf314b2facd07216e9a00a531e751a2f597de4c9afba502b1ae411911f919daa583978111262266c31d977684759bf4bb8849a74d37e5c362e0921afa307bc501b6c11eba1db6653c93d50a2e7600659ad10ad3409a90c4b24ab0da526f289209abcb1f05c86c7e4437a144c91e1c867 +ct_n = 48a940fd8ce0a7105163738acc8abebff47418a4fbad5d680e4d3c6c597dc47f268597b2c4c67ba3043bacd853e5ad8a07158f518d5b4d5c59e76ce44978da79866a7aa968290f550b97e2588bcb6e15a1b7c7dbc4b2f06c2b51723ab3522c05ed6139b5ebf4969ab80ea9e48b6159b79056ebdfb152a1d104b9652294bbc74aa482c7f5778c460d17bd912dbead475d1737afcf6013bf9e20c7fb697d4e929a9d1df5a3a9b4b89f1c0a8bd6b72ef59a6054cce9e6dc23d37e25b63f95a709276a3329843ce95131bf9e515e0f86daf834a11fc2d005b3fab7a99b8b52efd75733a2825c77b7eb1d6f199843902f6088434d92c104e9a606abd6c91b4deb3aa5114bbb8cf94c5008b3c66baab6ca51569481207f27306f10d2a4e308403f75d5a62eff44d9d69485683480bd32b17c0c3614f7d3230686cf95e3313504afe319358f670ae48ce542288c139e0bffcd4b289e94c61b1cc90b3f73b39a8df71996cc8dd3581c49b66c8f3b981d14b8bd9f94ec7f3368649f8610819008a9127374246d98edfa7bf46dbbfa6c9781c6fd09046c775e3c682af91226b6ef39fd85e9571b39f4874b9133c63d27ebdc426a848cc5642098cacb641655244dd7262835efaa96ef236821915e87e1372656c6f882c11f6b9570d29e47d29fb40b452d8c98e2eb795e5df84231475c83ffd9fff771e12ea83fc789f9941027f0c9eff1d379ffe1abb35cf05d5293506f99278df98af82586ef33541527b47362d0f91a48e1e0d5e0000d4591ff21095ea93dcc1b8e4a77b23d19b5999ce4fa64325e1be4295a54819b1965a7b4691bd290f3a08ed3f053016e0a745e4872a9bd7db905d0d2702b4a264db32846f547d9ae6627c27ac4865cf498520c71cfd8f983f6ecae28d4aa8b6302727e65e21c94dd828a84474209737df2a96438e8ad4b7a528ef1ff4fe25e47ebcf723dc0bf8bd35dafb2d99dd4e104e26f8a0ce7b8cc8ced69db54261c3f86fbacb3cc443ae6baa50b627678ec9bbbf38711cad228188887ddbc68936b926c353db32d934f2b40c76750e59dd73c3c1f5d44ee82976e375cfe4a +ss_n = 97617888b3681dd47bc833ac6ee1529a87b77f7dfe3e5dd56fe1d85172cf1781 +ct = b0c55be36b8b88e9336a3aaf8c16feb24bd3e1d18fa8baf8b65df1a358232fe220992e9f7f1c916a727759c03a6837a54f575b30f7296873fbb5179b60e2c8ba460d66cbccd2fe0aee23e98953a80b6eecf8a85e664d282b7f3fff9660446dffa454e75e17436d2522f72ff507ff6e09f9f5e6f0471beae0ad1cfaf61c68fb281b5954dfc3936a884030182b4f8b6f2dc4edc844125617ad342a4ab35a336f86d6705090c376ae27420b207a968cd1301439a02e3a69c82e9189883eb216eb376a7958e9990a2cb1db3674039cb085e582fb61e104b90343436f01c76628aafff929b4a8842e7158041603293ad4129948c8dadef451e5621692d34e244e05e37615000fdc1211ee37365fa183f6eaf0c5f3b5a44b0f36e5770fa87fa55f4b6dd328185346c7abb1c94f24f96d8dd45d47c16cdab869ca97d8e16a1aad5bceb60b6572871a16ac416456db321190e7c8c1a2c98e3bebd70e1793e73e4bd4743b174e234c6e540769e81eebad5cdef650931d9c6cbc75178a593b59e96e039def2ed96f0cfa8907f362579319cd78f9c46701dab83f6f6921f1e923481a9656b149ef0031b6b1e048135a72947e388cdabf17b6a56f6c100a7031415e8363dd6113504ad056bac9ed3b071d16bf11e4cd38b416ea7c442fd5401cc18c24decc2cee9a19ac06e6c140cca9ab0d2a7a90c352e2417708442dadea9fe5f9d8fc7da4de6743bd2e7837e741f6d1eaaeca422d45f2734df7b10c4e6185043c29183f9e74d6609b497fe19d91aa30c8a4a743987e60f91cc0e33c72276d109efa59ff5ffb4bdc236790f809983972dfae8c6077cbc0a958b1e6e9444d007e74b901a36f37fa610f7c6646e1794e9b67501b6f31166cf442911499381edff83a6ce463118da475fb500803d594ed1e01277546a01a4e2ac8640a02f179ac679b0c562d93b7630fe3a45e371fd7d3bf25381dd0b63b91ad0a50c2617018dcea3322467c3f00f910a96d6d1767c72d6951215ad710d81db4fae75af9b43ab3a8269bb72b9f63ce09c8dff93b8a955936ec86837a59317c93e10c74953527fee19d49a6bc5e +ss = 7f4b09952cd63b05f5269f7d64092b9fd7a993e052eda6af0d6951560b1c80a2 +count = 9 +z = 793871afccb50f4035b9788c7292b717939aa28f5094d99ee262047b15e42deb +d = 4873d1be6c8d109c0a8f765098aa6467b2a1caa74b4c0875fa798ac727ec4f67 +msg = 9aa488f44bf182090015d67ff8db894c355f1f588d32dea8dafdaa1d1404ca88 +seed = b3c83c13dd15dffe58fdb6026d32e33e5ef24b094be16741dd5b587ea841ad19b6f026a127678849ec1b459a365fd645 +pk = 107c2c7ff0829ba53d236941d8a39871d15a3d6caa23ca01ad7cb080ba1ad3a8ac18b12fccc3520220431d00016790cab7b99527088479b8a2af2863ec6cb808958a13f4089e702cb2b1cdd3bbbb893588a000aa7d9888785a198d5448b5d844d5c7c28a414736073b98f5c8acba00fcdc9a3455b310c8b9b08c224727150301cd7748137391955c099da12400b5945292320c5c8528d2cc983021a4aa345c1af5505a8295115830dc9b4fe79b4e2dc789eef84aff8abef56b5e8de77f77a35db6806efec09d85f53090900d498a1498b82980d6c9c92ccac05cc683bc64a5361a311239d0f186e5f4539f6a30264a1b691a6b254a50cd13b0ea0593df6a847b495d678842d021845eb9787259cdd560a3b260a2af93523a856e630a27e6f9c7a122a5ed25c4e6452f82d60921c7395f7824e8563b6462bf9eb7b39c2a1a5c29b174847be8a9b5372a51d57c623b3a5eee957da8c15d748139a775cf283a4ae1846e53435e18abaa5e59b00fa5646e867331ca7255ab917df62e169c4c564740cb28b3dbfcaad595c7e0b2201be7c12f22358915be5da08e62e9b40ea96c62fa3eab051c76c0bcf54519e46a11bfbc9848247a8932bc96f3c58d9c7980f07078a92419145a34032b5698ad2226565b0486ed1b112012814c0aabe55401b3fc2a4c920d431b0f0179ca96f9947188a8296134e3553d7777717fa1cc3f7b98f8a98229cb7707612628ac6f3d0945bce3a8cf938c9f5b29be77bcc8d851394943ec5a21d073c5ee8a426e8625bdc839422ba9ab18b1a1127b9b46238b210c6744b0c5a9a47bdb3864f3a5318baf6df6b33068443141609171b557b0328d5b76eb579693f260b5f17b26f5696e63540c4297ca2567fdd030764125bc8474f926c021ea7864213277b25cb9cc1e1450c8daf351d4332eb5941dc4d02aac2010ca701ab0405f8585196e478a0f768b9f9288acc2cf1b9c1672b898e7f8834cc54bb90834d09ccc2b556e95933be96a1a256aac587395d3c9892f5038e12817c6b859599b5e75ec1401414d4af21ee12855c4c6bec77050f98bb407babf1e03c42e104730874e2727ab97413232eef79fee921d569fc75abf3543cfb5d7bbd2fe0ec4e6 +sk = be4509dfcbba56a2c6717485c2dbb3521c736ff51b4985b7aaf053b910043c4102a1b6cb93b08938353663665693c6cce6aa068ed9c5e925cc81f971bdb53567d480ae2642cdd0a8bdd0af5283ca4ab579c71a4a5a739a6e4818836425ee49738efc4e5c412af20141bf18c60752cf6762476fb8b9be998dee23ae34d27dda752b1f86b6d8109c0c10c5c4b51b32c8c7d33c9f9443c87ae8b03cbbc887b4869180ad389708d628a0bbec73300837c3e32982e717eca1c60dc6cc7bcc06267950535a85030bb028ba6697f31b779b9efd82ba8c4a21c4e097f52870dc966da3ba4517d95fbf2a420c22af272509fe352a71bcc5bddb65e43906197b374fa4473222a9a813a59a80a3469b4b0527932ff24441b00c220ca47f2a03550cb39ecc09a3378ccce3bb3110a6dd6334191c3aa81cb2f279517b295494b53876589c00a345b3c74fa7b259d9d262b1b7a522a534204892daca20a0580c357bce9d1363016b730649bd1b007731382a3efc4e39b40f69b5ca8b8143ce51640c04d0326a3c4b9c4de627aa31c18ed9835ad6bc0e82833a06f5625b393b070b12f4e73ee7a0021d398d1a06a36e212245656112285810a48fabe13aeff132363570680b18906b85ea17465ba2a02592c0149b86cb4baeb0daab08b344e7f635946a7570108fa98434c6d12320fb7d34e9c93aa3ad33abb160b6422ea51067d11c0c757b4f174991abc45c53532711aada5b957adbcfcf203d16995375ab04282220545896a039b4816ca9f822369574cd62c6059013afb2d31b2fcab1e933940da775934b62e1d42493126067309f394b6c037a9a3546824f5a23185c8a1e0c05d4398c30715b8af73d70c821405b35c2f4c4960a00ceecabd4397d51d72af17b01df948bee816a7a476a6ae5832ff375bd417567a09d4ed54976646522a6aa87d11e36c59e076c24685c9156e034dfe249e96b21b57089daa99365467e7fc2b5547786cee0080b08b51630a2847422fc5487113153bc460b27c961193aae20dc4c3e80a3308678a6477330e0a14ec943501a4457baa40c59a7f0a817da3a6d6d625d85ca77107c2c7ff0829ba53d236941d8a39871d15a3d6caa23ca01ad7cb080ba1ad3a8ac18b12fccc3520220431d00016790cab7b99527088479b8a2af2863ec6cb808958a13f4089e702cb2b1cdd3bbbb893588a000aa7d9888785a198d5448b5d844d5c7c28a414736073b98f5c8acba00fcdc9a3455b310c8b9b08c224727150301cd7748137391955c099da12400b5945292320c5c8528d2cc983021a4aa345c1af5505a8295115830dc9b4fe79b4e2dc789eef84aff8abef56b5e8de77f77a35db6806efec09d85f53090900d498a1498b82980d6c9c92ccac05cc683bc64a5361a311239d0f186e5f4539f6a30264a1b691a6b254a50cd13b0ea0593df6a847b495d678842d021845eb9787259cdd560a3b260a2af93523a856e630a27e6f9c7a122a5ed25c4e6452f82d60921c7395f7824e8563b6462bf9eb7b39c2a1a5c29b174847be8a9b5372a51d57c623b3a5eee957da8c15d748139a775cf283a4ae1846e53435e18abaa5e59b00fa5646e867331ca7255ab917df62e169c4c564740cb28b3dbfcaad595c7e0b2201be7c12f22358915be5da08e62e9b40ea96c62fa3eab051c76c0bcf54519e46a11bfbc9848247a8932bc96f3c58d9c7980f07078a92419145a34032b5698ad2226565b0486ed1b112012814c0aabe55401b3fc2a4c920d431b0f0179ca96f9947188a8296134e3553d7777717fa1cc3f7b98f8a98229cb7707612628ac6f3d0945bce3a8cf938c9f5b29be77bcc8d851394943ec5a21d073c5ee8a426e8625bdc839422ba9ab18b1a1127b9b46238b210c6744b0c5a9a47bdb3864f3a5318baf6df6b33068443141609171b557b0328d5b76eb579693f260b5f17b26f5696e63540c4297ca2567fdd030764125bc8474f926c021ea7864213277b25cb9cc1e1450c8daf351d4332eb5941dc4d02aac2010ca701ab0405f8585196e478a0f768b9f9288acc2cf1b9c1672b898e7f8834cc54bb90834d09ccc2b556e95933be96a1a256aac587395d3c9892f5038e12817c6b859599b5e75ec1401414d4af21ee12855c4c6bec77050f98bb407babf1e03c42e104730874e2727ab97413232eef79fee921d569fc75abf3543cfb5d7bbd2fe0ec4e6809bd78cfc3967821d5a780223c3c66c9292f5f11c25ae14b55e15dd9f9fbd03793871afccb50f4035b9788c7292b717939aa28f5094d99ee262047b15e42deb +ct_n = e66b5d39721e9168ae6958942e6baff79da05cc1ba00ac76f49191806b4c1081f40d2ea5acef8813e8ac3fd763e2a1c4b0155fbf5117c35137320a20c05c9e9fd3c09e76919a2b3eae942a25410cb59eee75ae1d60cbbe55fe11d05ef3b5de8c7c81b7df004674c67b8039a580d70582576355914804dedbc4d0ffb21f40acd34058bdf08ab48d51850a26ab79dc8222f3a1be18ac0bc6780da8c1bd099f7384d254adb683e5bba9897260828fec7b8ffe3086456bce9f26b20cc22faf8618ef7b493ae8c940c06cf6dc5b534c2effa51e51e6153bf77aa8911532b70ac2b66c5d916924dd36f3268b09975ed08cab97097d2d268e3712c249f41531e64270d9ef29a44e7db14bf4d51dc937b17922e6dacf3c18fc8aa583e5ee6c1c6752e242306566fb67e06e7e4564e7e3606e7937740006b71e69fd9c449bdf915c80042af57dfbeb7fffd0b5bf5064b0cb63562bee0d4f9a3a6e0c53dbb7831399a0b7207362cdd695beaca092ba797f7b7c2a32a7c012ce63525d534cb7ecad2037e4e326d7bd5ef33a5f643efdad38cee892c76306288b630c622b3c192595e4c1dc3cc581d1a25374e177afb13a94fd0a937c6b63730b986677bf10053dfb07c6c3816c7f0a491b9de173a200a330f2fff37f9589dab5e2dc7563e9120f402da8724ea02016f48d59ff754174ce6cee2af27e581e82abe56729920cfb778f11df83b7048d9eff1d2f7ece76dd839172ac5b7ed17433f4e9d7119d1b3e1b29233b3696eb2f4c57fbcc8e39847403e56c82fa47c303aeec6a9947f6670627d04d32a4a22c667432853c473362f9f65100c9ef01fb33fc2605009d8bad5c7d9581e6f6ebe38e250060f9ef990174073c7b34a7f144bf4263f6b3c240d264c3b203abcd99ceceeed4610060c8d109085d9643646ffdc9e89c86f7e545d5dee4ca3220d4cd04cfc430ed3ced5f6cffbe1962fd76839a76cc971319dc618055cc8e3d41c1845bddfa4677a431d7a1d53e67b99c9ed3775d689dc48b29ab6a2f77c6d8f10d78686d818818a5676806d79846b729b34ede2bf06d78d9b11fad507a2e563d3f0f +ss_n = 65fb5d44b3e130b7f84ed0f34ee686acddfbb5d14a217f953baf0159fb0bba87 +ct = 76ea557f0c5edc5729ed31cfef564f6c43f94525214910c75b317bdf9672671b5cfeb6e8238999802b4df17f0d32ea98e25dd52b9f9d9c6b6c806df57f4bc111296ae9678c529ba5db00130f73e7b11ef7a5e41f4902ca2a0a1656d670a60ff72d935674090776340c4ca6061101b9866655293bdd17238f86a959909ffeba9caf895b2710fbe56853e85e5d700a16b0d85c51a9f53ebbc9aa6b128e708ad8600e7e8ae5d91c311caf6fc92823fb4d080696261da1703e47725bb43dbd19baffb347ab43321b570ddaf14eac1c65a91035684451642981386a4bb96f76a99a3a274813391a02366b9793a59c0c4454686545460aeb5f55d278046a52b207a10c3dd4a2552240bed811da393e3dc9b62ca3a794f682218ffeae1ad6ddd309829d42f6ac56c69ede73c714fc44d0b7fb4487cc1c981a272267fd83fec0dd620b26c69e5c78a922930e95ef11bbfedc4d397e07c96963c67b19d18c251888b4e4b99dbeac128108dad1d3ffaf5fca532f80fa7e811b5bded034e678e897924b21e02bc3db430600a9296e63304635d4ca4e173fbe6146e23287063a0d5ada2ae97284978e08b49eec06a2787c7a6e584c90e6135c9e4b75fec680dae46c85cdff68a8441f6b9c9965e221aea0761f5f99ec064c1618e771e66ff386026d0c5a16e4c1ff6a2f88e54a6c98f29f2ba702c7191bdc13bda5d96eae65e34ba0895b6b8cf3faec146d31463983617c222ada5e1be27848569ba80401ca8034b9b447e613fc5231f486d895ec6476f825ed333421a5edad2423a014f7508ebfeba6fe9df1bceb2a8e084c67ef46608e5af3fd401acdae36c034d5900b98f9287652a1e739b24eccd528d1595fb3990ce682ba249c66d57846206ac51278d616dc3078f3bf32036b386e498f1035acea54ec55fd3a50ed027d8056f978723d88e004beaeabb339d4e7a913f9573a2b485ad2ce463fa5e017241be37f34742834525384061e1613ee2aeba3510426191b81e59c8086ed5808ec9935f008227c640996130ec282faf60366e46075df5a4cf037093cc59aaee9587415e97e1ecc776d2c68fefe +ss = e69928605fec37c1ad0f9a0cb01b3f8335e58d521238edd3cdeeb01aac18b492 \ No newline at end of file diff --git a/test/vectors/kat/kat_MLKEM_768.rsp b/test/vectors/kat/kat_MLKEM_768.rsp new file mode 100644 index 000000000..acfa9a59f --- /dev/null +++ b/test/vectors/kat/kat_MLKEM_768.rsp @@ -0,0 +1,110 @@ +count = 0 +z = f696484048ec21f96cf50a56d0759c448f3779752f0383d37449690694cf7a68 +d = 6dbbc4375136df3b07f7c70e639e223e177e7fd53b161b3f4d57791794f12624 +msg = 20a7b7e10f70496cc38220b944def699bf14d14e55cf4c90a12c1b33fc80ffff +seed = 23f1c88bd0e65f2c891ce865bd3275a7ffdbe4f9036e75b96aad0412650e9cd2ea4591d4ab7131ea971b34c23a4ed245 +pk = 01f60af1dc8e6360ae78b59d4a5042eb9145a269046d6236b8304f305c2d9dcb189fe5a62df89b2f5a7bce3bbc753c1e78f730a99869f809aba856b676b707b26601d1d909bab32451494eb7d0a2153a6350b79789a9b115f83ea12037256562f06a1d5aba378da77039d3bdecaca8e6a22a49050a76300a0267cdb38b7ac77903c50ca53b99283cac6b95fba651b11a4d1a692e4072965060587669f253b1bb182e661446168ac60221894660020e9bb5f5b7124a0303e2543ea3ea6ce97a2482b255ca346fb27a847b33b93f3ab2d33064c6e6632d1a23f1144e907b246b479f4a5c928929a1e24150f5241258a5b67766a66f6a33846495907828ebe44ecc5b73124071ba479073910410a16d5d5696b48b194752979795772a91c348f502b37aa650983ebb89bf3c081ff273544129c9137a6e1834c8f2e7ce14c7870c53c05b9b94ecd38e6645911b0912336863ec168831f811881075cf38a59de4b5c738aa6ef03d779b295588cfb62491cc7b3e08b48473354f9ac8061c152a9e205997499b970b69bce66fe42bca2924ccdf0103d0a4c39193c2df25118d72b17aab26b0c60d4cd2c306ca4696c185de05035f4a09cf970aecc8cc93436f83b1aeaf452c41929a2eabc151938f74c93b858546df2264eeeab602e04a85c522f8fb1a5214afd8d4cae57a47b6f381a23126bd9917173128af917f1d483691c450d1151cfe9a1492d473ed862e27da92500c86a20019e9f975e4f54ad319ba2c5630c4014219d7ba235456fe530140193d662445e6a941d1e238567ba8d4d95ab1c7447d690821876d017270cfb169f2d792f03c800720697b410ab41c66f2b24585125655eb10aa1087ffcb7750cb887ad4467377500a6a7d3a82976b415a54469577b4138d919b03f4c9a4d3390bdcb6f1717a5fa4ab25a34f4ba5039bb22c7f3c234ea4427347aa7251464e631904d7cac4784f78b49d5f4a104a301809a779f6466131f9c62bb67147f4cd4973a6aa1c29ae6a8647b6268be089fe048ce990cd638743d285c889a707f581b63af41731f0246b054bc4b47aab01b6842a2709d02e8158ab90f48b69d136082b34cb0673b74aa3f54508ed029fb8f5045ee0639e150ee3b3c85f68a310ec0441980100b42abf2bad10d4a9e0c7b2bc5bbcaf73cbcdc49dc2c949111936779b178974a0392947745a47189bc3fa8a679c80af964a9f9b1b56577274a2a669d2da6704aa496af407fa1aa964cc3dc3140f5f959a7ea974bdb1b83e48a99c0a3e2d75b0669b5c1278962540609166266da18886fc237af30cefd569dbe399e6652e45f06a5dfc9a758a4987088ff8e38a3cf36b9d988f0e070b68d0b88f7bcc41306080d889780c7e238895ccaa4f3577225cca4c8a9330ce613e717798c9670924b271ac402b51538b8b5967ac490dcab5300e6c54d6a3632f3b973e4186ee1a7e2e85649185b26370c387235c4df28a9937a49d4078bf883f4e6346cb3251d9e13f1bda087b285afaa80e262641c5527b0a184b8bc84a62e577314658e2029d850064f7a7b81f253e7cc124a9c5b039dc9b179a80c2f6aee6ea0815172537331a57b505baa76ff5b4c1f0da754b6194f4b39a9b18730d3cdab925d691ed77a8db9927ea233ac2a12744fdc27e5d221b9369adb325d8 +sk = 9c700fe444904db5708e16b1ba7650fbe94f24a6abba262ad7acbd1a1387756566e1ac7a1e545b236c548e8661c5f468c58c3bbc49cccafb7a66a3b61678610784a88a8872255139d979bdb140649b06acbcc91c74d3bc791591b0f31f2c9ab24d329934795405b7570a994e0d128aa08681a3cc58680937401a563bfb4e621a4193416ccb1c3c9d9b23dfc9979f91140b37c6e7a517ae6c8f268b3346e52ad0a311f79acea0a56cb9291ca0161a98aac43ef2ba55618312910012ab603ac4c0be64a498e58ecb217e2a102b8a518bbbf9c457412f030c1a82cc7ea67c8fd14511e55436daa7383ee2c942da15f67581f069563e8ba3752ba159314973dbc7374244ed486c6ad77abbd89cab1c1934153439b58f586bcf00813b050744debb789dc4b3a1d054e710905f066bc2ab7643d2883e096e749988a0612667633a9b98748c23c708d29891e84edc8c4cbc43999ec88c8a854d69402b8ebaa4d6cc09ab42220b8413da34b7cfaab2c6b47f1610cbb1d8b080051fa7d974ff53b71c8726aaac2f3daa9c6a68932d0172f2174d989090b822bacf105b7ae70fa59296d6b2c7614900a9f869db16600939bb1e116b1ce913ceea4ce60a2cd98cab92e2880070866fe04b0423c0dcec04d3f921fb8c0ad5c16a077a3f2484212d90ab2bdb1429ca837af87d29d63438440a273c3e9484a1481b54e68712e3fcc1e562799243ba3f339bf1025c5c1b29e1294a0a7a3efbb75e47b31c12fa65c90a7adbcc2aeab0278c96513b25945dc32b9f382d2751a27ca572524127695765f9b45c88f923c28869bda5c7af4060042913f4d330c0453c985442dca58ee28a94bfeb85f2b49c21a556fff04e09d66aba875a4819390bba7586f77bdfc0b1f639b586fc591ab9250c8951e143c2f9c790697ac51a9c153b493315644a73274674fb083c852a1072b80181be1ecb8f59769ee0903757326625376f9fba3380a55cca42786e11a4769c7b4761c5f5db112df69839579d82ab0340a34dd62c15165bcd67b66f0465546af56b6a637467393b28242c40c387000349a60a730237250709b208956d00fd715b239af96c418ac0147d0c63f8f9af30a272cbd629293395cad10937c32e7454815f93aa9a4c0661dba4dbb1069fa4b59474cf8f10ad45563c983906ed324b5f776e5725be938696c0f6799e489d8b80656913c687374dfeac8adb31536c90c6079069ee142fd800b3721b0aea35220dd04d85b19b872548e7005e92e674a235164d6a2e53b6774af42d211c77bd6454c2445f68d04f357106afc8c0a2bc8e4fa467676a2957b060f0e9923a639274977216341b1aea876a0b7dee4013bde2459c957dcc2b5263b02e2ae3a6904cb856c49bdb5699c16997953cb1056a4cfb362ad3646fb5d7393418b8fe556f1dc924cc74b3f9d7876473355e2751f3e98ef5eab3bb974fbe884d0bda85b8fc4dce0c852853ad7a62528c3bbc32002fa469bb89895621944ffa29429c106c3946320ee9bf3c822115d53e968a76c2581e00f906e60ca372a22686d74c9ffb52a24abee52b788d015bf6a5c7575493527c97f927561df15d47f558b5466c8247277ab35c0170c6c05a8af8e67edf524a01f60af1dc8e6360ae78b59d4a5042eb9145a269046d6236b8304f305c2d9dcb189fe5a62df89b2f5a7bce3bbc753c1e78f730a99869f809aba856b676b707b26601d1d909bab32451494eb7d0a2153a6350b79789a9b115f83ea12037256562f06a1d5aba378da77039d3bdecaca8e6a22a49050a76300a0267cdb38b7ac77903c50ca53b99283cac6b95fba651b11a4d1a692e4072965060587669f253b1bb182e661446168ac60221894660020e9bb5f5b7124a0303e2543ea3ea6ce97a2482b255ca346fb27a847b33b93f3ab2d33064c6e6632d1a23f1144e907b246b479f4a5c928929a1e24150f5241258a5b67766a66f6a33846495907828ebe44ecc5b73124071ba479073910410a16d5d5696b48b194752979795772a91c348f502b37aa650983ebb89bf3c081ff273544129c9137a6e1834c8f2e7ce14c7870c53c05b9b94ecd38e6645911b0912336863ec168831f811881075cf38a59de4b5c738aa6ef03d779b295588cfb62491cc7b3e08b48473354f9ac8061c152a9e205997499b970b69bce66fe42bca2924ccdf0103d0a4c39193c2df25118d72b17aab26b0c60d4cd2c306ca4696c185de05035f4a09cf970aecc8cc93436f83b1aeaf452c41929a2eabc151938f74c93b858546df2264eeeab602e04a85c522f8fb1a5214afd8d4cae57a47b6f381a23126bd9917173128af917f1d483691c450d1151cfe9a1492d473ed862e27da92500c86a20019e9f975e4f54ad319ba2c5630c4014219d7ba235456fe530140193d662445e6a941d1e238567ba8d4d95ab1c7447d690821876d017270cfb169f2d792f03c800720697b410ab41c66f2b24585125655eb10aa1087ffcb7750cb887ad4467377500a6a7d3a82976b415a54469577b4138d919b03f4c9a4d3390bdcb6f1717a5fa4ab25a34f4ba5039bb22c7f3c234ea4427347aa7251464e631904d7cac4784f78b49d5f4a104a301809a779f6466131f9c62bb67147f4cd4973a6aa1c29ae6a8647b6268be089fe048ce990cd638743d285c889a707f581b63af41731f0246b054bc4b47aab01b6842a2709d02e8158ab90f48b69d136082b34cb0673b74aa3f54508ed029fb8f5045ee0639e150ee3b3c85f68a310ec0441980100b42abf2bad10d4a9e0c7b2bc5bbcaf73cbcdc49dc2c949111936779b178974a0392947745a47189bc3fa8a679c80af964a9f9b1b56577274a2a669d2da6704aa496af407fa1aa964cc3dc3140f5f959a7ea974bdb1b83e48a99c0a3e2d75b0669b5c1278962540609166266da18886fc237af30cefd569dbe399e6652e45f06a5dfc9a758a4987088ff8e38a3cf36b9d988f0e070b68d0b88f7bcc41306080d889780c7e238895ccaa4f3577225cca4c8a9330ce613e717798c9670924b271ac402b51538b8b5967ac490dcab5300e6c54d6a3632f3b973e4186ee1a7e2e85649185b26370c387235c4df28a9937a49d4078bf883f4e6346cb3251d9e13f1bda087b285afaa80e262641c5527b0a184b8bc84a62e577314658e2029d850064f7a7b81f253e7cc124a9c5b039dc9b179a80c2f6aee6ea0815172537331a57b505baa76ff5b4c1f0da754b6194f4b39a9b18730d3cdab925d691ed77a8db9927ea233ac2a12744fdc27e5d221b9369adb325d86ff694a73b6701f2a7408773f9909118ef52e1c89285b2cde465a0b04980120af696484048ec21f96cf50a56d0759c448f3779752f0383d37449690694cf7a68 +ct_n = 96ac6243c9b1272be77b975a4048bf00ff2c48f94a3483362449273880d45e54bda15729682bf591a74382a708beb78118cab29ad74ac2f405ba720076dfb57188dc168487cd20081f6bf412f257dea03406b23a6a752e478ba4ef9c7c0f4810921fa32545be64dc5d9f18d4e1320efc6508154cda35ab912d059e0291a1150ae0a10da5e3d7bd221a851c598df4d0b18daa920976556099d1c0de4e222d5304d44fa9cb9bd4ffe15769dd6c4793fa809f5264cf0febca4b5975ba287639783aa1f4b645ff7a00d46ee7b19fec17b3e83bcaf4361d5349e30ceab60c386b6b0d1b90d8b336ee6a627ad2a38670cb5113b0fb4ac2ddc4250097483fefd182670ea40f0f45cce90b9ed58dafaef657d64e25fd6692a69721994e7d00b4949205ebe4c4f9c46ee5a1018b220a26d80ae2d2b486372e974d75b20a005b1616ad1e13d162915cc24f274670d1e5e8bd345874a7e7c9759c8e43ff33689200739a613395f7ae78d73c6a7b90f65ab511f0df3c5dca85d0b9430b4e97098715ff823b617321799aea0ab9c72234780339ec7b541d5e6f8c1551146c24a65411811b23674c26123356cf233351382c3994cba5dc6c25a07e1ba9af33eca18bba3e97935e3abdf07e9fa32cecf241e7cafc6592db4ee487ff2b98a4a47805dee17fd93448dc98457b753ed4995ee6b1bfa9ff1d386c91f396ca8f48cab5b09a782ec3b616a87a6448a96236c4655413af755323d36a8db2e16509454489e6ec83629130cd2a54817918af362c83183494b4b590dbaf69cf399d3e2dc3e9c0c1224f148e65ef68287341ab72ad58adfc69b28e27e91ebbf830fac53b94f762f01cc9b1561ae35f16edabf51ff164c1309d1fdb52cd2bfedb5a492eb65cb9fc86b8f05ed26d13233fb0a3eb33a9dce2cf98e6516cee42fbe1e97e20ab6c9965f58a377dc73e530667ab8f45e6a70b23db50f0df411732d8acdabe50c51adb886c0e5a5296d4aa1b13a336f0c17812f79fc69418a7d8901c568f410eff2af74baaeb8336f46ca17e14e060ce2d45cdb376286eec8b8befa5ab8025802720a1e7393af579db13e8867d43d711e61b2ee395077984a450a8e2513040068a931796bc3d0069b56d1f062fc3dd61b1b194b6e1f1d1c0596d453db7b7592a6f9f8ac5576a855906512200234c40fc9bd9de9c3d6291c31b5e6b7ade473a3787aab0c958b3df76188a86ecf9e3ab06f96d1ec518c1bf3366bef94465d9e1a69eb26db9e0f0856d27be50a52bb0a3a17075d66080fe1d3bd42122d656ccc3a556e04f913faf9641143931a640e72fab9d003038c982cac8142e5613dbaab9d41390577afe73ac623f7c1920cbf1feb5c85cc433300c1c5579d020d5491edd6c503117b9c4d598438938831e5c341e9c86cd00dd8d4320b656f9aba9f0e552724e3828fc2e00946121663ad3ad98a25e7d308da1a0347c4dcfc798e395270ad07cfdf0ff8e3278dae20ab2664cdf30a5d0ebfe7a1e799ec44b514e02f2be9738d4e28036b4776bd40408 +ss_n = e7bcf899feb5db69d11741a8838ecfee253e80b76d6a35af46e220e81dc41daf +ct = 16a61ff84787fd4a5f19ca59b3657db3a106a7329e2d62747a2ef85149163109befff6bcb33df66230b8f6725ce719f58f71196e895befc9754d9f042494648c88a6ed4c4cf13f2faf9f651de79dae077733cb235f9dce448977fd42d5486b7dfdf6d7bd9172b14247655d34f10524d469478d9a9639f34d2acde6e3c048d52b308b66245fe9a28cde7983b9d14c03b37715fe3970cd35734771add7aa9b58cfb0adf8c613deafb2b31f6e5c8364d4334e93af8e4943fa947cc67667447cffd036235afaea7f603cb2ea277b97dadf82ea746f6b27396dd08c85cff9304a2e5ce0571fde2e926716bc9f8e4d474b4e8fd34b0dc28376204ea306d30e9a6dd88250b79823e77319f2ef3a77704f409dde8beb6db1be4a9f25ae2e15939dedf1b11a5aa51fcff04068b46d42fbbafd2498264cca4fb78b0f2ab162c7ef569875a13148b9a4b0b9da1787ca0a7033e3eca13471dbcbbe15e34f2b5065b995fe221c2b7ac150334d14e68edc5e049663de362fae8d35e24c202c5fad2153cd044ea962a388f030cdc5dec1c3423183b173c32b22f5800ae45e8e89c8ee4617ce24e60f278bfd1ea0f8fa92486b6f849127da99be7be4c661e2ba26669d6acf619a33056809683e24a2f29e33be7f5f9ac668697e59488e9b8685956cd87b7c47109d603202c201472ec829ea64922e4d0eadd4a4b5a8fb06e0f4bf25a59ced54557388dcd91b387cb6148597edf84a22595801851ca4b9e9e096fdfc96f2444ac9f1247a5e640787fca23e3eb21ec1059c42a65803441df01279013c448dfc3eedfc3355eee1f510086a115f854c36db797a85ede19a473a33e79a80f6f7f6467e1b0d866fe0e57a8abd379934a6a6a492f5f32594d43de2ec2eea81487981bb6394bfa6df5498d74c6db2202a6348a325fbc906b8e820bb00659a2ee12740b14b2e36f4c5dab411c0cd096c5e63ba4d48aa9e92b31f44dc97c0fef661bcf4db895f174613d9d5ed9e836657745ec9deec7af273cec87ef0eaf805da1bc8401608810b8a86f952c6326d09fc8d1d7fd83b4e862e05058e877c056cc5465ec3192b03a4c33cc6b16558d2482d5f84518cbbc526aae6e8840317efb3a1982c3d1719ef15d10f8b077c5c68680be6d3d92e86aaa6eb378cf0559d493257147b55730f49a042325af066b4f9741b9fff5d47972d5acaf52b6bea4e9e354ef9448b62f6d2a1317675a922e14e31578d6cab5a09a71ab270d865151b8ab4c612b5fd5dcc97e45419a1cfb6b8b9aec60f62602098f91f07c238186657941c7a18e4d7ee220f022d5fffd291853b9c063e561b7176f7a235ce45bc86ce4718086df9536c5a5f0abf04c0a84d82bdf69552ade3135433c10a1ba69d688969e6d9dce54d3b3aae3a7f2ab904e657e3fb05241fac110aa07e62cc3991d7d0d6329b5ab9d69d7336c0d148588c9f0921325b85df5fd30db80a56a3724372153641961aa7e042bf2646ff46022c059d5794c3a4b7f90c410de71a5231dd9b83bbd0e6bdab1bf9e62f +ss = b408d5d115713f0a93047dbbea832e4340787686d59a9a2d106bd662ba0aa035 +count = 1 +z = 6de62e3465a55c9c78a07d265be8540b3e58b0801a124d07ff12b438d5202ea0 +d = d69cfc64f84d4f33e4c54e166b7ff9283a394986a539b23987a10f39d2d9689b +msg = 0121cb32acd1871135cb34e29c1a0e26ccc001b939eafaacc28f13f1938dbf91 +seed = 6fb79c668eb6e0f65a09135cdd243ce205d7065a0924f86024adcd111f654a6dfe2e398a12369064c2a217229113e570 +pk = 3f1b8a5cf5aa0cb148cfac766a30a78209a3ce97cb427a9e813254e0b6a99ae25370b583c275357ce3b4d6c60aafda03e99734e0e98eba56aeef821e92b8c1db43942a7c37c9977d79946fe0474df27b9cf3b12ca94bb06401d09150530bf82adfc4623bd7af97425984b8c53f51969ebc02d9b41aace79536e3282af5adedb6363d4a7bdbb06a69e24c892888f6710055bb644db60ba3b884204c03b07c2a8aca0249ac29ead77d5c879a790a09b850a55ef614cc73cf7f727223ba0d6353295c008c986aa9200349a0ac500e347ee1795a1a8369ab6151c27b1341cace56852ee76c6d3ccb8331b23cde8b224af9b2dee402d9605bbfa8401976419c57ab1686bda096b28cb654cd4a5db7c32598e01491e21b8cd54497f60fe2bc31d783928e382bfbf3332b754cf969b12aa58f438b4a57064129d4456009a172a59ab3b77cc84c76944b99a53445a529ac0a62ad490174a47324a5d34b81a682a69c0a8dd75f0de93c20e430266c23b00c4869f53c6fd0854ed3caf4544952b05ed3b3b0d6ca34f0f297f2e9a7c1187804a37a121a6ad2ab50daf475aa3a25e6c9a0d6a29def62cbd298050f5b307c053a5c8838b4c3357f3376653c3366fa6fe1025d1960c75ba643265c157a84c914d559f540c67ec1587394af7bd17830d5089d505906fa9f766a9b93909f5b6627cc05a0b2192cbfc2271b0b22d77a07ce551edaa6522d402b00003723c115936c97f54c88aa513482a05554c628e69448eb6a0ef6f346341c802bdab9b03ba0af297d9e8b938b9cabefa46722421a338a872d9a88b88c9f0eec46932c367cc58b83573d26036aaf5276e515b0f23059b40c848f638ace3703ee6c27d966990c7702ed23a0cd9ba4cf6169a668a1f0bb586b076692e1c215754ff6784bd91a248cb90f008a3eca59852c057966933a1a86b6e05b2fad91b28bc61648b041a7ac046ab8112b6ac2cb900fb5c09821dc4b0716b509e122dc97c6ed7342f6f49fb65559729c384763ba2d2bb8cf56ae36f3b269970ac54841213b24b792c949f3c775e70ac8f7cc53763ff638adc5113ec60075c1a79276ca473c113832954abe207bebf0cd0426c0e29733947256c7756bf9b50d82191a07f0ba5d5a154b0866e293473b4076a1e995f9d086a472c118ac22c216a839920660a331eee198df5b1a1595239d5780cda75f73c6765a46ae4aa34001939dfad92f7e124a5f2c628b259de9560bbf470cc69cc652dc29b93ba86a4990dce0af1a4524c199a692670caf748d16612feed711f88a505d552a6440aa0422626f185f6921a82ef925086028ae8562fc7610e1b1649ef0094d96b505fbb7f112896efac0d192af45d903ac7992bbe9bf30e2577e24581cbc4f73b180d04a69f540b39e19a4ae36aec4f21ade774965391bcaebc0af869cb63631327b421bec6726651b8758bfee73c591212d4ff981f6684c58b359c2d07fa1e601d6c5cbfdc964b31909cca37fff96204fb5688d92ca5a85758cf160e9b06ed18320a4b1b0c8e8196ae76a6f621972d17a4d64a7df04c5a4c333c3bc1acaab37709149a3b8ca082a8fbca13268a1b022230e2d630272cb9ff2e6655af17327f3b9807095f582be18bd3f4e0bb723eced69b0585629986548d722b03b5bbd157ac99dee1c0a9aa1 +sk = 7da85623450d2b72758e9c5695ec6166e9918366163b343d9a04863af574c1e98e219a06656379b72b9d1c4ca7d2044e6f81c0e0c0098656807e3615c4530088b833953a758a3ab2f7d54a7b9b7063d373b492538a5c3ad1fc89ae618d77143fe9f818d441b69a72a1273860412614111a26e5dcc552c8810ec79ff873a5c8b253a917a2c5016fcdb37e3f76ae4e5731bd323562590f8286bb11d12a54443eaa319a3dc08fbfa2a04c3480c34928ed28b0080392e1362c2322701a89645b14083da54fbc93acab75192777c560c42e95735924a922fc61beb9253f3c9c3e2e388b08736b92c7a8279931eeeb40ffa3c0d064c015c78d6fa842906b0cce74c46e48b977d2755c221e57e3c1d24650145836823c2d27055dd5d5b821f18c17a5c41af97232602ef64218ba46c3c046ae6b127cbd031dcc79a33b7606ad281eefd8c5bb172586d426b4b1b8fc446d1fda2aabe96ea6783102663895472ef984bfdcdbcf5d0b6364b61f31c69c695151bfe8286d4ac0a08cb07f8352b6ba9319a10ae1693cc7726c954a491dc99317b1941a4107f941956e791384239c7fb96438108212eb8c6d4386670284dfa5598b4a2e2e07a443a96ca34087d97c525956544fd4c3614a7e0650677c96b52a319f2150762723bd38378799e65d5bb74504cc96a803127e9c40c65864fc736535644febda1e9fa624a7965603769291613f9ecb03de14a8ae93b502fa7515a1a68a2bab8cfb615df306e8c261a9992310970f9cda548354c312195aadc8b06be9b1260620094ba347242019ac1c8a0c22cfe06e4d6a7551a037626a5d1923877fa6ca41793cf72a1946906dddf0021bd26cdf7bca07c2a675c368e759b43d121b277b2621b1b32f236d330579a367837dd5847db64675e622bea77b067b856b49469d375a927b3a642aaaf6e2004507a90164c0efab72331b9656d6563af84bd68c7638d5c23799c3c95bb573f77e80117c01c5bb842a49eb608901cc1f04942872360783592f0d2c4ae018720ed29d452b5f42712eec98772f5b754fc1306666c59d8159f9276b562c7e76f2836ee84e3da6318b8188ca2b7d783832b257339c464b3fcc7f4764cbf09131ce6b1061a1a0bd4354fe9217549ca8efe0cd14705df274331ac73165041e7ca7bdb68ba24dd0aa6a5907231aad2cb51fd9bb8bd1691793509770a018275489f8f484e733a74a9a56d485a7a3747f5f5caa2cb38a90f04000b9c7267970a948bfd818b4a6a92e2a141075a76e699b3cb4d3a0bed4972ba2a341a6572a03bba1393647c75703621b50718d01c6bf06f6753a3aa5b4b9ba2af82ff64288a0b6c9225274caa72a7dea169aabccdb1b8969949f1a1a0840407d3d82bedcbb4fe03b9e6d718cdc35b389d32a51390dd5388797336202636481135990799b66b15cb44026f8648fda13acf2a97d3ea672a9a04246cabf186a716bf5b9c84a161818746fd83b118315d6e0ae0788cea229c297390df853c75e7b069a614ccc46c22da173ffbb851c721ae5f34b483312a8c58414170e77db53c2897f3952092d4c5a0cf18ccde1b8fad8024bfb3449a431ebcb9e2aab134b1bc24050887ae650b8aa6f41fb43bbf87767804c3f1b8a5cf5aa0cb148cfac766a30a78209a3ce97cb427a9e813254e0b6a99ae25370b583c275357ce3b4d6c60aafda03e99734e0e98eba56aeef821e92b8c1db43942a7c37c9977d79946fe0474df27b9cf3b12ca94bb06401d09150530bf82adfc4623bd7af97425984b8c53f51969ebc02d9b41aace79536e3282af5adedb6363d4a7bdbb06a69e24c892888f6710055bb644db60ba3b884204c03b07c2a8aca0249ac29ead77d5c879a790a09b850a55ef614cc73cf7f727223ba0d6353295c008c986aa9200349a0ac500e347ee1795a1a8369ab6151c27b1341cace56852ee76c6d3ccb8331b23cde8b224af9b2dee402d9605bbfa8401976419c57ab1686bda096b28cb654cd4a5db7c32598e01491e21b8cd54497f60fe2bc31d783928e382bfbf3332b754cf969b12aa58f438b4a57064129d4456009a172a59ab3b77cc84c76944b99a53445a529ac0a62ad490174a47324a5d34b81a682a69c0a8dd75f0de93c20e430266c23b00c4869f53c6fd0854ed3caf4544952b05ed3b3b0d6ca34f0f297f2e9a7c1187804a37a121a6ad2ab50daf475aa3a25e6c9a0d6a29def62cbd298050f5b307c053a5c8838b4c3357f3376653c3366fa6fe1025d1960c75ba643265c157a84c914d559f540c67ec1587394af7bd17830d5089d505906fa9f766a9b93909f5b6627cc05a0b2192cbfc2271b0b22d77a07ce551edaa6522d402b00003723c115936c97f54c88aa513482a05554c628e69448eb6a0ef6f346341c802bdab9b03ba0af297d9e8b938b9cabefa46722421a338a872d9a88b88c9f0eec46932c367cc58b83573d26036aaf5276e515b0f23059b40c848f638ace3703ee6c27d966990c7702ed23a0cd9ba4cf6169a668a1f0bb586b076692e1c215754ff6784bd91a248cb90f008a3eca59852c057966933a1a86b6e05b2fad91b28bc61648b041a7ac046ab8112b6ac2cb900fb5c09821dc4b0716b509e122dc97c6ed7342f6f49fb65559729c384763ba2d2bb8cf56ae36f3b269970ac54841213b24b792c949f3c775e70ac8f7cc53763ff638adc5113ec60075c1a79276ca473c113832954abe207bebf0cd0426c0e29733947256c7756bf9b50d82191a07f0ba5d5a154b0866e293473b4076a1e995f9d086a472c118ac22c216a839920660a331eee198df5b1a1595239d5780cda75f73c6765a46ae4aa34001939dfad92f7e124a5f2c628b259de9560bbf470cc69cc652dc29b93ba86a4990dce0af1a4524c199a692670caf748d16612feed711f88a505d552a6440aa0422626f185f6921a82ef925086028ae8562fc7610e1b1649ef0094d96b505fbb7f112896efac0d192af45d903ac7992bbe9bf30e2577e24581cbc4f73b180d04a69f540b39e19a4ae36aec4f21ade774965391bcaebc0af869cb63631327b421bec6726651b8758bfee73c591212d4ff981f6684c58b359c2d07fa1e601d6c5cbfdc964b31909cca37fff96204fb5688d92ca5a85758cf160e9b06ed18320a4b1b0c8e8196ae76a6f621972d17a4d64a7df04c5a4c333c3bc1acaab37709149a3b8ca082a8fbca13268a1b022230e2d630272cb9ff2e6655af17327f3b9807095f582be18bd3f4e0bb723eced69b0585629986548d722b03b5bbd157ac99dee1c0a9aa180bdc36919442424bc921c96811a00347c0448ba09637e187b212b77e7e976b66de62e3465a55c9c78a07d265be8540b3e58b0801a124d07ff12b438d5202ea0 +ct_n = d0bf2e1d6851378cb5de83ae9b443234caa01ba58535242d0089a744c4b12753ff8442966bf563f8972cd0426e815a34883f740c6016928ee070291d8efbbd326088f30d50550b061ccffd9922e5a30468b62a0ebcbf0aeb74f8dfe3e130c2b1ba83e47075ad519b94c21f3c06078f4645d5444b41127dbf8ddc67a8cf440abe95ad1d586a29ff3d8a4d671b05198d2e2eaf06d7f0be6c550f1c544681829632e98cde071b1e8681c78a98081930d1c9809a497cf409bbc67d1d8de8b9a3e8f5ebea8fa79538d65c0176ed2034d74fcda38288c36c6b5af134eb9e60ffbf138fe5d6c0378ee891e69bf5bfed3b1614d25b58d3798a7eb3dc7fe42f1fa3e30953d92e79d418c741e659455a618e7a5aba4f59d12e17d057eb698f3c2f9a6b1d4e581d09a9d6c1da5f5f0ec69f8463d922b185256bfa5c751e0321d02c58e4284a021b1cafa50f7339d5a5b602ee59bad99f09dc0e282dab539cbbf970418dcf302f2b47cfc1e97ae2a83885b7ef6b5b65e662325644504338ee139ecc4b4308cd8aeceb0e9b40affdeac0e02795b54074eb446b85cb4a57122079bd7c34f310d1260efbab0f4a7e04ce438d624e25bec7e0061e253c89d57e84bdd44839343f6c4d858edefdca4fa794db91d17445c5f58ec08b5bc58cfeaacb953fb004fbb8f7b1dc1e1b5622be612fdfb1889442cd8aff5e18a75b02ce6f4ee1efbd96ddf8d02fcd2a42bfc8997cb459e2672af4231a75d59dc678a2185374bec3d98504e6e125a16e58f42805b12651478a1ce8df3cae5b0e0dec53ca78b2c38b64d7dd7c9985f518e02efe08ce6ff9b4cc3c521b3c1c0ac40504687af68708bc27946704eb4900ecaaf41777a223f1668a69c7047e9b863afb4ccac039334f58dd132bfd5534da9d45e640edd9e88104ad0455bd2faa383d35c0c9ec5fc6a6324bc1429c539b0bacdcccb55121f247f75ca6068ca915e16d13137fb95eae128b04ddedf9a0f4a17ffd5f2325008ae121e21f9f4a64b4d806ce2d93135968b3129b4deafbe07bd6be34de1a5adebb3e0002556a1392c77a23e4612061ec7148652d702a6493b8c517d1fef8a77d054b19f5af4e904096a1f44f2a71cc51c8f9a20149cd45e6d711693a81bdf62d0cab6a13fd7e690956d61ad6508ccafaa8ac9abc4da33ba55dc5ef9c63427f6ced83c30c7b763c9c66fec26247df9e61bd50ed977fb756301be16ff0c5b2493c5f2af5502655ac884219f9aa8b9ff7117eb7d528a4aa7d1c2b4f7e12bf37ed958c86141fcf3fe7db5325e27c1849ffb64147c278e45839ad38ab56711a96f188f9ce92f4537ca3487a3d840e9cc08407010c55b6db9d0ee9321ef5ccf49f2147c1aa063172f6e33a267308ca42319eb85dad94c59816dedb2142446bfd610844ae6e69c6df23a55341c1d75319e649f8d953569d54521c885f8d9f3b41d9a72da259ef17684ac9aabd56b4eebd14bda652e608c9a192537198dd6e35c0ecfe417865786b6e5cf79f7057cf5e3cb2eda21a9fb6fc8b9ecd04 +ss_n = 4069db9997536757c9b12f026ffb3d02f435559df63214711750cd04b1f05d5f +ct = 4cfd0f0be15ddb620586446e4351182f64aaac3affa13b24652b87d6ed91f60cd3d317912c1984cb98d5a393b0b575f20a5afebc58db8aa8c79476187f8fea072fffd26f12006159518661daa4654f60e38a5eec796383df0457828aa32973187c19a64792858ade46c77a53d1b6a9aee2c4db237be35234e180bf0106804c08a3d9617887828696ea6136594031d1b68ef5745e618a9c3b07d0fb00f481c47d12154c579d002ff69b8f5b3208b62bec8b5d46fc94b12a3111555dcdacbe2548d33bf24ab237ab066543e2ad47ba165853acd707fc5a1955d4ad83384dd936af95eb007a8423aa35362fd73501d68909cf8d377a4b8b021551276547bad26bda1f735135a6662c6ce047bf3e146fca5af3ffd7b75c8645d8525d4a22b05061797868adb514c5f9e8fae5fc27380c7ef02e671941fbeff63b3e7eb55bb5e00ea3f34d6badfa24bcc2bf803e4434dcde2712c951ec83a64454d5565ad1488b1a78051b9f72b68d5581af2949d1630098f48b4fa7e595223ce7309d7f79d250dc2a91bac5138714973e93f67044a73c86ea3a29ad5632277b6596509d644e1dcb55d3a8fd1d91996f2d9ff471b4f1e31a759af4875148b4d4f1f8dc6c792cc8ed9a29935bd04f3ac12801574ec29f3b601a8d75d3f44d55e8a14c5b63b1ef7fbacdaa80fd7370b8dc7a1618581bfb8327f262a3037015aec3486a8b3ae11504520ddd509b986fa22035cbb2fd242acbca7aaea5f898e6101337b50ec7cfece1c2f2dccdd464e57606e44877f96c27206523837b4dca5a2f65ffb3971669ca9d983bad154d1b11f86a3a376e6981e3ec2ee420864381035678ad18c13c382587b2ffb67b3c56068a3d539077941a6876745d5a1cb25f1e897a59467efcf886ef1d7122874e54b24ed5249468723ddc54198880e9405f0f0b94e6dd95026046a60db1cf3a1d92083fb8104aea7470157857085925968d78ca35258b8e7a2bc4d3e14f404a2d5eddfefbaab1836a25a6444c31842e8f56395b335da8830c91a8106a5313c80020915ce0c79c303266933d876e854096cf6bac835181a38795711cfc1e973dc7c412ce5037604991902f3f81ac36360b37187106daa044af03de0a454b7b3f3996f3e4858e20f87fd98ca663ce21a9b5309b27737b9df732532b0fc9b2a2de6cde4e0597dbd6ab9cccced9f7ce2c4c727c9aa4358e4f5da251138f104f66891fcc671c64e5500ce3d3ad27a6272eed5bfd4491eae6dc1de6e7696f380d89aaa653571aa3132ca54806f9308c414bdb2897cbb6b844e8e04fd94732fa9c3de0f6472cbd0fd74f98d49b0d5fc5772d213ee8bbec2e8593024d03576e851696635822b980b1345d5df9b9386e939a2f8e324fba84c12f8de6e27fb0709d577ae6ee48aa3f2e7a709486bdf68cba1284cde4b3e3a47b510fa6a6accaa0609e822c0ccc9fd51000cdd57830b37590ac9b3b29d3be01400d6e7bdb640d1e221c26ff7b24fd67a6ee0a5652ad5d50d4ea408b1e10c974e86094e5b40e08b66e7c +ss = 8c970242406111e26368ad8760c4d02a8b28d17d138210adc127197b50968140 +count = 2 +z = 1eaae6bb91b27cd748c402c4111140d5a942cf3c95ff7977f88d2ef515bb26d0 +d = 63470357110828f25b23edc80ed280ecd398a9f53251c3332754de2af0b15e90 +msg = 34b961af5d6254af72c0d50e70dd9b4991150ccc09192aa46f1953d5c29a33ec +seed = ad4d2d306639620afcb3753a137f89331836a5adce1c40bebe77b82d43a40d3249000c7aa3786406d5d5fa65462d1a57 +pk = d0060a40910a30ba326e784ad37476107bc94df36ad4d86027981a834c6beb4225e62949dbe92970cb82e14072e54a6ebb462f20e3281db1b92644a021cb48895c665b445571a76aad1330adf7ce7a012da8d4c8cf665d1ba1bbf512687eaca39b62c44bb78b42018c16989c4e538338e983b31163646ba1086329e19a6485734fafd5376a07696575792403975b548920a50dd32357cd60ca691a16195aa06eb409b50154f59c4346f71ac6ea9be54b0798390d7930a23e0b066af5c5677708f6e8c92db2af44d70c6403c4af9c5305bb89b3ac7f695b26ecdbb757796c3fc96d97577bc5667d7506a74695076f1a97e0e253bfaa9a12d011414c1f05bc372e54804bd73e3ddc523c11594bf5642b9843b1cc16ce13937d66cd6f40080710ba9e747acb0a6696b93ec66aa47d727724b1cee2976619082841a3a29b8590c9219676cc75366342838a9edf573b57e4bf23542d6a2107e6562d16f030e2c19afa0870ed124614a285b82b40b84a131cbb100ca62d1b623a07f0575c7862bccc9e6ff402fbc89fd2c1ca62068e0ae88fcea6cd8fa2abcde18f4b3887d98232addc3a4f2413c374431023c16ef65b8ec3c885a0990d6189b4cc1a145ac3d8932a2d7857836a6546bc58a7cb3745c1a8fc41ba3a2c3be5725f5b9248610ccf5df4454178a8485681d5bbc484db487997cc49975e7c923f7654457530b2e8796ae15cc6dbf6967a0496ec16ce292c9b1b6c8f354b27b9b5311db71af370c13f510e55ba5a49690c8e76c0925c5f43b7679be2bc9afac67ba8a258acc8d2284f490779d0e634eef4762dd79da8c19080e6b05a5c0226910372671429ab0cc8888a6e7b9969727f495cafd82acc92a8361e234b11600cd7c9275f1482b4018e7b44031c305774952a26634876c578bf7a24d1649805fabf2c7ccdaf576619db784799bdf09220d5c3729ed0cafc863993c290b550c17eac6def28a02af431e515a2cc8c594bb4ce726bc964f4c07c051531f617db1bb0970a0d5c1a7c3312681f71910940b758132409087de3ecb7cec6921da70f46f57fdb34a90ac11b7e717b4416a75a703ce0306112cb34030500a6651513b776b32529638cc59f7929ef172c72a740e5c7338abaca58f089dc8aaedd2654681b4ea1fb42bac7a1c17917bda9a01081b18e0545860a1a76084408165e63606c99658e2df241ddd83997794e407929b75bac2f177633e279fd2817ec2b7fa239a613a0a496c19f01fa5a96a86c66ec3458f086b01b2e60f396d75624988584c2755c0a130508c982a69332ebf8ca92a9230dc95f5d96646ac246d27035d00b9dba456a621572e34c6af36b14c0100002a892b520b5586529a076025a332e01d802cc10810fc79aeb137db61b88b3e67148e84736436ac69a5cf6502ce7f84a09c7a6dd1797c13100a0657461105c197c92b6d47ebf6724e84b00a1d2a55974ac18f59f1eb2719ed49d464a4f41823f169492d594100a4a8b8ad71995f730a934c5e8e9ccb80c54b453c03cf37b8cc98935c24f35d41bd0090fc29c04dcb8c06c6c08cf299c084a7132b38ff8c82740f066beb6c5b94ab36bd68a0490a457cba78bd5905e5ba18a8a496ae526558aa74367db2cccac958f8410f88320a5a73e820e5d8178ad728ba7ff67cac50775c3 +sk = 76fa8d080a3a20eb8b40361f774cb4de7383dd88958372396eb74ee3bbc7b40c982f4331dca727d374c2a459ac4cdb1bc9a89ecd8c378fe8a6541692bda26ebec73c3de8c2c2aa39c3d61c85bb288ebb8a38c7938af27a2bbb23906654c1a966180261488b0139e6a7aadb2c61d9bad552245c0a3678c16580e0b163f6ae7df2b0126b107ddc7a9f0558e9a12d44587b6146aa892518a76115c49aa663c1a58ae700b9e608cbc45f5f7ba99832ce726a6b515b5faf24030574af6d090f8fbaa4a4f96fb8d815d477a9a43ab74e369582f3872578618ec615269349c8eb9362f862ff52af8fa29228a0cbdb381f92b08506c3a66fe04d914599da32ada67799212231df226a24a9384bec816362095381029a9b2a8fbbcf06356af2b9bfd1613b2dc462f7cc1d1dc07278376967598ff7228b480864e8f59f9eeb3e22f6a1a4936f37cc568d295d3fc61679c6bc8ecb1887b35a093c2b432b467e281855744e0a62a84d7787476ba009a20133644999f6951f32b51cb8762fd708163b89eb15c680800377e11ffc7cb3fd04559c92a50e1501f8f4840cea43c8c7c715979a04c5b703c68784f92d0a0866ef1992127126e0f02b53f8b9fa289509398b4a9aa9b0c64ad8661d93f143546451580812ae433a3210b49f74894dcb5feab650cf251330892d7366071b44cc032c7d1c937b51a667b0cc2752624c1380a5c365910c970cef238bddd79823452b7a240ee6b29def969188b97987b218471097a0f6bb1dcabe933ab24e015335a664d1a42375d231377627ffca161d292d807409af4936af255f40f95dd460058c12a43eb027365b032cc1786afa4f1aabb0f87b3db1a9878082012a9c79f55165aba764da9b2e4305c43b122488d9b340ba4811429fcb6105c937388373375d22537b1512b2cc250fa64f43b6be72e5c849a61464d36272f6c6847a41365167a42343012227bf8c76fb629493265ffc4899d58c6927094a46505db949cec8030d1b19cf4f9c5fb1582f6e1477287b00ce86b76abb69ec11bf5ba134fb7b40a79ac284e2c3e5018bf553a4b30877dd54c591d9be49438100b08ea8c902013b9b6a11b6d06a4834b3225ec7a3a5c59176a2240a944f4cf95be0b27148a3a3fc51a4d7253c0862a0008784f541b9bfb77fc4fb8a6e6b428dbc8c51a6a8a1819fbef4ce11c5151199236c4c82a1f027fa409283c4798e754585fca3e8004c3d29177b1c7506c70591fc278ba4ae69dba78e6caf43a617bcc465240c71df369a1ef6c6d12baa95158a5c168f293aabb6d65cb1c301ce471a7783b91aa18d97281b2e7b64f9e64c4ceb0ab118bce2e56c43a04388f12f05cb11c6aac8a64bc63b56bfee9322c4e7aa599a9e2240ab80f26e89b5a0cd3c57879c89f41c9b8718c76b95c4a79b1bf7410176c955ca40bc1d07a5312c0271f73a33bb81f05c79812b5c65373ba0b9a033d56efe1b7855e26ea940b534e81043976b7106320e3464a99935498b2045fb15b32aa762f7c66b1a3319e8570956a0550ab81720a83abb25df5021ca2c44f5a67ed8eb5dfad134201b39ef7979499c8797602914373f8e053bc276a860106f4c5212f8e13a8d829ee9d8a926f2baffc746d0060a40910a30ba326e784ad37476107bc94df36ad4d86027981a834c6beb4225e62949dbe92970cb82e14072e54a6ebb462f20e3281db1b92644a021cb48895c665b445571a76aad1330adf7ce7a012da8d4c8cf665d1ba1bbf512687eaca39b62c44bb78b42018c16989c4e538338e983b31163646ba1086329e19a6485734fafd5376a07696575792403975b548920a50dd32357cd60ca691a16195aa06eb409b50154f59c4346f71ac6ea9be54b0798390d7930a23e0b066af5c5677708f6e8c92db2af44d70c6403c4af9c5305bb89b3ac7f695b26ecdbb757796c3fc96d97577bc5667d7506a74695076f1a97e0e253bfaa9a12d011414c1f05bc372e54804bd73e3ddc523c11594bf5642b9843b1cc16ce13937d66cd6f40080710ba9e747acb0a6696b93ec66aa47d727724b1cee2976619082841a3a29b8590c9219676cc75366342838a9edf573b57e4bf23542d6a2107e6562d16f030e2c19afa0870ed124614a285b82b40b84a131cbb100ca62d1b623a07f0575c7862bccc9e6ff402fbc89fd2c1ca62068e0ae88fcea6cd8fa2abcde18f4b3887d98232addc3a4f2413c374431023c16ef65b8ec3c885a0990d6189b4cc1a145ac3d8932a2d7857836a6546bc58a7cb3745c1a8fc41ba3a2c3be5725f5b9248610ccf5df4454178a8485681d5bbc484db487997cc49975e7c923f7654457530b2e8796ae15cc6dbf6967a0496ec16ce292c9b1b6c8f354b27b9b5311db71af370c13f510e55ba5a49690c8e76c0925c5f43b7679be2bc9afac67ba8a258acc8d2284f490779d0e634eef4762dd79da8c19080e6b05a5c0226910372671429ab0cc8888a6e7b9969727f495cafd82acc92a8361e234b11600cd7c9275f1482b4018e7b44031c305774952a26634876c578bf7a24d1649805fabf2c7ccdaf576619db784799bdf09220d5c3729ed0cafc863993c290b550c17eac6def28a02af431e515a2cc8c594bb4ce726bc964f4c07c051531f617db1bb0970a0d5c1a7c3312681f71910940b758132409087de3ecb7cec6921da70f46f57fdb34a90ac11b7e717b4416a75a703ce0306112cb34030500a6651513b776b32529638cc59f7929ef172c72a740e5c7338abaca58f089dc8aaedd2654681b4ea1fb42bac7a1c17917bda9a01081b18e0545860a1a76084408165e63606c99658e2df241ddd83997794e407929b75bac2f177633e279fd2817ec2b7fa239a613a0a496c19f01fa5a96a86c66ec3458f086b01b2e60f396d75624988584c2755c0a130508c982a69332ebf8ca92a9230dc95f5d96646ac246d27035d00b9dba456a621572e34c6af36b14c0100002a892b520b5586529a076025a332e01d802cc10810fc79aeb137db61b88b3e67148e84736436ac69a5cf6502ce7f84a09c7a6dd1797c13100a0657461105c197c92b6d47ebf6724e84b00a1d2a55974ac18f59f1eb2719ed49d464a4f41823f169492d594100a4a8b8ad71995f730a934c5e8e9ccb80c54b453c03cf37b8cc98935c24f35d41bd0090fc29c04dcb8c06c6c08cf299c084a7132b38ff8c82740f066beb6c5b94ab36bd68a0490a457cba78bd5905e5ba18a8a496ae526558aa74367db2cccac958f8410f88320a5a73e820e5d8178ad728ba7ff67cac50775c344bbb60ce3a7611dfc6a14b2d4f91a50993fba4ad785d8f05cb8a23ed8f9e89a1eaae6bb91b27cd748c402c4111140d5a942cf3c95ff7977f88d2ef515bb26d0 +ct_n = cf3125a6f30cf0d78f4b76f6c6877dccd180b2b8f7afa1ed7326a18123c0b20156902bb1fc6ba1f4f41a006b15e41d18a76440e5e20b2375665806c3ef5663704dc098d1e6f434a56f5f7579b860284fd8dfe84970cc47ef1afd9e4e3b80a3ec8fd739cefceff6567dca0944ef62af068298afc6723f196b4b71161c6177e2e8ea4a0f9dd37815b70d2d71a2cddeae73b28c9ec9c8fb5727eed252fa167543a77004f94598a32152a22bf611d275d1b249efed12b22269edb10718a49c3161b4a387a8654a509f9de7c8e1dab5a5d13c6b5b480c87a7283aa8df023f0bfdca6c32b18b7ae3f1f89bc22261e1af19202cce59981284d8094bc146aa0a0bcd5fc31f5c3d22f8e39aba1c4f5384e9018c0afdaf395b761b64afbefd50a89ed99b820b09ba286216463213cdd3e5239f263328419d6c8f377896ccc6d49cac9cb3b19a643991d1c1e9a3b3f8482a031f99e1ca839c0339e8141eb48c4a93115514cfadb9c47a6eab8497359fd92ddb442a8ae5b2776bc0ffad5d399f05cf72b872b492abb55f8a6c0c643d8fff627875100662396a849bda878b90895b93614623563afd24d76c9e02a85065e9dba056a342f0c7f516a37235023ebc18e8fb8fb6a675fcbdd5631ffc6930d7735d74bf7d7ceeb79c1d6d827ff1af5fb25b9cc20b9387fb11bce9c8844d1836e65cad1bc3f5087bdeb4cac03de28fc6e31070631f36ab5526d3d2f886dca8436122c605385985cb5dee7b09ba88d6948a7edad4a882a0bf6a38f9ba0e9f0dcea1fa1d19fb68ddf43eec7334c20ea8c7b1d633b55bb3fd43074b5d725a0b92cbcbc35221dba0142c5a942fe841515d191de04ca0a8540f15daa5c5b43726c1e0bac85fef0068ecdedc16b2e7135e1c24677439d9675cac9cf64fcbb76a18c1d098336c76cb5a04fd2ac395ee7a9635375c6ffba51f9c44042ee1df0cf368f35bc71aeabdec02cd35c3bd0b5943eb1d99a8173f43a789cfacea1ce6f1966e869498d097df7dc262c8b5efa22e5ab472461333a13bae03bfc8fec7699097ee8574ecc0e91224c8a2c10eb857325c627c197abb8ac3fc3f579f0eddd32a6c98c3ea07a2a441b3d996dcdd304ee23f04c26d68b1707e3dcaf4da34814caf447a3009a563b67db3e1b2903e0e56916e23895ca0477927558f7330d4a872f08ced8e63f2332d07a7913773dcd7592e234cb715e6a27073fea32461d04f92abf91fccf745fbbfee40876ad5e5bb403f5bdb0f4a0fef88b1e840e6c8496ae0a70a8c968116e70e4e10957264779c27b5cb93a15de977622d62cd92c723fedec110b2886bceb7f9888f426646dcf012a64c3ed2526fc81f2f65b0fccaba418650fbb550419247defa6f72d01e6821197d4d4247f08a283a6032386c48511fde52f647b79cffb6c71a1cb0d225697b25c95ac5538d9ca850f1762de8e5c88c404dc016f849612427e173eb691e76e4ecd1398e351fade49163620c9675ee6e8b100650fe9e096032735e49376e95ab2d82e0f3ce67ae55e315dca3 +ss_n = 488552101a21c9cd873146b83fed69d26376f700312566ca6b6df07bd5585d59 +ct = 0dad9235274660119510231d6282e3d862ceea5365b9c7f783078891f3358568ffb10086d0685aac868c39235ae909ab7f4c65dfe149b5f69eb0c94080947958d71db262b5fdc05a1ad881131ecfc1c78986187f394140d392359a6456fcea0ee1ce0893985b7b614c46f0445d123e5876246331ad742345c2f74e1da09235a101122fb78b73e8f1b52cd8191d6fa780e55b89257cfb581443e5aca52149c423d7658c6aac7743d5c3188e61397a7408f9c52a8cc8e8ef18370674c5cfc0f03c51c589e79e2f2631ff81bc851eeb5789247ad3a0f956d2a74c17f935ae7dc9a463f3ee150c8f3485523899182b84011da1fd4058a66be3102a0818246d93e987d27e279801377d317bed6ef9cecb745c96d348501be3e4d5364f27ad7374132c58e3dbe65b1801482a89432fd4fcda0850eab1c75b035b4b8f0eccd0f56161e61e0b5a1e43b995f8ebdc0a92ff299719b6ab223e84f1bd816cdec05e35126441e4c3f097d8c6a98f49c137b37fce1d24587f810d500cbdec5a187d36967c5f2202b4b7ffb4a21a8751890ecf4c722ff46b113cd78932de35a7aa614bdcdf276be1f03674834e7dc75439ea8aaf1c88173bc7ffb8527dd85fa44c1c8c4a50b246cde630169245a87e68b0dae6925405cdfc4e0956d53ea7ecf767dc5dada24fd99f6e89a8472bfe9d25ce8807bd93da5b1f2268368847d77657ac6cbaec6de7d487b2c7adc1f866d769feed319f4a71f5564ff9b462dbd731eb81b603f051147425d4a91c081f349706cb76d8c702ab902f29f337b3b64b063881f58fd89410596880ea32b2c46fce458e224034230745c5e8933caa77b8d4f0970a582ecfc3dbd74178bed3f7f47a41f8e5a43e74e69f01471b8caf7c49ef75dfef9bb2c80206f1ad2547640b6b3b335e06f252f08a7aef02202b6a43604eb3517a0426ab50e5efeed9479f62f0b3a603081979a0e830cf08be3340cc452700cadccae3cbb23163728567b1ce2f340a1df94384366a061c1373ceabaaf8988e10fd2049333473277c87185a6a1ad07499f8ceb29d11d504bee7fb0d6e585fb812bcb6aa91e0cc18caad071b8b3d1f307fe872b13107c8f24cf94731000a1ba1923f32021f127900f8f7238fa95988299879a45d560a329479a468c0101b34991cf600c5043ed8b3ed2250615ca3fd5018f704603cf6dc53f25e2e84ec64f5e42cd8b9aedb8011d3a0210b20d97b68e8848450dacf44916a9cb785d804c444e9e7d307d75870c22583ba395679f1927236c570f40db0dc2a90c162b4fc66cf31556d6cd0a02c80c6d422b7545c686ca5023771d9b0749c6d1dc1e93ea0aa991b1a05e726782623a52f10fe4dd53458be8a2d660b95ddbd930d67ff5b8eabd961e68a2bd51bee935ca8bcc79db1fdba2c7884ddee00615da89c07f895c4185993c67d43268490e778baba6e3e9b02b6e68e9119788497f949de3e376960c220354784929cc2797d841ab279ee3932b8470bd28574363d1bad87f72b6948853e919658db447c0808 +ss = c0d45764e3dbf0948b914d6f65c92bd0ebd21556e5076753af48df8fffd6badc +count = 3 +z = b585d4eb01085111a172a87688d0032e3381a9e9a35fdd6ef2f8aeb3b40eb5ce +d = 89b0c4b23019af3498a27da290892d981dd59fa08993bc05da21e1d72503664c +msg = 0f4a070a0116194e267437545569d94aa5b2e4400645d5de88c504b9dbb1455e +seed = 950684cb360ff0c011fd02a09a273c9f023d0a34ae0aa338c6f5283634ae9bef5d100bcd48f6577e5910beaafe6c52c3 +pk = 533145987cb33cd2c8f5ac8a73c03a97fb31d2b89d02b1576cfc77bc97656fc040fcc7569750459ee753ebd69839692b375a0f53165b191ca8c6185b85626282c0a4ad63b36b6a289f661d505850832248d6f39084695c028b979835848931874e037edf33cd9f1521e2b478bf0c37d859572ab08c20f7687749032949ab7457b66c1206c08a78c58633ba008e8770224700b84758b22b290e9ed01f750439b00b97729960940817d3ba0ce7f10eb6a0c8ebd975c85a6299a6ce486132292189f9dcc13f275918704192a417e7b305834323c354213195bad0a5aa30a3980b028a1e116e97e74ed8d053a2fa51e00068bcd69d325246e93a30ad493d28099af143016be454413256a5da144c9985c70664ee12013df167e228b921ea3bac494b5d5140581a4d7e7080b4c284a6daa955366eae3217541a0b1109313f7a1ae9305d55b45cb6a5b2f3321a10db137e92306a3b2a25fc1999495f7a732d7cd83be0923050a5562a036699f92427cb71c0ca201d958f7a3171740ab477188db276a52e576703493e289c14bf896d5a827586492d23b605cdc6932a4abf902a219f88b12d0479c91b4ee6c586a4a2061fc22d66264772359b569456111574d84606cba28292c37a40b81f5a113bb9e72871e14184270fe2a87c33ba7d01e95a578950d098c48a584428bac781ba938f13bb80f4790ec36f1a394fec97ab80054f60a90da86abe7d84799a604233a5a495294d13805b6cf3505db833e9f223d102aaa9e666580b088e1cbabc4cb52725cb768b5e990b89411aa652e06a2bdb937b185eb924c59af6ba9be2ba09409db5c262d751731461a89aac05adacc320b6afc5c4a5fdbb2f56b2483d11779c7117707b121d0b36362b2bf8d4b28f6948f5eb1d5e41b1c8a5053d581019c36ac87988803cb934027909dc4c5bd1ae2ef451d9f7945209c0e9e60af43c50dc98646f3bb13be6491e91930d9aa1aa315fb3b1a067579565d170c4e888e9042751106b72a60470a69992508e8ce3101a602a22da7fb1a744f09488e704481f649dab6158e5306f573009ec63acf11b549d280033343fc9750bb927b931b94f9c5475a2b803af36cc3cc30521ea2a86040e03e7cf90b36d2e370856285ae4523367482e68473ca500200f75c8c423c8ab93c7bfe74df253af97114a3feac1ddd34e06747c6b386990428100a99351ba14a3c19b1a7a6da5a715f6a698e9fc330c13b98d61a2a85ac0e0896cc8032490b93feb284703f21e6d16307d7886f948752fe55cee7291c06aa7bbb79146c644aea7c2765c5efa535b729158eb51bc2d4c389b970b30086966d858d51b78ef3829f9290daf241c6d370425d83ddd61153dd2ac0fd206120434ad6792d60b2f084a2950aac250b4001f309ea45b09d9db440d6a2c9bb3b140569c51c985a2b0be03aba918c2311b11069fc9a0c762cca59c1bdae47c0406af0cc7bbb1821c0f8733563abbe896525e1156f7d593f55c39922b6b79e462ce587189247fa045cb19fa7256b960d0b25b7b364ece250d43e19313c798ce424634dc358a0914faf33ea2b06eaa748947c6c150e54d7bd3a4c4873b117266145833ff04caa96424ab678b49ba94d6619f01bbc62961850cf25765c7627910ef8e79f9b3749086aabf75407d7ac42748bc +sk = 9f58786f73b044b8cad59124417c8b16b79459c8a563c707f892b17e1491aea52e24c019d3246a03a538345031b4c3c1ec650e3faa3ef95b562c3ba663515f0eb8a1b6cac0f7d49b7b56ca4045b57ab12fd13248932148705349f9b4a635a09b5cf9280e0a1864970825866e256a1555c55eb307a178797abbfb887c7865cca58ad0394acf5caa98e3504e08434616c493961dae558a68a931af31c147a93d9dd355e35c9c87d603a355ae2de230b52aac12791ff538325a7c7ede5c60ea7abe25ec9fb00958b08171b2e60237773d1166869ffc8b5bd9cf53bb2c78027ac3fa29e8f7a259211ad654404f1c573df50368296d37d821c7b147288803e5665e77c994914676c458a2e0fa8d3f448b589c4127d82baf55374e46a79fc9cbf1ea8998c55ea4d18f4d8c1a503c7df16cb6f9085d0ebc5fdedcc37f6c9f740cb41923bc059c795d1a9c72810b7239ab034a4b5be47944b750ce78b98f5638539452323910118a4098141b3d9870230500f3fb4047d77b9d277a039c0d01c161ad0663f7c886e5a6014bbaa0992b3701b2150826984d12c672e14e94c6646ea3578ca9b607a31a5b1ab5a0c74d3e8c21c404bf7eba6bc2757b34f99f63572623c215c5d1622e922bd0d332114bb5ac423d81d4811280764ef9c831ca364f33be3ba46cffa5be60e5abc7cb52c820791b3a563b8990e84b5e92886adcbcb86e8b32416baf91bc468ff206e7dc3b1a8a6feee40aaa624055e9b0f233a1008c6dcd740afd700b0892504c97197cb342628770ece83a4ad10d73b82932c72136910679404890a4976e918aa9d5c72676223290399cfac2c8739f4fc573d7f379adbb47b7c88bf15b1a35a38a1a34b81a472c024c7a2f089b17113ec3019852b38088445dd12a52eb194e9b1c5124393b66f0aa0b20cbb13141018c114ecc8017f86fb0a029e25aa9003c0654640121f0ab28da5709a61600427a319b87626049207c0cb7a440ffacb3b51b32c95404c194333ee71e9b11a24507250b0a5cb096008e7281c726109e7c1e1ae82d340280d179a4a7b196d4638ff9c349a315a1c7462ee95a63255742494c6bd83a2f9c68c86e995cf1e613e323aa9f53adad425fa01c0a704b040e0070e467549724385579565c71999299038b871b910504e5167e94100677c4230389c47de78fac2439765370be464eca6b8b1f86cdffa138b20a3e7f6b10dcf200f3269f20d60849e9a0ef698930c2287305704d97781ea7ccc971cac751972f48c7453a4a0efaa1acb9c3a53b2d1cf39c563bbb185031edb591a508620fd26746036edad59d748a60d244794f5628276cb3ec0a700e561ca42805946aaf77c405f1b15618438ccd707ba743371317c2a47636bb0814e4d52ada63a45a86359479c4c8e30f6e57067f882b52783ed47901cd4b7e0747c9dc3c2c5db1c5226493b2945aac0b09131b06d2713e3920c28cb9a1b8862a2ef59ceac671dc0c7e0244525084a8821cc3fbe7acc4c68191078efee112003c602ab81fd0585478298a804c5f73c35c3b6b11a76188777c796123a90b01946bb60a7f6960c4e111e5d04886d9991470cb0727b6b6506f0e970a02a4343da885ce31bd23c19f5b870b533145987cb33cd2c8f5ac8a73c03a97fb31d2b89d02b1576cfc77bc97656fc040fcc7569750459ee753ebd69839692b375a0f53165b191ca8c6185b85626282c0a4ad63b36b6a289f661d505850832248d6f39084695c028b979835848931874e037edf33cd9f1521e2b478bf0c37d859572ab08c20f7687749032949ab7457b66c1206c08a78c58633ba008e8770224700b84758b22b290e9ed01f750439b00b97729960940817d3ba0ce7f10eb6a0c8ebd975c85a6299a6ce486132292189f9dcc13f275918704192a417e7b305834323c354213195bad0a5aa30a3980b028a1e116e97e74ed8d053a2fa51e00068bcd69d325246e93a30ad493d28099af143016be454413256a5da144c9985c70664ee12013df167e228b921ea3bac494b5d5140581a4d7e7080b4c284a6daa955366eae3217541a0b1109313f7a1ae9305d55b45cb6a5b2f3321a10db137e92306a3b2a25fc1999495f7a732d7cd83be0923050a5562a036699f92427cb71c0ca201d958f7a3171740ab477188db276a52e576703493e289c14bf896d5a827586492d23b605cdc6932a4abf902a219f88b12d0479c91b4ee6c586a4a2061fc22d66264772359b569456111574d84606cba28292c37a40b81f5a113bb9e72871e14184270fe2a87c33ba7d01e95a578950d098c48a584428bac781ba938f13bb80f4790ec36f1a394fec97ab80054f60a90da86abe7d84799a604233a5a495294d13805b6cf3505db833e9f223d102aaa9e666580b088e1cbabc4cb52725cb768b5e990b89411aa652e06a2bdb937b185eb924c59af6ba9be2ba09409db5c262d751731461a89aac05adacc320b6afc5c4a5fdbb2f56b2483d11779c7117707b121d0b36362b2bf8d4b28f6948f5eb1d5e41b1c8a5053d581019c36ac87988803cb934027909dc4c5bd1ae2ef451d9f7945209c0e9e60af43c50dc98646f3bb13be6491e91930d9aa1aa315fb3b1a067579565d170c4e888e9042751106b72a60470a69992508e8ce3101a602a22da7fb1a744f09488e704481f649dab6158e5306f573009ec63acf11b549d280033343fc9750bb927b931b94f9c5475a2b803af36cc3cc30521ea2a86040e03e7cf90b36d2e370856285ae4523367482e68473ca500200f75c8c423c8ab93c7bfe74df253af97114a3feac1ddd34e06747c6b386990428100a99351ba14a3c19b1a7a6da5a715f6a698e9fc330c13b98d61a2a85ac0e0896cc8032490b93feb284703f21e6d16307d7886f948752fe55cee7291c06aa7bbb79146c644aea7c2765c5efa535b729158eb51bc2d4c389b970b30086966d858d51b78ef3829f9290daf241c6d370425d83ddd61153dd2ac0fd206120434ad6792d60b2f084a2950aac250b4001f309ea45b09d9db440d6a2c9bb3b140569c51c985a2b0be03aba918c2311b11069fc9a0c762cca59c1bdae47c0406af0cc7bbb1821c0f8733563abbe896525e1156f7d593f55c39922b6b79e462ce587189247fa045cb19fa7256b960d0b25b7b364ece250d43e19313c798ce424634dc358a0914faf33ea2b06eaa748947c6c150e54d7bd3a4c4873b117266145833ff04caa96424ab678b49ba94d6619f01bbc62961850cf25765c7627910ef8e79f9b3749086aabf75407d7ac42748bccf65ee3c07e586f906a08aa0c1aec90e83613a1cf31cdd651e56866ad8033683b585d4eb01085111a172a87688d0032e3381a9e9a35fdd6ef2f8aeb3b40eb5ce +ct_n = 2955adb5e21a1f72a2e3cb633a3e0f42fcac9096b0d62e4a45878ffa0fd6bdede4118fe325468a6f2b7e91cb6231413354c4c655d9aabb9d336064673f55857d2e9b0835d165a3bbdf8fe9de7e14be2ff03b0ec7e517afcc8bc682f6d6626491a9bfeea98f961a2a0740ff32da198559fcf5ff2c38695d17dfa8925569c13e5e0e7978f6990f9feb3052ad995b2405a010de041b36ac3c28e4df6b64e6bcc43808e63e1e4b76de4a7dca791c263f107491626a3054c229c648a89f27ced4670dc9aaac3fb95eea408833c318e92ae9f9719192b6b641685c6bf900ed4108245828aa1b7a2dfcc6f882701df533263c561bd28bc3cddf84ed00eb20da09f0089dac580d81974a75e48d52e1449ed97c5973b99a5a5a0980f4b140412a42312ad1a07f23a6d0b004437248e0de79b6e58f339284aae8c365e33c4a757d59805538ff8f1a6b6352a319291bd62e4133a8c3537bc378327d7585d61432c8afdb358eb785d8167bc494dc02dba635d562800a6fe345c7d52f6f78cfe00170324349bc8668ced5596b480658ac7db29ae8193d07056d2077a7c39414bced8f4e7312661caff6bd4cbc9a4722b823e90872bac85d808e805d6b8e7a45d90f904602f4a38e2163ba848dd5de4af6640400c8db59ece3537ca6e8de78df4d59c96f7cec9b525a0c0a784bef4b800f5a22d0d5b3441f88ef10dce8bc20ea03202e4393382f1c688f730b4991e97e94d404b787fd15ab213af68859f6dfa3946ee932fe944379d4dc263a4ebc175a99ddd83b32d9b7f848fe661c60473e8090e005730a770544e8951c566bd81c41d36139849a490319b5bd218d292dc8d49fe7ac7fc90bd999fa4efd83f1b18dedf39cb861e9a861d0c07020d6dac8cc8b8ea57ce890f295323141ee64472a85425fb6b860c25c976d70aaea1100c664d90054defc8caa043ea41f229179dfca9c525e0cbd3e43f797eda02f2072582a8c3fe23883d6cd28269b056e404b99379fe0ca83a0dac9ed33980dbe3b178275c8e0500ee36793e6199df4684584cfffe398bfacd28eac58bf4d83bfe4473cf45a965ae32aa770e059c24c8b3e7c02bd333fac5137c0b5bbd34b356ef368722959acaf3c6d042a2f21cd2abb059519cd18b2016997ef854cae1def19f2da5bf6df3a80c08caa17fd68e62bb6e928821c6ec0b9de6fc132b650aa1b919207a7759f87c6381d454d669819758533883e417fd21cbf44706a144b0bb183c8d6d5607a9ea29d72fbd8f9a290b4990e5dfe27c0989a4a10685903404a9081fb9af610983c6101f306f8bf96134f6e33168f583043b42d5df7f6a907d1d0cf3c8598e8f3e4ebe791bc74965aa917527980dc37cac0a1429e9bf310fbb90e6def45086c3fd4cbb6d287a00d7ccc2aa58ab9ac8926f05f11cf8f6d25097b459821fd55dd7a857fb84499c40609f598c8672f3397c3437e4f423099364b0d10c519eb68b554e811a241eaccc73d6a4b628b528022983249c8f093c54c80a2ebf512010e6ed625ab32c0a10e17 +ss_n = d74b5e8aac49d42ce5a6ab8b0203a96b2ede27a8a4b5f50314fff966e26efe38 +ct = cc1160b24f3ab56d7e3eef460a2ad73d0e5b50bc5fd6e06d74c80df6295a5e7fed8664c9b819abb90bf1b2481ca3958ede019e5a8d215e3c3b2fc662e6a6e5f4d6cd36c30c747745fcd8f85560645ec010987b87a7b42e619f388fdbb9df0b916a01ad0640a9b761a9353de373033ec5e2d16b59db508ba33259b9791691fe35b2f08aff381bfc9a74e380dfac915b6165ed8c276dc7112fd36b7c21710ac6a2201179642baca216c3d4c39ea74e75a370b9ade85a2ad8b00eadcc4ae2b3819374fdce01f4af02535194b88933ece5a9b90c1886efbcf40b1505d4d2603f7fed815f3b101664a90b239fe598e90c09069e102c500912c71f53396ea1c9035682c9ecb1627193fdee803078e4cab436b6cace8a861ad95b5f53e6c9757eedd7fc9ea369089e82d2d32c95209460bd880c7d856dd8bd589e131c991e1148b5e4139e7f4ee32b25da676fcb279ed94d9b28b6c4843f07a93fadc1314869d2e271d90d993e4f5b654157bdbf45215d691afaecc498e9adb3a798029c2d68665878634e02b34006ba953db444203c88c4523bedca14358e0b129bc712eab69d1c253c490dd4e5f751fba1b38ba200a3e73e78299306855237c6f72b15598b2eab30224a22c2c7883c6bede636c4d1c06ed0b6793e4609969cf8a442614c8c547598c26cc848bc4593e24591fc85f624548a1d01ea5be04892c5c12ec07f70c8ca51c4ccd1c9f061ee1bfe07112c2577552966eb25759e77882f1b5b327964e6269e36c1d5ac9c94b01d891e1b3ac2660c5d99e32364ab31015986352abb20a228c358a548d1b413ff534550f2ee0c80e0741b7f90dc22e8d701a44514810820a5a1d5ee62173283f91dab585615e36a520fd7540ff7e7b9d6f2fb616251f1d2b6a034af6427e66d559d7e04f1c7c22fefa5f3f7b256d7225d5f683fe29238754d66e10687290675202cd15a32a7f71b5750a95bfcc183d2c26bf31d41225c04fbc123683fa911b994c5b9ae5172ee9847356c67302e7c405625543b7fa82d9be737467f7c000f97ffbb647500de9ee36a266f97ae83ab58d239533c8a2fb440e649acdf6efc8d98baf10a1bfa0f7681ec9708bab9d00a78fff74aa4c7099d6da69fbee2b7c5ea7ceb04527d01ca2cca8416181ba450c2519a8f383881ff439dedce45bf0117cac0a612e52ad1a3b2f2d1c9917264dd131813f3d9f6d2d574d6ce9aa0943aa7e84c9bdec515b6827921366794fe6b9058769adcb3a14593ca49a866dc7af5bcaf2a48bb06271b3948cc64572ae3a9d46a1209d3e70a02d50ac3cb0aa1b820f8ea25da127931406aafc9b00c0fd90c7597321586694e35ea291a88665a2ffbae5c9be45938e60027c6c6deb384f873457b5b5c7107651ae0273df8a23fdff74a2a6bd67703854fa5e115712e84d6726f27370fde6390b362142fcd93647bd2d7a3927de5f5040f60e17c39d1248f6662cf441ee4b2470cd412050ce09ec31075001286f401a58fe6217000d6a9c8ba753c4ce9d1d8cf8b908614df0a81 +ss = d71bd5a07c158c130283ef854516d290a46ade09a63831c7b83b8fd0724c8fb0 +count = 4 +z = a9f93c7b791356b66afcceb745a548c7f6b185e4f45ec1ff1a22acdd96e7a6d8 +d = 8d45a2ab49d8c20d4ab5680e5c9d9d0cc9ca8228484946f9afce5b8df6f39d19 +msg = b3dbb0bf61a5230dc0ab9f1d21d5c16566ff9ad805a5e1eb7b2d6913d4cd5607 +seed = 0633ccd19471803e0ceffc7a11b2e7b70c3329dfdde5be18160df0d4c609900d67154893921376cc4b4b8c586e3efe79 +pk = 06f51174f03c2fe07cc31b0659b87ebf124237811b88b980bc277f8c050b265cbee1a4ae7145cb9253281bbc291f2808e065855fd91c7d14122c589fb21b45fd3b7fbb6562fd53006b565189ec983c7a0d4c21596ef3795ae22ecad71f75395558b55220662bb66c389ed9ab6b784476e1788f34b28b59a4c6f71f9f6a49da80c4d3107db2c306968b5600e18285f8bfa293677f699fd2d2820de490f530818d6667686a765fcc0009484d71629c1f148104b462325ac55ef34dd5c7098441a06757ca35c8adfdab6d36333310241f9970b1b123478dcbb75ae6ca39bb84ffcb23a593c24bc54e74b4086165bb4b10ae39f45447aa4ea5f55762386b11051b84b0a688c12c73336fc87164b7fbc7f0b07d2a51bb05560606d5558666cc322963ad3ca2bc1293260a94707770c030b2bc9c00477a8d5ff6737961480d48109f66075da9c8ab516f70a78da9e444ab65798a2565965a68ad9146fd9267d2a80c4352a0a988157522046620a63d9ba7bbccafd50a61384453f8545845b25e7a05745c4b26ef7211200a916241047fdabb66936bb7351c04f5cd06a10ae3c459b74bb0cd85044bf8b6bf2b33294014b9d68517cb1a9813230ba08813807a2dfcc6a739b6ac79575f19bab96a7cded404d0e52508214ad43763a0a048fc36785b2c718f75b3432769c1d2a6240336a82b39d865739af78e94a92bd7b4703210297fb82e0be57b97384db5b24ffa5486c982af48642d967222a28c6f83e5ad6a59ca486733808ba3bd86a780e59888011965a351ca949b0d6c72fb3ba0f867834d166819c252d9600207c88997318b2d204ac3619247a01829484f12bca2e8f16aac677c9e8ac209f9bccf019bbda66e8f073dfbd934e08ca15be77576029654e049c1c20b1b123e5f0b50135628cd2c96a5d0b1eef48fbe08ac4685247721b128f71dc748452b94a458f39b337bc2305ccc505bb18bf6abe3ec2c825799b95c13a1f6411cd3b031f3cec3d99afc1a28f2019c1bd129a2ea35f06415c8b717337957caa964e794881257073ff5c12c3c62034861c343b7f70b9d475ccc10ea5889910e04ca7eaf0b762db56962ec40ca47ceb4d228600595cf22421148cf02b4cfce76ad27701f925c01c71c5405534ed54b0100c280dd861d89e967bed4829c568bb76ca500342803835f7983179cda15899033f797951031138a83669ab4ccb4630058088aa0845faf7b0761b405ae866c426711eb152889d175e7b20da03126b7419a766416a68aac0fbc355da07d6e6339bc0539ceb55711f633b8c7392627497821cb9d7174c4e655b5928bf722c84b8233a0993b6de02d7364443ea4c73a754b8190243df936184819e1b8ab6f0b0bfbac6c47e66ddf11757be55e0787adc112c63e644d1b904877764d856abe78b583600cbb2119cb916c689d4543f4d553cac33ad19b245b4948ef0ba3e7d1151179b9fb2941f3674e5f8771677737c435b2383119a3e75434114439506e1b9145ff16b1458879a1039962434151619b77915d033a3fab7385fe861e4a25b125a205c3f1b16972470b2791534b5fb8731b20c03684ccbeb97a1fa4417655bb485c347519710522c357d50c43fc2644098533fe549c825f5dc8ca82a0dd908891bb4f92eaab51cbe036cd6fb59a749269a0a3 +sk = bdeb55386753a1694239e93c5a7691f057b3e843a6674547b09260eb7487f72a97cea27bd9655fcf36b19ca2bb6f68cc77c5afb90acdb38525b158c446912ac6167236b98a81cbc846321d0342b01a03c62c8a75ab51b1c8314e19e83d0230364c59ca43b59ed8a35fb3eb48fc5ab1a113161ad016d9e14fd2081ad25644c7210fac52a81eeaaf070382f5a719a723014e95109e0945da47880302be1a11cad3152de59633567812dbc82c84b56f87f10969f571826541ba287a6e805482b76d8bb2a91de984270859f6c24f08bc426229a1075c8399b61d2b70583b784d5b8c03e668054a5568e5467360fc243e44a705f806e5848a8e747eea3abd3cf6188e1160df385408d6aba2e712aa40b8f9f88b3f397421e392fa3a86d627982670b54167b9ff8b79ba70c4e3f9314874c94651cb04b937d9801433c0cc296692f305a13518c94daa8969106dc7c2121e68ab552a6abb854a1dc12b3b1c06f7e0c7adf373ae3278482669926bc559a0102ee76ebf1102343634906050b9e1072f69482f16311779356a3b73e8fc7998db7b3b7849557012e9b4c32976699a52b9029a7270f4c76db871642a13c4d48a227a86904bc647961d3079c966f30c579a6dde76ac2f3037e7790a76c598dad996491471fc010414913fdb118cf3d42e354571a03801d854ab6a390d14288556995c7603442c797d5f15419ae8414f463a1d2c9766d912c3872b743aace8105ce25024e678317fcc1c696a4147a3c5c11ca8e971572368404e072e3fa68f9341ba6facc361a02e7f3b8621715efa4968a25823c4622f252c7e77f7c1484555e4b8bf62e44747f7c295304e5712a63669c783ba12bf30619416039c77304e044ae68519cb3a01aae83202f85e70d47f2d1792adea59dd27b05036c66efc88d808082c955e803c89299a185032712ac1c3289345928c194480823ada89a60ca716f79353b289bc621a27496ac45531955268cec8645895adbc35255400840f226fb5b93851b03d01f90bcd88574d0b10b12919f0017a4c2b605a6050820c20bfb17ff8b7cafc169aa69174f54b520172390013c47d4cbc778625af6ab626928d05d5400d743f49f9cd8d630dc06002a366cd157c79752c1fbc5982de45926fb4b060f650044939b472bd90f563126227fd1210de997952fc0def4472f5826a22552b3034ae323514ade5c3b0076da5d0a7b19c94d78326f3132ca3b9898678045e158d59e88c29cb494702b154c9c2910aa695341beb817b288422157a4860408f86f253db7819f90936e1d13287da5839280cfed85062676ef3147ab159cc1e9472e8d21aefebc480d99e00701a6e80c07851b58176039a95a8bcf311a2d2587290a0ee0764b514be0d419295d593b8f76a381c31d222257cc9924a249641771183c258b2606b9433af8e976e07668a79674dd6c4490f9b8085d482ea9c2ce57c5d24258fbf4489c22451e6f1590733b0da582beba74f365609a95405ec4c4c913b316cd94465e81d6ec159767cc16f27030d7a7d991005f4a9b823302ca1aa45c103506854047aa54345ca3d1f0806bdc80ce6b821728069cae135e13731786b6e8ce05cad361a02fcbdba8ca240330d6ecb8f06f51174f03c2fe07cc31b0659b87ebf124237811b88b980bc277f8c050b265cbee1a4ae7145cb9253281bbc291f2808e065855fd91c7d14122c589fb21b45fd3b7fbb6562fd53006b565189ec983c7a0d4c21596ef3795ae22ecad71f75395558b55220662bb66c389ed9ab6b784476e1788f34b28b59a4c6f71f9f6a49da80c4d3107db2c306968b5600e18285f8bfa293677f699fd2d2820de490f530818d6667686a765fcc0009484d71629c1f148104b462325ac55ef34dd5c7098441a06757ca35c8adfdab6d36333310241f9970b1b123478dcbb75ae6ca39bb84ffcb23a593c24bc54e74b4086165bb4b10ae39f45447aa4ea5f55762386b11051b84b0a688c12c73336fc87164b7fbc7f0b07d2a51bb05560606d5558666cc322963ad3ca2bc1293260a94707770c030b2bc9c00477a8d5ff6737961480d48109f66075da9c8ab516f70a78da9e444ab65798a2565965a68ad9146fd9267d2a80c4352a0a988157522046620a63d9ba7bbccafd50a61384453f8545845b25e7a05745c4b26ef7211200a916241047fdabb66936bb7351c04f5cd06a10ae3c459b74bb0cd85044bf8b6bf2b33294014b9d68517cb1a9813230ba08813807a2dfcc6a739b6ac79575f19bab96a7cded404d0e52508214ad43763a0a048fc36785b2c718f75b3432769c1d2a6240336a82b39d865739af78e94a92bd7b4703210297fb82e0be57b97384db5b24ffa5486c982af48642d967222a28c6f83e5ad6a59ca486733808ba3bd86a780e59888011965a351ca949b0d6c72fb3ba0f867834d166819c252d9600207c88997318b2d204ac3619247a01829484f12bca2e8f16aac677c9e8ac209f9bccf019bbda66e8f073dfbd934e08ca15be77576029654e049c1c20b1b123e5f0b50135628cd2c96a5d0b1eef48fbe08ac4685247721b128f71dc748452b94a458f39b337bc2305ccc505bb18bf6abe3ec2c825799b95c13a1f6411cd3b031f3cec3d99afc1a28f2019c1bd129a2ea35f06415c8b717337957caa964e794881257073ff5c12c3c62034861c343b7f70b9d475ccc10ea5889910e04ca7eaf0b762db56962ec40ca47ceb4d228600595cf22421148cf02b4cfce76ad27701f925c01c71c5405534ed54b0100c280dd861d89e967bed4829c568bb76ca500342803835f7983179cda15899033f797951031138a83669ab4ccb4630058088aa0845faf7b0761b405ae866c426711eb152889d175e7b20da03126b7419a766416a68aac0fbc355da07d6e6339bc0539ceb55711f633b8c7392627497821cb9d7174c4e655b5928bf722c84b8233a0993b6de02d7364443ea4c73a754b8190243df936184819e1b8ab6f0b0bfbac6c47e66ddf11757be55e0787adc112c63e644d1b904877764d856abe78b583600cbb2119cb916c689d4543f4d553cac33ad19b245b4948ef0ba3e7d1151179b9fb2941f3674e5f8771677737c435b2383119a3e75434114439506e1b9145ff16b1458879a1039962434151619b77915d033a3fab7385fe861e4a25b125a205c3f1b16972470b2791534b5fb8731b20c03684ccbeb97a1fa4417655bb485c347519710522c357d50c43fc2644098533fe549c825f5dc8ca82a0dd908891bb4f92eaab51cbe036cd6fb59a749269a0a3a9befa6dcdb79675aa52939704f41c731f32b0b758c52807393fe157ec088f1ba9f93c7b791356b66afcceb745a548c7f6b185e4f45ec1ff1a22acdd96e7a6d8 +ct_n = 954f5ccb184415b8f504f5107ac7cea3b97f2c09a2fff1ab075413c508057c44adf9a29acf7df85ac138d2bd129a00a839336528b778eb1865cbff3a4988ea04ee311fe3f4d17c6f5aa2718fc760c01d3be4596fc9a2bb456e322db7cf68bac12011ec1146b287ee7595bed6dc689f91d22747973e718c02727a8947cda37842dd62b573477230254d1539e7f6fed73adeaebec0af86ebc19febcc10f16de0e6e0aeef839fd4bff66bfd37e52c486d1e1a5e3e74ee75ebdcfbee3ddcd58b19330d15fe629b62663d482e752484e75cd62e16fbbaf52c9039a86f4013c1da7898a6d685f593fcf4ec738c6daa2cb2ba3d08405fb500f93681113430008cef55be62b4464a2e8c4ed6ad49aeb1fe7321964fd6085f28a4beb177b68669def0bfb2f6c666fe3aac2ffcf48068f3264f87ea8e0feb29e5baaac91e3c8cb7ed6447dfa5611b55040d33ad144f502b2d93ab857ac3a76ac609634677115252828c5feeffe26a889a3bc116082f1d511c95364743a10664304be0f4abd464dd64ef9115d814928eb5bce0892f627429a9c733c1d999fa46fa95b6fc4bf110d21dad1b3dd80a5d0f44c337515f661743b0852e343bed5b59d8c9c9a82e1565a5e2ecaf2fb3069bc03656e108dbabf49914a34241dc2076a1e1fd0d9a93408c4c90e48ddef8835fa5121d084610e4cabe0cacce748982cacacd4896dcec53fef4419109fdccd98c25438282be3a2a008577e5d871faa26b4452e353318577a7c749d2a96a1a45878d8eb98ed004cbeeefcc9c9c1044651f616ead2655f21d344a639afd6f925117c28458dd0c7a0c53050e4ee00ec48d3f63e62294ef3ac43c5873e82d4f557e15cc6bdfdb2c12f110ed235533203f5bdb2ade0d5bc19cac1a4c684f6fdc6b54f30186adccb9b8eb2ae1ad4e0632955ff386fcb23ebea29289e8cf328e12138cce93cb9a4b46d069d51c8cfc69428156f67832ec0df7781e8ac6bd15e5b6783b7b21fbd7eeafb791eb4203dcb432a40d0c229623fc7aa00f024e0fc61f1394bb49226e831473e216a3713e04a35ffa3fbafec5e8d8de3cfbdb175efe74bfaefe5154e6b9320d6a88bd45f83093b8654e2c9896f3754d2643cb3a6771d3a41d72186377c632f82c9477d7a75f38a93b030ec7f9203a4bdd971b91bd2f7866edff24b33b306449c86079685dfa9dfcf3ba397f71cc35593c9e529cd646d03c2f48a3dafa4f83ee51af9f9515287b238837b9ac3f1decf588f250cfd180afad34891b56c99fa8c45b38cd1f3d17a260bb8c148a3754fb22d99133da518f156f99d681264f2d5f7a84aba3f628d8bf001b78137d81b61eb95d14d34ccaa289f139718802849fe3ace3cfd2941606095aaa02dac951f4b35557f74734d792269e74896e19ca1115862529c60ad71fac312c038f72bfe6e42b9d9bc8dfaa4ed65deec76e7d6f402992a9a6cf5033bcf8493106cfdbefab830628ac576f53a92cbf40bbd49aa502d2712a28f698965d8519fab8e8621546b21b9f22d90a872ba757 +ss_n = ed85aeac87aaa6aa95b9e9da447dcb6fface710af3a20bbcc094bc40509f8109 +ct = db3d4f38a49cc5c1c7766573873f3926184923f570fcdba6d7086bea39601fadfebabb2f9ed0ebd86a6468be03d3b05713de50b5e5d58ffdb5500f2af7419682bc7857870d1e624c2b48a7e0d30a91f141f0764014fbed12a9f72c958eb53a7ed4a1682578b4348a05c183c790ff56d66b23bd601fb372c771f52045e13ca2d6dab80a165a2159b8f990b5bbf125883dec0a2af4a54c3f386de4df6ee96923e9bb2551753ddc6d1f00d7ee910835082c6260974d11fba49951db2e27b47362ec4ebf804327ad968201edb71bdc8c32887214fb2aaa842aabbe0a4e03fdc695b19610377b9bea9d371016674e977e9e45382d236365efedf566659f9936d9d14ca8595ddf121ae7acc6056dd6fe1b58dc0f0b23cf5366d2488c4d6361b09875242b3a39374159cf3654abd25f8b080bae117a5f77d15031ad8b350c6922ffd426ec9f9f80a1918fe722cb7a4b537210ef8a5538a52048badce3caf5c46454eeaf413819d57efba834d7017f9343b302679a0a28f532e93fe8c5b6aec3c42c160a3fad20fa2abadd29c2564db59fa25a11ca502d11421f7f080a616f9656942932e11bfdcc47b1d8effa81d724ffabf4613830631737eb7e52da78a6b026db1c4fb80bbf2d8f9393875330b2f9c1a124436028bf2624c1e64797abe2e526967dd99bc21b555a5833a31ace7969e3ecc64c1697dec0b074108f6b17efa2a517923b435d8446043fb1a96b2ef3b3d3952f08657997d1d9169ffd14316185ec30457e0faf7eba2b5a02a01993ec530bb9c44c091d2e9d9bc82951e577d76dc2757f2e04e822b6a29f840887a297202e7389a0999f9e69255de0a33aeb8cd0b21b7f3b5aa7bfd864cf8ff4ffe78fff166caf1b805464d5e4b60eb0277e3ba4f3f3390640f5f16e0b784cc8a67940977b2f0202d37a74472161589a7b9e7721cc532904a17aff8fa86ecdc46a410bd6f9309b2cc310d7941a02a5720cd64241b5c13c78a86010805ac74c3b81d83348c63c410451bd2052ce764da83cf80b2654cb1d033f259da36039e4df1a5c4ce3f8613e28cfc2b25eae2a21b425b44d0c998977b3adf5156bfca1e357ec3f6b5805b2cdc4d46a4c83154aef0f50d493bab0bbca130e92ca21af8bdf817f7616b55c4c24c066ebf896f39a7bf50a241561e578bdd931cb07eadd193986c455f8798ab97b8d732d37c796e09c1c7abb978bf666ced961373198607ac355fcf6903b4f3047a1d97c344a2d8b73db310769ccfb4ae3da6c4e82deb83bf4060722d9e5a9afbd3e03b4517e3b7d563f31821d5d8ef7f06f0d92a9f401ea9befd52ca8db331360e603c14a340b806155de690cd2d92ee6a8ee53bceed7eeb308d375518c851c109a03ee61960d6cd7cd1fdee5cc2a401039a15ee4f97a73400801a090fbf09be42119662d06c3ff8217fcfc2c70cde6e1c2f9a396a2e08a3c22ae3ce90a5c97c9f69ebc1546898a047c9dcad128003a90b29b62f7b093cc90c9cd38104c1a3ce62bea6a3646ef7e3b9fb7c4c44e78ff650c +ss = e3e4f4e9d4f5c9ae03836bb9266c50b033285ace9bc56f73817ce19679d1429a +count = 5 +z = 85da83b47129711a63c2c2f6a5bcb701237b2b0b66814eec9fcc1c560992a596 +d = 1fd893bd47ed681c7c11c9d00be9eafd9db79ae7e934b03aa6da99e019a28a53 +msg = ef938dbddec94c01a845c7f1192c402f33c10f1f0176128af219d6a0243900e6 +seed = 2605426643cab04b2801416b3239cd046dfe7ba59874a3a05c5b32a4505f21d8b7217b5ecc8646fc6a845211ae4bc708 +pk = 0f6512622b9e8923c5ffbcaac1401fb3f50d8b0c561ac1bb175634da089374308ceb28707444b126e6438c4270cd735aed70cd0bdc6b975c480f6c5c5436c263bb604b33b750827792a95ba3a79ca3d9b8174c1be945ab2bc86580a6778cd11471abaef93607b56c887cb12baa5b3c9a264386c3712eb80f596274192465f18b4862f9a1c666ba71939edfd67bbf94b35d663d60501308a03b11e47c50a979bb81a2d1310354911ad830691ab5126352418736c76dc7acb304277806466b4116e1f13e319c4b82e4abd6c23161458bf0a9c4d3cc3c22f513e6b759c4c73e046055c666518d35ba2bfac2553b45d2e75bd0916dcd146803f2b9d904c33bd4a2f10aa0ae6230af55bd985955bc742bacf81387153d0e9c39759707aa4a5ffe0c6655931ed5cb25be896f2dd74e6f4055c4a4714d084420800fc0b613ad51aca78b210f062102d88be45cc56bec037916a375525c3ae4af54681c7a90942c8249e8a05f4ca0673cd92c4767b2f26a68c53a0aede9c488547fd9b90355f641eb4b359cba25f9654f9a67bcf5b6cfdab4a637636aec1abacdc7c7fe0c1d187172e1f2a1e7b5193b6831ed51becab244d62a72a5ab022a331992941aea849cc661018f4a8ce01a4725f4becdf225983a2404a24cd6a44b0e7156e6a96702d2736ed790908516fb555d2e31b966e2660cb1c766831c583c153f81a6758b0be48204377b343e821f2c032be18314ad24c110db1656cb8452cc85c4e44879dc61bb083bfcd44a5a304a66c992fb7bbccd0a83a10943b0a4b8d5cc17c30433ea842f942062aca3690806b43d6b80590b6088ea81cdd36e9c40839d90af4debc50ca06b716bbe4a732305dc5510a55f8e385509eb15327707755231c4733a8eb9ce80d395a7613e8627a206a9a9cf57b388a780ceebc55eb549d4338695355f6b1c980bd71f2d40cf710c20b468412ec65c3f48799db74453108c26c609a6e0643d104b65baa6c0e416e0102d8d261c12e40c3a02a08eec44c90b99028774c66663a8e5470c715514b4bb4ba2a5c71b424a9929e893248b66b6fcf97646691180254daf9490bce53e88057554b15c7d7b8358fa2879112e761a030ff02efbdca46e5808a9b75d0a69c4afb609ba94698181710606885c176232c92aaae283fce1520414552a90acad9421e4d87ea4171e28b8260a3061dcc50effd48b60db28ee501d33732a8263540f33b9803549d1d936b258863bca134b156c6d4285b763bd52d807fd7425afc5334e59618008079034138ef057246b3a10bba27117850124be41353791b67f3b5a5dae0c9446925a8d4936723982ab43399298026ec9129404031478a148c7290fb100a999be95582326d35e06294c2afc531083942bc0b91759b9b53b920f164a53c22d279747107b62a15703798ca4702b5b4ee323424c4dc8fb1e2a75b21791a8f5c878bda55657c8aca47a14c082384a62cf88e483f071063ae33931d8627eba8a08a16b08b72de6f7ab453917cd9145fa4b4fa34ab1a601c4b09136ab91734dea5cd21c657393857b84ab6ce5693d0a0d8da853224b301aaca554464450c08187faa12f9925a0e222d596ab0767a6352b961cba921f0a8c03e4ab0118d65330db1fc759d3204c7e89a3d5ba296a717bdff283b2f5b17334a36c6e +sk = 89f75fbd74871425bf4bf5478ba2bffdf69a4b41b4d905054971372b82adfbe298440a9bdae6b0172200111a596353b4d0873138a918b58544d82c9ae4285dd69764973ba7e3096187a6a17aec6774f22ea8112b8150cc46e89fa0d1cbe2731987b38cf7210de67090130c8b2ffa7458c52d726865aa22615083a88c72266272ae9690b1d763c4778790b11b4d1ff071f2516331e3c455d4b0624b1190886608e96cbb60b623b159731442dea97483511d80c29aa1d4354993032104aea91aa2c9eb314a5067429279910933c05486c822aa3fcac239b97da2668fa81632fe3ab99985994afb760b756ae7ec9aa4052463311b58d460256b34fe240ff6fa7e1302772a7c2483260a3e3130ab926bc86497f7c180b1da90b8f072caa00b0843761d365b28ac9b01ab51d9f8ba284ba6c6103615171ea9115ac1e22696a41608e36c93d6a519d73f7532295b892e2fb340f29bae408922b090b51f8b404a0c30c37078304953f830bcc086862c02c88c9c2c3466cf536a4d5bd679b7db7604f1c35d64160a718becab31a3752b17db694ad0cbbf82c4ce115a9500ae804c50a439516e7501d1b935d5b727bb5882d0705101762a98261da4fb4cd2c3915b21ced88810d3d1c96186a93dc377f2d0a270f10a121b9a6afbb2c964918f70581a655cf94a045d252f8e313755b88c5c07ada1e87d4f0ab48424b94f86539d25a8cf910979e712a04cae701994c7c2a6ebe59f4feab482d40e8628ce5970cbeab626d0ea3b2e06348065ab21591d9cc674c4136dd6904742499bb92c5727aaa850f954f1f12dca9c657ca599f8a44948a0176b73c512898af63c6bf049a5961c7dbf77b0b8533de845b684ccaea3c5a0ee347bfab59972c3c7f7c91159fb207c940f4e187c44934efffb3120bb0b04307f463420e9097717c0512642005a8438114386bc496d9f785cfdfb020727741a1bad939427bd1c633744a5daac4f7ad79d7422adca9c25c26cb3b57c98e802566ad7a80b27b85686a0b3f282eedb69dab8375a95b4ec4282e1321cda572e524c3293744560f42009c35c17113cf50930e841a28d477c1bda5158eb9beee12b3e84925b1906e0211e4da0829484c11fca62ec469cb4c888ea10c588b9330b589539f05cb706964682beeebc3a6cf95326261f7597cd0b36778d36129a6b1c8cb4aee0b17523429fa50545e92c4a90413981b1a369b858d31b89887492072b2b7f71bfb9783f5c3b410d9227c6632245c69bc9f43db1e5194f12165160590a32001ce3af98f19dc2e9a8a9d29295a0b38a8881d002c8d07aa375776f5cb465f4d7289f11cd1e091fa9502a1284b7f9935b5e8547c1261446a579df204f74818449a77a9c62836291047bb3b19585649c9a3ed6d984aa473318208620735ce2f9016038b789a160a9e02805e139878bb1d42973c3c57a9de1c1ebd0cae6171475ab86c97333d481212ffa3a96a7c525fb7c087bbc2cd9cc96ebbcf8e72b4396bf1202c73f44b3440c2a67e38221332f178013f0a33fc673245a84238f990fecf84b7a5a71a68793ad29cd022c6d5b74422593c3d707978da200b7d35b446898879ac20e8c43f2539696e4217a947ab898235763b90f6512622b9e8923c5ffbcaac1401fb3f50d8b0c561ac1bb175634da089374308ceb28707444b126e6438c4270cd735aed70cd0bdc6b975c480f6c5c5436c263bb604b33b750827792a95ba3a79ca3d9b8174c1be945ab2bc86580a6778cd11471abaef93607b56c887cb12baa5b3c9a264386c3712eb80f596274192465f18b4862f9a1c666ba71939edfd67bbf94b35d663d60501308a03b11e47c50a979bb81a2d1310354911ad830691ab5126352418736c76dc7acb304277806466b4116e1f13e319c4b82e4abd6c23161458bf0a9c4d3cc3c22f513e6b759c4c73e046055c666518d35ba2bfac2553b45d2e75bd0916dcd146803f2b9d904c33bd4a2f10aa0ae6230af55bd985955bc742bacf81387153d0e9c39759707aa4a5ffe0c6655931ed5cb25be896f2dd74e6f4055c4a4714d084420800fc0b613ad51aca78b210f062102d88be45cc56bec037916a375525c3ae4af54681c7a90942c8249e8a05f4ca0673cd92c4767b2f26a68c53a0aede9c488547fd9b90355f641eb4b359cba25f9654f9a67bcf5b6cfdab4a637636aec1abacdc7c7fe0c1d187172e1f2a1e7b5193b6831ed51becab244d62a72a5ab022a331992941aea849cc661018f4a8ce01a4725f4becdf225983a2404a24cd6a44b0e7156e6a96702d2736ed790908516fb555d2e31b966e2660cb1c766831c583c153f81a6758b0be48204377b343e821f2c032be18314ad24c110db1656cb8452cc85c4e44879dc61bb083bfcd44a5a304a66c992fb7bbccd0a83a10943b0a4b8d5cc17c30433ea842f942062aca3690806b43d6b80590b6088ea81cdd36e9c40839d90af4debc50ca06b716bbe4a732305dc5510a55f8e385509eb15327707755231c4733a8eb9ce80d395a7613e8627a206a9a9cf57b388a780ceebc55eb549d4338695355f6b1c980bd71f2d40cf710c20b468412ec65c3f48799db74453108c26c609a6e0643d104b65baa6c0e416e0102d8d261c12e40c3a02a08eec44c90b99028774c66663a8e5470c715514b4bb4ba2a5c71b424a9929e893248b66b6fcf97646691180254daf9490bce53e88057554b15c7d7b8358fa2879112e761a030ff02efbdca46e5808a9b75d0a69c4afb609ba94698181710606885c176232c92aaae283fce1520414552a90acad9421e4d87ea4171e28b8260a3061dcc50effd48b60db28ee501d33732a8263540f33b9803549d1d936b258863bca134b156c6d4285b763bd52d807fd7425afc5334e59618008079034138ef057246b3a10bba27117850124be41353791b67f3b5a5dae0c9446925a8d4936723982ab43399298026ec9129404031478a148c7290fb100a999be95582326d35e06294c2afc531083942bc0b91759b9b53b920f164a53c22d279747107b62a15703798ca4702b5b4ee323424c4dc8fb1e2a75b21791a8f5c878bda55657c8aca47a14c082384a62cf88e483f071063ae33931d8627eba8a08a16b08b72de6f7ab453917cd9145fa4b4fa34ab1a601c4b09136ab91734dea5cd21c657393857b84ab6ce5693d0a0d8da853224b301aaca554464450c08187faa12f9925a0e222d596ab0767a6352b961cba921f0a8c03e4ab0118d65330db1fc759d3204c7e89a3d5ba296a717bdff283b2f5b17334a36c6e01920365ba04bfb8fdc5b2d391ac8cce6ed71f8ca68f3867f959fec37e7b16a985da83b47129711a63c2c2f6a5bcb701237b2b0b66814eec9fcc1c560992a596 +ct_n = a5bc0cc690767b203da8b72ff28459b5970fde7d2b85ef05852c086e8cf1c52fb4e5c8a75b8766446900419ba87bbeb06515ac7234eac06b1ac6070aee288c6a549c634397b821233bc340d133e79f22be2e1a0220bc2c29f8d2d830cc591362dc48eed220cde66b53db04cf7ecbec6ba68a1099c01ff0a20e1a0e380782afc83ff626f907758d06ea5695272c1bfc357b0c9ed4f899066eb2e6992e780fb9b50b6810285a197a0441805618870317c55323c9e72fb01977348ba70c9096072e9b7f26dfd099bcb0dc6e5feb6925fae31673d1f517da79db0ff4066fccacd0f9411e3e83af3ecda4313147e1ba774c9d3f9b5c702c20596861f85183e5a0689c2c63c61a45116a2bbb4ea0c08598eb30526a83f4875084b9dedd864f6ef179768be340478c0d1374e2ac46b5626e971a2e299f3f2a6252eaab43741e259ef18217bb0319161b9d90700c3549ca4f803d4c46cb25463c6e9907a3c918dcb74c2b94f4cd681b9ca7e74a474f7f88d3cd0964920d470532c0c151d91128581a8af55bf7d8289be3a2b8e08f319e7dcd658a64296f7ba919acebfe275aa2455648d70baf7ce15bb01977b70efe0a1a82f7922b06c64ca15d45c11d3223d289da13bdde901396feb31e059f94be05786ca9b4c40454cdfca4cb85c56ecf529c67c6414436632c6776d8d87e28866584422b19270a9d2a0c548482cfacd05351af60ac95888dc5de848989505f3f781aa388607742a29858aa85b089431c1e9f88a9c03320cfab1a895c75caaddbe110e372fd2788eae4b9d7c78309b438105f809a9f1a8a0cd0d1b944ad037a5266f157eb4f56222131bcd7c0d4d93714d36b017d946075f44c19168897a25396679c73af50f5ad697f1481e9e456f9e98edb0929919e8b1c5765c5309b55859a48bb2aa78ec96e0e7e22f549694560ebb359309a8032e84af4c1d6f918fc7d575630d7125f73979b3a2113af86b125d3ca574d4be0b6193ab98bc2628063de2d14ddf2edfe412452b4d365ff831569aba8e3ea43e858b75e150347299c2dbdae6930110bf1f217588391b7bfc8031cfee0db083a45633ca609a3e3a31f6e7a113544f790869701efe71c793210c9eb4e351f79df841c55500b54a8a86ffe183c1be8ded8f878180ac311adffcccfd21da927814596ff71c256cbbb5e85c78f439a790650c9879b0248007f79ab42f9212a37a350bfb9cd207c971752927d00fafe88eb7a632d6a73d5a499a6b8404d59bb617410c326a8c9014f0eff96555a3cb190193e4712ff125993220164ad8b21fd619ba0da210653a502174818150b02b66ac0ad5ea8568fb907898775a256c8bc9b2c9e7d8b35d67e26692fd8fb40fa84740848c9ff4a7ce248da0994888e3a5ef404997f4935ef94db37a33064c28a6eece82e9558f35f883cd2143002f52f25d004541b7db59039afc971462affb66a1cf4bb9f5727060742320f2cee871f5a1578e411a9825b010ef5b1a648f2ca5c9d19aa480afe661acc8c39073b5894882a0fc857 +ss_n = 0ebddaca67e41b3426f65a297d41134c499f6fd9f6c2e1df45447c1c717212fd +ct = 535c387dd4843b57bf015986d2bc366c08fa21a6a3a615a35d82fe8fea39968c4f6807e2ebee361208ef9ae25d6e3109a0360cc7802604343337268ff3d91e0f397a0a5ba525d9c93fe897537a2eee5d261b6caa466e4fe85071b9de1a1a8b3e9c2ff9d5acac679d101592fd2dfed7e667ad5e0c7fefc249fce1431e674d1128e955040dfb6e47d2435b4ef99f1ed38ff688743ac8655bdbe4656aa4e6ccf626020558a99be753c8974cedbc9ccf494df5885b2628fae4bde6d26346c2b37befa5f1b1f584ebda4b38d4248d5a3c5bf1abfd79bf9601f27f9bcecb40de27b50a8b3fc8f6f9d4375fd53741da0385998fbc755550dcdbb92b746eaa7197b903043545af0792822d1dc3f12e6a3edae3c6b9ac81cb24004dbc6c9a7ca934927482e5d13e88d5ddae92cbd59fb9b1285b3737cd9194a2f33572eafe02b02be27b99f283861fc76cdb1239ac0335fc0dbc781a493ab4565bbe01685a58b13cff22c9954693d118a82948982927b880c790a6420cdc07a5398268eefae2be89b2cf2f13da535e56d4a046f88c6c34683770abedee2d19f0c24790f83e8a60b0545a75b2bf0ed1308968623519a4c2b12d7b5398facf4e4963934b96e064144b05cfab5a2aab4af2cf0d226ddbcbe1c2c46a7300b2aa0c69a6d0a0521e1cf3ea836b30f3fa0014141acafedca5a2332fd083ef19f196c19c273eeae4eaab0e67dc0a72910c1fb1be49f9a71b86a42eadf61ecf08b013a89d1fba22f74db93224eca79d8576b6c97525a3523c24c99b5206722df4658f2eb8801d9bfdd89d3d87548073620a8920065cba6d5b0384ccb70d74a6ea328b0fca71bd4737cd823188aaaa9d0d4534629420214881d1c93ff778032c5fa2a8fdf3d5dce1c56f8009182ff95ff201abdc410afcb031290d3b5710bc45c9f9426a9c41c1a322ff723ff6794179186196648ad7939730189a4c60fa579709e838fe82dfca775b7cc678bcc14dad3b15c112a1cf9f432de281a32dce0c02370f524b74dd21efec5e8a6af2245e5a3385e8c2c98400ffc1310ac5a7946d929edc9ff6accb89997ea6ac8b1823f008c93526e9053663e5e049b2445ea2009b9c77bc27d7f99069f2bd9c226118bf510fb20cc9c5e9f08d68d9b3c2e95e594fdb50954aa371ce263f74bbabff660218162056c1c60ee679d574508432d793973c9b4b3432df9a9e8ed784b3274ed00a2e4145609afbc7dbf6a98cb706ee3a6803a04f19207556e70b55bd12a4d4f3dee0503369a449ee0314867940ecb4ecad36c8f9799adc88f9554e4359ab1d270b58b590411af89b277ae885773a8e9f3be1c239324c68ee6bc45728209fd2ba20a01fa8d214f502c34fa4c1449c13b16627c1f8e26be13132919d657b8558a584e6575fa829d2096329e60549ee31ec47cd5fb63250f533c7ec30607c5dc61da2983beaaac9cf2408ed2b31b1a91169eb3e59ca3366c24ea09676ab0a48dd3f403fe7b21802ab81408dfb20fe364f13abcb986d09fb45ce5f5fc472ace2c93c66 +ss = 73dce41a9bfcc57ebeba4a9f161800f3abf1c38600f3efa9a32eb8108819676f +count = 6 +z = f7ecfc9143ee45e44f5e98fd9ca1455340ec5db4fb098534365ebbfbcc57d34d +d = 7838c35785aff8b54be30841ed41a87f420aee847452a4561cdaccff5b38dfc0 +msg = 9bf84a7839f40faa71b35fcb695c5f41a9443bd94041a042a72c701f0d1d5df9 +seed = d3880d1b7802b4a3277687863c5a248befc95d3e4748403f3bb61f83abcddeae42ae6c8624812fd38f463122d99d59a9 +pk = 8106bcb11836f9c1289114450f34cc784c1a1f6ba3e18acb2ff3a8177571a3251e55019349e34c90651386c61e68903b2b1137b3f986600b858785b9ccec776713c1ab50642f8b9431c5734acc6f266c1867b0c43880af87e20b1f3a9c10c1633f08c7f95980cd71332ae492456130b2366713795270a5aa8e756c6ac30fe3151f2845cd9cd87c260437fd84b7258acbf2b6cb357743a399477c678b9b219efe06cd4890b31fd155d89533c6d074b85bb70beb2d61831c98b8206fd0ca7d018491a894f484036cf98e8fb6a7a7346a262a8fc4c89d7f855bdc32c46c62090c9b802e835ebf7a154b748c058c169ec832d02899a852bed26c79314bacb10658f7f7b3d2585887d18edab522f5896d509820edc78ca135341c812608f8201ad881a1c810f16502273180ea642571f0bb6b596c40b31439d46036ebb1b0533dc4d42df0f7c5bde84b89c118b666a619ccc0ccdb07b5ba944e4619e2fc28df388c805b8b0aa74b59000654a68d7cdacb892ab87c076c3a2cbf31f7cd87404860d3998e1b3a0b78be354607582413486885cc16cb71796337505226aa76aa292360374f709013b1021e708641a1fa7951eb6845e3c16dc76c56d291a93a7823ac933a5c0fedab709d846d57583a3aa9a8bbf8a13f010ba5f55dc91b44430c4b175c4c491414982b2b7463b174f71b39d2625948a20342074056331c91a5e824922b610081786c84914c67236f9724c5489750e7b7b723685f8aa64f2dc99ddab8c837a58ae1d43de09760c72b84f04871eff75d3bd67333e79299fc190e2c379391822ef7c4d985a0daab10b2d61ee896832712a4e40b9683e3161719107b456f290b2f95e98d2c2338390876bf9ca3d7498601a749e247511469cc723461caeb1386fb00e00600ab2aa4746a0f358576dafccf87e668a95553c0f9350c44c9d2bc68ef221a4f929692a0214383156f7c2cf360423873655185038a624b19579ffcdc7d1c1b41997b9c984b3235e73461838e3a830bfe857f9d93050095368eb11a47510d7fc83214f7b51e0292f289414b3c7be566724bf619d320954563316ec5920d887c7677851cda0364423c0f94a2ba36abf101034708b25d86546fd35a35f13e79262e81983e5341c7e35b9b70b80c0e75aa90eb8b758b4417a84ed3b3629d678a9267546b188d8c2c03b9e730624cbb5fdcacb7e715a32146308a5b81e8b8966826f9c6070745838510b68c696fdaa115788663e45a670dab71a091be6c5ac1ba2728646b0e4efa5700cc66c23c009ffa5ec384ab02b9cbd35a08b2a83d7df8418565b58e43a1fee96f9f81c904178c54c546651a10672168d66a61a392864fc0490b22b4cbd796325bcc05fca9b0c20ab6914b57523e877840d8f997ce5c59181036b8bc48d1833230c538dbc033c4a081aa7074040989862215ab67c30023b03c0b4f073226cf909037423020809f146b47cce2ba2a387659d00935ebb0c21113abe11ccba69bd7620f85f51bc42923791764aeca927be94811b2095686b22bbb9a56d2007d7ca92da8a7f05ba113c049ce6247a36a8c1e01a0615c55ab4319d58408741a156cb145fb789df91c1dc7dc98f68c2aed33a0afca91f6619e5a6fb53248b6a77bd7b1696f31dda2a88f63f64975f5d95fe8bd7b528403ba3e +sk = af06a36cdca86c8279fcb825e17b188c49bf83a729a955737c96a17dca691918cbc6a93bb4a85ca35119f614ae130a9fd53a4725a81b1370a236804d42fb1b7e2320c06974b645a0b00ba6eb39adfba5a97bb15c32bc24fab35b6afc54182cc9c1883ea6c6a25ae4b2b52ca8545c08c8fc4b49a5464aa203bc4436aac45b32170249763a6455b851c0cfa5a22053d0427b1b6a7fe11d246b8c98002e5b9bca8d78474e98198ef9cc905ba1d573a9bf289e345c3f76cab2591c2982946582d0269772939cf24d0b9c00631a8ef991cff487bdf1988f86877d2c7361aa6c85bc7b889e7546eff669cbccbdacfa9eeb1146b9c74d6468b15c0103b1ec4acc066c8381b800b9159e2aa5fc75313313c550c6257b12b1e7c265239a9c3900a87d51a742b2aafd764af28729a7468ad2b630ff20ae0b789f55784030bb19833919e2d0ade27a7f0e7a4e9bd30c95a27a40b02ba1155a4704c0772023cc521e36ac7669f7ae7d6586298bb22f2c6ea0628df987469a26a90c92c1d4629a8736b451257653775561aab2e1a19b3548676b58677691a23681acec155c6cacb475ec8f061606b80a1a7f1bb699149cf9e12b89e5070fb8b44ce2a5601c1970c7802d33b8949b3cbee549720c95c959752f3064a4d8336bec210cd3abf2284803e05a6ec2ad2c8c8869a99765ab47a062b7fdb2ad3a33b7b87997564c5823e48c3074376f70b768a74b7c53662c37cb0c2515013bbe39a1cf947b60b448aed9c13babe26231e189256bc746d252a1a7c20ae26b26752f3e25355fe907c008176673cbd5689a9c42821202b7ea27c234a31515cc43d5a806d7dac383374609fb2754d04525fa9f31a7302439162bc03ec3b31fcbd249fb9a7a68f7234b4614ec56840ba847a6c5b3f7b312d614c2e4d27734b11c4d1414eed455259a2ff5342f7351c997b6c970e7a8bdeb3d87d98e2227460b884320c926844741f54c7287e23652c47343b0044370c202eba151f2440859c672b6b2662cbb8b11314a7b30efe23e713431b7b9096ff67b2d0156ffd58580c065d876751a93796b860a0b4c396796c94e4c0b86c71b1f961b53bc512eb42c2cc8319568c84f066f5a529b9d867c50f1592216bf296103e8da8c399a4971f89edaea0fe80460157c0951e0a725f1242fd7cc0f6c10185a6042890db2f549f292b407a7ad629c8c6b80aacfa125e3905888b09a5c838bf9a73c1f39337ea5a603fa3dd2052d7174b8a6c012457c96e9b37ae912920e810dafe173922943118762bc67af1ed73ed03997bd5a4c0ae561ed996740035f322b2a98138f7a650e3564cc9393c17ab001ed3789e771946632b83c447fa5bc47502998594816dda9227222b38879549fd96b8ccc16e3f6be538c5bc4547fa48445e0fa6c18f55e35e12b7c0401d0a78623513cdc1682b3c3af5b5959a1911178b455d533af87a1b7d5204cfb6bc8ba980f84cc3ea4b20f001009fbc606918ac446eca6da8bbbd89368f04897d63aba3a5a7a5c871250a35aa2a31cb0121e5f205e0b656a1cf15a9963c59233cd04ba04aedc6c7469714c69a753b4bccf4475870b4fc48854bf92a8f3f456944a823aeb222c8c7b3f3c66c478590427848106bcb11836f9c1289114450f34cc784c1a1f6ba3e18acb2ff3a8177571a3251e55019349e34c90651386c61e68903b2b1137b3f986600b858785b9ccec776713c1ab50642f8b9431c5734acc6f266c1867b0c43880af87e20b1f3a9c10c1633f08c7f95980cd71332ae492456130b2366713795270a5aa8e756c6ac30fe3151f2845cd9cd87c260437fd84b7258acbf2b6cb357743a399477c678b9b219efe06cd4890b31fd155d89533c6d074b85bb70beb2d61831c98b8206fd0ca7d018491a894f484036cf98e8fb6a7a7346a262a8fc4c89d7f855bdc32c46c62090c9b802e835ebf7a154b748c058c169ec832d02899a852bed26c79314bacb10658f7f7b3d2585887d18edab522f5896d509820edc78ca135341c812608f8201ad881a1c810f16502273180ea642571f0bb6b596c40b31439d46036ebb1b0533dc4d42df0f7c5bde84b89c118b666a619ccc0ccdb07b5ba944e4619e2fc28df388c805b8b0aa74b59000654a68d7cdacb892ab87c076c3a2cbf31f7cd87404860d3998e1b3a0b78be354607582413486885cc16cb71796337505226aa76aa292360374f709013b1021e708641a1fa7951eb6845e3c16dc76c56d291a93a7823ac933a5c0fedab709d846d57583a3aa9a8bbf8a13f010ba5f55dc91b44430c4b175c4c491414982b2b7463b174f71b39d2625948a20342074056331c91a5e824922b610081786c84914c67236f9724c5489750e7b7b723685f8aa64f2dc99ddab8c837a58ae1d43de09760c72b84f04871eff75d3bd67333e79299fc190e2c379391822ef7c4d985a0daab10b2d61ee896832712a4e40b9683e3161719107b456f290b2f95e98d2c2338390876bf9ca3d7498601a749e247511469cc723461caeb1386fb00e00600ab2aa4746a0f358576dafccf87e668a95553c0f9350c44c9d2bc68ef221a4f929692a0214383156f7c2cf360423873655185038a624b19579ffcdc7d1c1b41997b9c984b3235e73461838e3a830bfe857f9d93050095368eb11a47510d7fc83214f7b51e0292f289414b3c7be566724bf619d320954563316ec5920d887c7677851cda0364423c0f94a2ba36abf101034708b25d86546fd35a35f13e79262e81983e5341c7e35b9b70b80c0e75aa90eb8b758b4417a84ed3b3629d678a9267546b188d8c2c03b9e730624cbb5fdcacb7e715a32146308a5b81e8b8966826f9c6070745838510b68c696fdaa115788663e45a670dab71a091be6c5ac1ba2728646b0e4efa5700cc66c23c009ffa5ec384ab02b9cbd35a08b2a83d7df8418565b58e43a1fee96f9f81c904178c54c546651a10672168d66a61a392864fc0490b22b4cbd796325bcc05fca9b0c20ab6914b57523e877840d8f997ce5c59181036b8bc48d1833230c538dbc033c4a081aa7074040989862215ab67c30023b03c0b4f073226cf909037423020809f146b47cce2ba2a387659d00935ebb0c21113abe11ccba69bd7620f85f51bc42923791764aeca927be94811b2095686b22bbb9a56d2007d7ca92da8a7f05ba113c049ce6247a36a8c1e01a0615c55ab4319d58408741a156cb145fb789df91c1dc7dc98f68c2aed33a0afca91f6619e5a6fb53248b6a77bd7b1696f31dda2a88f63f64975f5d95fe8bd7b528403ba3edb75d62a0d577a3bc6ea721052c2f062c644474957e938b1a15de190c357a74cf7ecfc9143ee45e44f5e98fd9ca1455340ec5db4fb098534365ebbfbcc57d34d +ct_n = 9767d90bfc648f8e99ab16d4b307eeff2bc9b577a235ecd5efd5e87dc8e297cf222363879e2dd47b01a6df3e5a004321c4f1b571376c2e40ee8232e5d6b9f8c59d647387549b908715887344bc43276346ae681b0123b9bbf1a6ea08b776866e22d5d81b43090f2a38dee3615db654edb0bc2478c2d13b566869f17ea78e57b803effd14d78a16decb42118d14e51b63060b8c14d3761c821b71b5fa724e89a8e4629a454521c00ec3af1fa0b709062475f0ee942113d654a3248a82904047e02a16264cd7dfccd1d10f1c3d32634f38f58506975b54cb57253d94dac612dce59a1f5ab508e6545e0a1d7b75e14e0dc92d52e3b4c2be5759d73097f5226888ca3b05264eb4bf942d6a93f5aa8a8ed3f1a22cfaa701c19779a9975e29158957b8395f126e74306770f48dfc7104f5f410751105a89450dd638bc85ccf30e05bdfe276f5a4737fc5de75e7cfe09575f47a00e57c596036f93c5907e3f262311382eb8a7490f0502172b740c8df226d637e0addc3671fd4804b150127c0fe27eafa23d609442c73bcd28eb7428eb98901f63505a58cfbe4c4c42190e83801acc741024b189a9811f244d4ba2eef3ad661066e00448d97ba88bb9d0113abbc327d1fe3353045ec54ef285e9748c67375ad6a6fd3eb85f33d5cfa05c1edc1f9bedf6c590940a0d7c602c78e31124928bf02478de67f9dcfd350eec85974abbcf420fbada73cb1026310a4309b774b33e4765166d6046ed27da971e8c7d98c02e2c7a015a25c8d695d01730980be2c7b34eecc988211f7e51cde8230f0f713ff99106c510bf9f9cb8977ceb046834046218919b4861c9c31cd667c98fc9442f4b798e935c7c59f40a5b0e47d555e67910eac45d639e77b95c545f9825e54db18401f84dad11a7c29390a15b34a18e2fe78b914c44cbd8822a57e344734fc127f4e6a205df872631bd2c2fe40f4a91413a18100aed952eb282fccaeb33b704a082c80c4310c86f1b45bd9500f91b7229a2718d81e420cddb5401816a60fd185531d453ae0db1c175b063cde3a8c7f89d9378c932417fa280d3a48c9cbd61fdfc330a905ed3380926a1304a2a5753345c0387af9524dbd56c0d4ff1ee4af85e9c28c75b1d2da181ccbdf761d5426d8bd9faa3d6af0ffa502569971557cbbc833aa7c066e80ce83b55a3ea7a425f4e0fe71060e1bc19433a588ec6b2e0444272c899a5ba9903fe01f7de7b62476a50599fb62350b8169f7eb55d041be6cc979b273f25912157e4e39230d9e59e40fb81e4a5eaeb50cec3b29cc09d7c7fb663ac03d9545e1584adc04ada61bd86cdd03bdce5879cf6f96d80a4f5bdcc32a85593a44a87f2b6737f07361abcf205e28c2e7da31e2ace99d9332c0291dfb8c6125ad1062248b8d1fe31e33db661140dd39281e18041ae1a09aee24a6deb16c8829ebc5cc92aee1c69566f0078e51d0b2f0f70cc7474aac1b954cb3e86450eb783c8190d2bfb3608525650b489f4ea487ac2d6c9dd46c8080052cccb87cf55bb075d89eb1d907 +ss_n = 4a8093c2d63475387bb3edfa70363992dd477734cefea291dd79a5c7819d12d0 +ct = bd0caa3ec8c7bb8b8f1a7eca9bb2355b23a882c06927c71093b154c43172757be7caf961af644476d1c6bed1a32ac02e128ae468de64ebd121a17cb38445cb403dfce776cfd99db478bcbabdd783736bdfee156e823542bbd2cbb36ad105475f3097cdb92c0a9f614285adffd6f3645a58f60bf60be693dcddd40ddda271d4ea93939f73be4d45aa0940156ba21d05099834cef667aa26081b2e84ebcede89bdbbce8f8177169670eccab0387e2fd2351280981948ce934bb8078c75024cde840d60909f2d30c62786e65ff0f79fa203525f1ea1a007e3c0e2e8410e75f45eb319e9ffa35d94f23c0884aa81ec6432791426fa07aca607b9ca3f452067df371676c57ae8eaf3fa7e56402c3b467cfd2409707e39276d876f77f1ebf3e6a87fa5413b61a679a79a5bf3435e8164d67f422539fd8a0c9a522e2de4cf2bcb9079b9b99a0965fb282967ce37616b380d7a8f46df55df4a95fecd88911192cc4c2dfaabeae9a59159859f9ab9fe6b511bace66862fb744ea450ddda3dc4a34abef2fdaaad00e238685011a1d936c37e56dcaa850bafd6039d00be64610d825d2a1d7656f5d4568fc864c7aaa258d0a99d52bbc6cc798431e5fb0e16a60f7f4bf4f30946dbe0f9c9fa3f50eb7b08254c9272c49793d01acecfae108ecb9ba7d908dfd4aad239c049f887f81b34aebc1dc941b10d4d23b64682ec3460f475dce7cba30e5b223ec675b9f2d91673765c9f773566906680f4b6eac2cf3aff389b54c820595458fd2f491ceb9683b68b6ce8544620cf3a74c2ca998452d79202cc01dc0bf4d9086999aa6b87772806d80fa1010b151ba10f69537b0216e5cd4bc4fef6316e6393df0bdf32062020445bc02269651f65979c83881ef820836980f6a79627291c248a3a41054f5f0882fffa8298dd14fa228e49463e56c562341cd3248602dd37b7a651a2fb237e18e82fde5d1dd135af17ac50da52a64fdc06662f1b38a18319def828af94dd1c0fdd945f6b4d7e28a536f6d13b058d7c9681b2bb42e4d94da9518e0c538300dae7bd4b50d5a612e86e20d984ffe2fd0e1a90899861704f69654184f4a3b31730cf37f1e16319b300bf4d391efa2fbd79223a86f6688e6cdde76230f31de85150959cbfcc9b8d24c86f6af7d327e87f6a4990048d0d8ca7c3a4eff17e6730dfa89bc9af86d53bbf3888177c9bb8d039e6dd4f8e3f1be7e3bc82aa1d0473cc35c1678186cee3fd3d94e76830d0d9608f9d2723373639296a4c3f46708611a0d78f39f290f431bcb6d92f376bdb4f9625ed4d72275ec721fb9b6d749dc6db09175bfa04dedac08a2e9b99da094a0374f53aea8c024a23829bf1fcdf8b4db14f31bbce01dab1056b36cabd11d78ad960287508d7f9aea11975f375b55c7867e2f02c71c604fbb3df7e849676a2e170742acc7731492d773dc01110c95436519895cd48fca95a1a6a6e75a8ef263c3b3ee32ec06500d007ee3b76506f435806b0feeeebc3e123d32b170e476c269f8a47aa62dd1301456142cf70 +ss = b4e0207e34cdf1cc5cb4f563b22c3eb212bd6b95f546ce7797e268fa1ebba95e +count = 7 +z = daa360ecbb51bcb33f5d36f92fffe77c2de7ed43d281dcb5fd68cfa0ce19df2e +d = 859c3e3b13f3cbf5cb860bad2fc6393a78390b0165800661a8f1a7436787c669 +msg = d38cef643f9c6d2f6a4ba6a784ac1d81b32a073e531f79919912d4db70b53075 +seed = 343b81870e2721dd75ee0ad7fdb269eb5aae0ae83a6316ad8ece3c76d3dd3cc391f1b12b22e988c1257b5f56d905a06c +pk = f5715bc5a8afda310e7b9a4158d7bd4377cbd162cba8165745e5bf422b6caa348135719761623e913b76ac61ad32072d7144208f2a74be0993072296afe60496e4943a43567206a2b2c59b71f3430ee5453149691df84ffc91637324af3b3188b6116864782cee8cbea4976701e9bb052448c1258a0a024288376924f957341688c545aba534810a8a968359551b705041aa000622acc6220bc1e24653d268a63abf48d9bab63c9a46f52cd810b61bd9c9889bc23a51818d729c66f89f463994d8b7961ce751f1c45ed7d085687abedbfa5a13b55998f4018010beb7d62cbd802f1c43729027c0c3c81714e137e53aa83e611e38a9cc246c6a21a94a0a97c7923b81c9d80aa165c128f70108ac2721005bf85306f344b87c6b190407202ac3b993a924af9a22ff86998b730e327a2f7a1c53a3a926bda48d86655f3fb6879f245af5b2c41251c89d045a534b1a871b98a8073e984652f7a75afaba55c870c5a0b73cd3040a4ec552e637403507cac1f20b4f82ba98d465fb91c2577799dd697dc38741be40167c756ff4fa5ff405375583b988dbb04e7117e584340119cd9582acb8631e60431c379c8078b6216675ae668769b2ea81d4009d6ffb89f88c3af3f17c69ab4acc3c1c963bae6d5888fc66adf1107846a5238b7109d15ab424532d6c8926f8c20cf0c0584715cebac2a0e7a4253e820db28184fea47fe3439082a1b9b5b55b73008cdc224fd3b77605633a06e21dda02a578ab760ea5609c2a982c64900f0a2c9b320a5a7586894978b3aa97a292417d2a14da0c9b0d49a883e9720836371e1c117efb2b5d979a36c340c153c566991a6133cc599b8096d68d05e55616589d9f705dc2743167c538f60c23e657bbb4a56a3cd30bd23c125dca1cb95968f654b24d03940af09a7dd223c3745f96882856f06a7214acc355baced830da800464b84d8f33c07e20c7d7f22c25635fa5a1c509e73bd653432be863310a9306a9ce6f4c6672b4b6eab1bb5b411a32c89485e0cf65653e72a4502ce202ce6947019956cbf7c09068345ea90a00033a7b55b6b845b39351793986be2bfc4c5e60250104252780b25d641c4feb15d9b85808c333a5341827292926d235e3e7003c47b0a1f8cd527017b1554ab539c67a3c6bc477b9806abe53a9452af87a52fcb1c06a8f3877c2158326a6605465aca8b7884cd9245050c4496ed1134ab92ca4a23b3a868c282587a0348694aa7aad04b29599c9bc7c8bd6f83c53bb160771bb96421f0c411373ec8839b160a226401de937b7741846a81296997cb356c77e279c50f20e9ac30b268ba03fa2852bc93afd6b44959cb16d915c5c2049eb88b575bb0a4144289faca193986c16687b732201e3b0caee968167e24a0582c5421c234a88b01a74199be91d1252c70df97b0bdc954878310f06a96721bfe2fc7ff7cbcd4f78a5cd3675e1ec24e2b0161e743720630a1704b049759337f5cedd41081952841312c020024c2bdc9c5bfb4e010a2ced4b90a9c201220937a938984ea611bd965fb109bd69a37ce328a076741f06663d671904b21516eb3b59108c5a991499740508eb930a9761a2f9438402e22054a21c2d7470db5b644c860350182893a0c27b880ce799a4429e4698b021ab77b711c5462466b67c6219daf1ddbd44 +sk = a5c4869d698468f12b1237b5060932f4babdd2f1255a59a2efebca7fb86ea2818351732278511a4b244a3d8055067c70ff2c2526d70b7d23045edb5497b3c3cba23a08623ba896aeb6350e6e025b8821901b29b84ca099516c993cb2060344a070fb37711c5190b76d44c0b9120580fb53aea469314fa166b262a074e151182b5f51f54ae0a0649615a659c401395b5c987c9e0ad4388690385922030a10727c08c5f545ab78c0aeb083393dc9b5278603dd6ba082d65510d31436649c84986eace4c8bcc5ad910908cbe853572768617426231b6970ca7144d42711f1b4c8c4ca80f633b0775e70b944e6350b7c874e7b5b23d2bb813218b8b9f2845af32580d98c13283529901a18e3bd5fd0860be0a756c86ca07c9f44e389a930ad66a4ab0f51964d71917c2bb9073491b9f88d586c0b2da251e7d8aacd203b7c3848f123ab3c1ab2b53a3e751803bdca92cd841c55534cde4a0e83176685f01ffe00a6e8ca8e64cc65517a163dab42a7e1ce1581ccbdb0c5576319807761f77372f1c738b859a7b12629f60a04adfb8d9d2ac1514894e539c45a47ad85f916ffe645bd79af344c8639b136de752128f85e450c3c2d4b12f32783fa852f82fa54d5127040b24d28c741fd944f12e95cd28533c69967c5eb6d08197f80fa9349b271246a58e65ca8bd450c2a61ccf7d7cce038023fa6b9346358a2078a6660504f56a784f336294297b72b7022a8c5164a61896048be5bcc55336dbbe31e7b787a40641be8535daea11cb0094cd1c91cf6c215b88752aad75d20f01725aba187e05f41e6950234a191503deeca56286c4308f902cdd96d6a39c9d582a05811216bd68521e030f89c3eb42b061888243a53b30cc7a33ff95f4cb98fa3c753b0acad40e9321c063202eac07397c8debc4c079c4500497490b269293809f060c82d9bbd0e5c87b67549f358981f0b67599b8033c909a1d446d6c2324eab95ea242b7585c98a8cc61850b3d431ba62568dc739aa46cb34af778ce3782eb7395aa456cc7795837a23cdad97171e884c8963cc42907ecc2815fdacae6bd9752fe57e7af69373ac7c0a70462d64a0bc74a4d1064ff00733b3f4c9b01cc0c974840f375f2ef87d5cea4b7d72438ec51dd0f6389ca40bb8468111a4b80c927cc4c677b941879016971e14493c548e736895263399d59270e1aa8b25342d3e871e87045eacbc561d91776dd094cd800840d703865c23e02baab6cc7c2db71b16eaa2ed2b961d253c7152c6eb30bb5e496bff8b0ff158025e139cbad04bddb0853678185b323345672d6ddac6093786023579ce4178b0932d46287518d191cd795b4171cc10492965918bcb745cce30a68c044f73655f74e6084f3cb4bcb160eb9c4fb3f5ae998668413c9b11f71735309e99230946fc61a1344309b47359217b09866aeae993444b227ed7673c024393d0baf9b1c2d77635161703f836649d706cf8d3c4b03095d069a30628103c703590e1910032a40943317f6791fb338004dc3afde29255d653c5c555f2112b88bb5e4813b19d7b3ad3a030e795368945a93fe83015478314b9a2467007f142328cc95cb7323a5ceb8305109a158b0ac2625453442eab6b0a0447bef5715bc5a8afda310e7b9a4158d7bd4377cbd162cba8165745e5bf422b6caa348135719761623e913b76ac61ad32072d7144208f2a74be0993072296afe60496e4943a43567206a2b2c59b71f3430ee5453149691df84ffc91637324af3b3188b6116864782cee8cbea4976701e9bb052448c1258a0a024288376924f957341688c545aba534810a8a968359551b705041aa000622acc6220bc1e24653d268a63abf48d9bab63c9a46f52cd810b61bd9c9889bc23a51818d729c66f89f463994d8b7961ce751f1c45ed7d085687abedbfa5a13b55998f4018010beb7d62cbd802f1c43729027c0c3c81714e137e53aa83e611e38a9cc246c6a21a94a0a97c7923b81c9d80aa165c128f70108ac2721005bf85306f344b87c6b190407202ac3b993a924af9a22ff86998b730e327a2f7a1c53a3a926bda48d86655f3fb6879f245af5b2c41251c89d045a534b1a871b98a8073e984652f7a75afaba55c870c5a0b73cd3040a4ec552e637403507cac1f20b4f82ba98d465fb91c2577799dd697dc38741be40167c756ff4fa5ff405375583b988dbb04e7117e584340119cd9582acb8631e60431c379c8078b6216675ae668769b2ea81d4009d6ffb89f88c3af3f17c69ab4acc3c1c963bae6d5888fc66adf1107846a5238b7109d15ab424532d6c8926f8c20cf0c0584715cebac2a0e7a4253e820db28184fea47fe3439082a1b9b5b55b73008cdc224fd3b77605633a06e21dda02a578ab760ea5609c2a982c64900f0a2c9b320a5a7586894978b3aa97a292417d2a14da0c9b0d49a883e9720836371e1c117efb2b5d979a36c340c153c566991a6133cc599b8096d68d05e55616589d9f705dc2743167c538f60c23e657bbb4a56a3cd30bd23c125dca1cb95968f654b24d03940af09a7dd223c3745f96882856f06a7214acc355baced830da800464b84d8f33c07e20c7d7f22c25635fa5a1c509e73bd653432be863310a9306a9ce6f4c6672b4b6eab1bb5b411a32c89485e0cf65653e72a4502ce202ce6947019956cbf7c09068345ea90a00033a7b55b6b845b39351793986be2bfc4c5e60250104252780b25d641c4feb15d9b85808c333a5341827292926d235e3e7003c47b0a1f8cd527017b1554ab539c67a3c6bc477b9806abe53a9452af87a52fcb1c06a8f3877c2158326a6605465aca8b7884cd9245050c4496ed1134ab92ca4a23b3a868c282587a0348694aa7aad04b29599c9bc7c8bd6f83c53bb160771bb96421f0c411373ec8839b160a226401de937b7741846a81296997cb356c77e279c50f20e9ac30b268ba03fa2852bc93afd6b44959cb16d915c5c2049eb88b575bb0a4144289faca193986c16687b732201e3b0caee968167e24a0582c5421c234a88b01a74199be91d1252c70df97b0bdc954878310f06a96721bfe2fc7ff7cbcd4f78a5cd3675e1ec24e2b0161e743720630a1704b049759337f5cedd41081952841312c020024c2bdc9c5bfb4e010a2ced4b90a9c201220937a938984ea611bd965fb109bd69a37ce328a076741f06663d671904b21516eb3b59108c5a991499740508eb930a9761a2f9438402e22054a21c2d7470db5b644c860350182893a0c27b880ce799a4429e4698b021ab77b711c5462466b67c6219daf1ddbd446d786c412743f132c5582335e001b2c5cb32ff3d6c7d7f7f00b816785cbee62ddaa360ecbb51bcb33f5d36f92fffe77c2de7ed43d281dcb5fd68cfa0ce19df2e +ct_n = 19b46e942815df5b1cc8d669d0644cfaabf9da05e35243c9c489a48e8d2c470ac68ab3c1f70b3930ade530ffa91af30f4c1757fc50ff706d75cabf4a3c072143f5ceace47aa094be5031859f5b252097c895998ca7a4514a0a4bd76b6707bb7d7968e7529c26e12fdc29e16afc3345b71953fdcee48190e9bee8d6df9f4353a7e12bb5402c14bef998d6edbc74702e0e0157eaa6b048dfac2f7a354408383269cf8ffd6c88969768e5ace986c2c0f848a63a2611230df97816b354073a2d1fbebc98d9c59dfd2eb1e4789ddf855403937d30f8df54b24062fb77bc56803dba2337e8dce2db435e701ec2f8464bf3168ebfe4c71dacb171b43c8f796eca800a638d7b2dc052f913ed9ce08212cb0124f0aa36e46d898a6930df71d04d785e18df4d2a61b426ee19e7abb85cd6263fb43cc9b0bf3a7b9f34b51fe4b0bb3828baf98fe0b1baa323b64231b0ad863f522ebe3b7916f298381cacdd75b7bfaa75fccfa2f1b3684e1fe16a9df25e36982ebac878f6eb45918839f1f0c5d13fcb6dbef1c9cbdb72cf5c38cc4e79ee08f5c7097fa6ea46a19dd6435bc5170ec8424d34cb0f7b96c73071618370101576bfeac0d288c2888083a9b697eebd9f77d499f3d4ab3d612f3d529e3a04d93675b5cc37b07dd1df060e630b93c05815bbddd6e798a1b52a2a6be4b9376e7e0011e9bdf3ad5477c2b35e7b6dfb5f6da8605151cd3546a57d89a70375bc4af0108823ca0350687a159d17a7e87766681f71c9252430b29f72deac7e6f478e3b0d64d7d74356f0823bfe72a8445c3c2b5ad6ba1d1d3fec90ab79243c0c0a4f14a48ade462c47c89ef635437b937f30686d47489467c847db47faf73bf2f95dddc3fee9deb5fa5107a20e683396c21aad0d83133e34a026b5457f17e21f05457e4b489c72df3dd950f7e820f5f2aa0a6409a237108a35efeed99ee11424a79a1aa8ba9ad98f4f5eb221c9b352885653dd062cb155906e07943bef64515b9a61c2aa09385f8fcc20df8d090febe6a63380aa2319913dd9a9165b85b45aaff8e2f6f1df15f6734aeb5ed2e4dbbe6724b2d1323825c2cee8bc34a06cf6aad70201b26e13f89412568acd047a706b45b401fc935a4cf74f520fad7aa3ca75ca449657274cd4bcae3cc7e6246c32a248d741e768224d0964162f821547fa6bc10d6cd511d9cc458d23c5edf78ac3839ec7465f61f62b3bbc9cc6113bd866ea4329eab97bd9bc83656c0ba1b5a96207dc3bb7f9a922d578edb6637ad74c3833aca08a3abf10a318ccfb227662c0990b1bc2a19ab519a9522b727d00681f821c175d5415e2db15b89c108fbed0bf29224ee1b0088ab74622bb78d8abcbcead7fa28dff83dbfe255403d40715a52d0cc64904933214bb6b5feea8e56254feb7765b978099d33469526f0113e6dbd52157efe97622e4b15c4034cadeb28d3fe77408402088148954a321dad626b988399975e6d647d72995985b4fd8973cd1e8435c489d3c891b0faf2174957bf620717fe273da7f5df3cb26931f +ss_n = 1daa5f6b37afde33014c852bca10f898375afb55a8699f2e9e6b54cd44e76c91 +ct = 284a50efb823dcdd8053d475fc83518138418ef6209d6c7109e88c4003a956fdb92b7ae797c4691eb522e5dfefccd32058a0251b6b72b903e29f468cf6c16fcc65579eab8901a91921cf907b8c83b0d3a4ced5d13d20789f504420991d1812e11e4cc3a140ab2869969eac810ca91829e49d9a82cd29b433ee9a2b263e98dd4921f952d9163848bb1ad750cf9e95273a40b0e8e6b2cceefe0cb23827e9619b39a10d5e0d8504c17a5e152fb6eb84443b76d759c9a247934ade0c73b89932c1ef05d81449696a14338cf865df8685d1e58db1a470d695108e79019018535e50f0cbeaf4fd3091d4f4cb20f0542274d7c2755309f7af783e7185e6e4f313ff93f90513f1184c2ad913dad8e0960b9e1d0b1c5fde1ca135a1568989315423f06b85278a93737685b716b723c652aa90913b8a26c6d347a95503a5ebb078c69b23e30773d76403cbf5841cf912ba214e4bba4e7e1cde02b9c972c593163df9cefb4ecbc817ccce242d9785e9465310c2d31eeb3cfd41a52d1f12a81bc8cc408a4aefc2dc2026d9c73290f022cbc373c3c2a6b7cba5e0b61a462b4be8a2e46af5faa06a2036888529de6234ef0dba0fb26b2ac318bcd3663308dc6a50f173c24d414675e14d4d1aa76f74f4dd7d838c0978a51dfd8bde4f94f3cfc50f37393428ffbb298b908543eb43da027df53c3c09cdbc776727703502879d53558d016c362bde56530d74ed7cdfe8cd31921a5ec36e56c13fa876653f38218c618a92fecaf3f3ddd4de3f1fb8a77b1e75f5afc0ec6a38962660dff5aebb6d825578f4b03739965ccd59ccbb32afa7ce53cd0e1d23696bb1119875499894ee94413b19eaee5be281903571673ef808db9ccee504518d7b373eb05d0dc0d48bc9082467ade63a69d8063898e25992ce2253d5e3d8b0cfacf45e5d342261e830e8aae1c331701f5f6a8c676e27cd2473bc11d0ecd6e1ed49c231f25b6547c0a1339df3dcb8114d595176523c780bee8af9b1a7f6626fbf4e5028c92dd93ef041883a8d60d940fa5049afddf9d42c85e2e15191a011ac5b97e3101f386926e9eadb4f2b6d6e35f150c955534303d338793480f2b8fca7177888aecda446dbb4b9c3bbcd5a0bcaf2bff83c74dfb4d9e55f018f4a984e413dd88039be6449e58de730eaaf7448ffa7b92f1b3390eb9ed3e0f7250c76359b1d5e7a53b8d87cb951eb964f4bc6ee8bf1f23dd5b461a220442105d2743481f139cdb43d89920549bef78215b06e73ef150dfb257567b45762b1cf7f0ce6816c1009acb421baef08eb7b3a08465db7915448d51872dbe52aefc7dfa509d4ded406080cb13095f78b2b05ea0f7b69352f75fb84c7959b734d77dc4ef1fe8575982c71aadf93b9e99025ff16a43bde250c8efeac28ed38ba9cc135daaeff345ee7cd4b08462f519e6ce756be8b94182238323b52b98bacbe8752018f12e34e3ea80dfca8d5797fb226825f442701d68dbe6d0cc259f6194ed2462c6da09d4d390576bacf9c16f6455503bd6f427ab0c3ca171b +ss = 14b5d79985ae985f3b03eff5dc1f15bd4fdf9cf74563ca65a5ef602bd14dc21e +count = 8 +z = ad10ad3409a90c4b24ab0da526f289209abcb1f05c86c7e4437a144c91e1c867 +d = 23ca80a61c0201f08d6b9bfae101fa573fac5581ea3e54daaad3ad7a00be5716 +msg = 81c5839b15d7335676dbeee048f6bca56c4976331b5df39a212bbc2a450f4143 +seed = 406d9c95f9813ca6a9e6071d3a7a63093f9e00cd15ee968c3ab28cb7368699491e5662f6b63721fe059d50295c3a7516 +pk = 2e11817522267210ab9de4698478a8b4d40d456a582d55b72c6a29c3a47f3e77174a11bb096a44600245e1e878f4e14b69b60054dcbcd066189cf6b9593437ce202737f89fa04c2815425da4d97f8d51a8bf6754afc1b1297a6633d229d65a50dc78867a918e920105de9c069ff86f9a45798c435898f20a52f305079794ab36c806c6452586208b18ae66662a02c52b02da276a4cc77f1425235342f7451c1cfbc91c085b4545854b979b2f54883a5966ca808bd6126272993d7eb5aa88d91471c62271fc7b4bea6cb0d47aa7952bd90971c407b33dc78668a257f070c90c94855625a18cf73655974da5ba7494135ae2b73a44c87c7334418560c18b583d1a2b240ddc1000ebc952db3a303b57fef037dc8068f3fa6a7b71484f815ef10153b4857e9417acbfc38af9381a435301d4679270b700327b92d275a39827353d988239169ea7c5615d45560525618ceb4271b930b317390702328e34007b0006e0179d5daa2f7be0248f1a12ab2a040d4cc7737a3ad6a233b7780e2ddc8e0bd891d0b449a9255d59e1c0918c853775b4d14c4fc554481584ab337722e70301ea18a74579b62e65311293a3cdf14dd8186d0f596c2d5b43d578c05330bc036b19b2614a5b5cb2864c48f7a20a3d7740978b529ccc98865b9cd58000eab4a6eb20cf79842d415505c2399c94291dc82c753fe13e22e2347c504a5e26bba84910c1306a01665324599a11b9ccffcc51d04641f1543f741b4d970358a7fb9f4a365cebe122d1ac76cfd24fe22c6407ca0a9cc938ac3ac951c64d2c921533c83555e9ccdf0b123c01c1d1b30299c3189f23ca614444379b8f33d081515842cf4922a228b8e52b50dd12c51b76c9b730c33bf12a9a2bc69e050493d52df1a83b1610bf584c2aba428b6383cd9070760006967ba8263363133b37307f50c1544c818de64018a919c4473f3741853d6b6ed07571702ac7822aa55d706289082560e932b7f96e1c446c0d501cb7332faf7764c2d2884927294b465cc7da45829b476f618962c9094f619b6e272b810812bc1934cebba06446aeb2737b1819ac10184b94ec202c23143e85c2e33841735012aee88f2a633bb51061de1842cc10157b1829c4e1485e27c69ac2c346a9836f9cbaa7558c72544395f927a7259894a7b22111478cf6c86b51b5bb832c0075cf877c4346794d63babc34158b803c79fb448d5bc1543b4741a7a36c2fa045a72a987cc870e80c1dff66a917ebacdef7b1f1d90c3290a8d5f83ece46884a9a4e243aace64632e0f375c823b6f2bc6e738c33ab5540827c77e4f0b4cc790aede142a681adb71870d64c42dcfa6b1ebc7598673d2e357f59d68e4ff0b761b7579b42b6858245a9886d24bc7e6f75cfe7e88b9ae27e727c7a5dd37130ec792f4b8e01106631c881321174c3f64f84627b3f54bf00a69f0b1b466fb1992ec982fbba504649b48253c48aac902026cb31568be746adf945601867207116646b63067ac9a957099fce7942e1d4a9d91b0c78612e8b9654abf62a16f399a66c2608f219106a6f0247ba6679a94ba2b84ee8b9b9b160be7387860307e554ada18706e5758dbc052e81090fda39495f1a91a1a8a2ee6a1f7455a548557e08273d00df81e931dfea47b2fce87504a8856894afd30279426fc38e36 +sk = d18502eab13a17b79206610303c13d70591b50546cca1cbd5f5b8b27eb3d2c9134fa8648eb51421c648e53a40a6d2c1ce6fa2bac8c77ca652314d073ef2626d04abfb9c0286c44cbaa794d9a94a391584cf3b95efd6307cde55c8826413417068f0688368722067ba0a4794996c3ae64809fb1597daae1a30fa843a8ec1c8ff0ab0f0a053eab99b55c60a360cec401323cb43699033aa4d382d07b68da843a3a762c8e1ac2b7035b30644baf2baadb69039aa0b59d70810805ca493471ef614404c9ad2545258e8a80c073370ab26eebb28bf5243f726a8c02f83e3b6c9f0353624f585e6fd7c04a96725aa52d3fa929ff3038874cbc11463abeba688ff01c17453ef763bdb56a82f2bc94df57c4edfc49f62bad1e319acb924feafa59ed883b96f610d7e5627cf29c9b052b6ca80ef4c51f1e99b99bd51f32b3c7ae062abd4706195034999339cbe52875aca5c101cdc20302230b56f3486f474843ad45be0567262ae4407ae3621513b8feb120f5ea3115308d118283a21a7625240dd8c06b78fa7c34ac7ca9c049506a9eeab4935bcb87818549df1897fee541f63a982f571060e32b1afc060ea98d8e871c07c56135a434daf05af092246dc6210004cb9f2cc9ea63807d3ab7c8855b67d4018dec7b53b7308e9271d2373a0b80227df6362dbbad79e57296ea7361d414870563583a88447c59b3b42902c25b806c442456862128cafa614ee92773c875c447f338a766ad2619ad4bac8f7ff78fce675aa2657a0001140e73c463192349762c1162713578486f5c46da6a99154cad0037c683b62b2411aee4140bd0010847915c88c904683690674a645e86a0bc61117a5357c7ec0801ebb0c60ba5ba9290fef95d42e8b532033dbecc464c769e8278a916ab64a690b26dd64fba4375e8651fcb013b82e4701acb3f5ae4117a436b0586384de959854431d7c3949c3b9b9dab565939666a513a2d23806e34ae16b776ca213787a77fc936c83c5c8ec6836f8d9144709824b00a088b7b87fc9a234b37447ce629f6a0c757400d4e6912d88a2927ab7fc1461caf943c087cb1ef5b1c7468c586b57c156c71187c2fa1fccd8c7872ac805f9292150f3a482bcb38cd86be833a96d151a25fa1b7df8a746d7caa89550ff7a9b14a536f3b328e167684642484969644fbca1923f82371f27f50f57087071e5be1549077b96216370b110e39fa15a13a2e3bfb803cd35e25b7b483709d3be9972f1c375cca3b8a0870936a2cc444c07dd1c212e1c6a13556d791ccda3770c956796d9aab37f54188b1bd997704cd2246170601503b10df889dfa962e01b048b6dc78992a991d5c4d07e5b2dbe9c7ec472a19377eca5a1dfe601c01f878231629db9a44f002ccfcb7afa132aeafea89f72a0366c3509a27b1c65626045101df56a0ad793b27b5a07e277b0de94e15220c64248518b3b251e67ef7b14cee95ca55563df43b8bd2b7b5c9bacbb028622b6a768dc44f83ca83a32a8b85f0a48454cf4495a2cabc5442278e55c02968c9aa0b26c69bd738c6f3aac7d002c2b8c2eb621358834faa9ba5e8072ee5c4493a1601f8d56d8f76c87b254da4668554500a0f488b9e29002db4b638474115999e2e11817522267210ab9de4698478a8b4d40d456a582d55b72c6a29c3a47f3e77174a11bb096a44600245e1e878f4e14b69b60054dcbcd066189cf6b9593437ce202737f89fa04c2815425da4d97f8d51a8bf6754afc1b1297a6633d229d65a50dc78867a918e920105de9c069ff86f9a45798c435898f20a52f305079794ab36c806c6452586208b18ae66662a02c52b02da276a4cc77f1425235342f7451c1cfbc91c085b4545854b979b2f54883a5966ca808bd6126272993d7eb5aa88d91471c62271fc7b4bea6cb0d47aa7952bd90971c407b33dc78668a257f070c90c94855625a18cf73655974da5ba7494135ae2b73a44c87c7334418560c18b583d1a2b240ddc1000ebc952db3a303b57fef037dc8068f3fa6a7b71484f815ef10153b4857e9417acbfc38af9381a435301d4679270b700327b92d275a39827353d988239169ea7c5615d45560525618ceb4271b930b317390702328e34007b0006e0179d5daa2f7be0248f1a12ab2a040d4cc7737a3ad6a233b7780e2ddc8e0bd891d0b449a9255d59e1c0918c853775b4d14c4fc554481584ab337722e70301ea18a74579b62e65311293a3cdf14dd8186d0f596c2d5b43d578c05330bc036b19b2614a5b5cb2864c48f7a20a3d7740978b529ccc98865b9cd58000eab4a6eb20cf79842d415505c2399c94291dc82c753fe13e22e2347c504a5e26bba84910c1306a01665324599a11b9ccffcc51d04641f1543f741b4d970358a7fb9f4a365cebe122d1ac76cfd24fe22c6407ca0a9cc938ac3ac951c64d2c921533c83555e9ccdf0b123c01c1d1b30299c3189f23ca614444379b8f33d081515842cf4922a228b8e52b50dd12c51b76c9b730c33bf12a9a2bc69e050493d52df1a83b1610bf584c2aba428b6383cd9070760006967ba8263363133b37307f50c1544c818de64018a919c4473f3741853d6b6ed07571702ac7822aa55d706289082560e932b7f96e1c446c0d501cb7332faf7764c2d2884927294b465cc7da45829b476f618962c9094f619b6e272b810812bc1934cebba06446aeb2737b1819ac10184b94ec202c23143e85c2e33841735012aee88f2a633bb51061de1842cc10157b1829c4e1485e27c69ac2c346a9836f9cbaa7558c72544395f927a7259894a7b22111478cf6c86b51b5bb832c0075cf877c4346794d63babc34158b803c79fb448d5bc1543b4741a7a36c2fa045a72a987cc870e80c1dff66a917ebacdef7b1f1d90c3290a8d5f83ece46884a9a4e243aace64632e0f375c823b6f2bc6e738c33ab5540827c77e4f0b4cc790aede142a681adb71870d64c42dcfa6b1ebc7598673d2e357f59d68e4ff0b761b7579b42b6858245a9886d24bc7e6f75cfe7e88b9ae27e727c7a5dd37130ec792f4b8e01106631c881321174c3f64f84627b3f54bf00a69f0b1b466fb1992ec982fbba504649b48253c48aac902026cb31568be746adf945601867207116646b63067ac9a957099fce7942e1d4a9d91b0c78612e8b9654abf62a16f399a66c2608f219106a6f0247ba6679a94ba2b84ee8b9b9b160be7387860307e554ada18706e5758dbc052e81090fda39495f1a91a1a8a2ee6a1f7455a548557e08273d00df81e931dfea47b2fce87504a8856894afd30279426fc38e36fbc61139f64e1315a135e6ac399358a191992bc5db4adf5ba2ccb026b9e9548aad10ad3409a90c4b24ab0da526f289209abcb1f05c86c7e4437a144c91e1c867 +ct_n = 48a940fd8ce0a7105163738acc8abebff47418a4fbad5d680e4d3c6c597dc47f268597b2c4c67ba3043bacd853e5ad8a07158f518d5b4d5c59e76ce44978da79866a7aa968290f550b97e2588bcb6e15a1b7c7dbc4b2f06c2b51723ab3522c05ed6139b5ebf4969ab80ea9e48b6159b79056ebdfb152a1d104b9652294bbc74aa482c7f5778c460d17bd912dbead475d1737afcf6013bf9e20c7fb697d4e929a9d1df5a3a9b4b89f1c0a8bd6b72ef59a6054cce9e6dc23d37e25b63f95a709276a3329843ce95131bf9e515e0f86daf834a11fc2d005b3fab7a99b8b52efd75733a2825c77b7eb1d6f199843902f6088434d92c104e9a606abd6c91b4deb3aa5114bbb8cf94c5008b3c66baab6ca51569481207f27306f10d2a4e308403f75d5a62eff44d9d69485683480bd32b17c0c3614f7d3230686cf95e3313504afe319358f670ae48ce542288c139e0bffcd4b289e94c61b1cc90b3f73b39a8df71996cc8dd3581c49b66c8f3b981d14b8bd9f94ec7f3368649f8610819008a9127374246d98edfa7bf46dbbfa6c9781c6fd09046c775e3c682af91226b6ef39fd85e9571b39f4874b9133c63d27ebdc426a848cc5642098cacb641655244dd7262835efaa96ef236821915e87e1372656c6f882c11f6b9570d29e47d29fb40b452d8c98e2eb795e5df84231475c83ffd9fff771e12ea83fc789f9941027f0c9eff1d379ffe1abb35cf05d5293506f99278df98af82586ef33541527b47362d0f91a48e1e0d5e0000d4591ff21095ea93dcc1b8e4a77b23d19b5999ce4fa64325e1be4295a54819b1965a7b4691bd290f3a08ed3f053016e0a745e4872a9bd7db905d0d2702b4a264db32846f547d9ae6627c27ac4865cf498520c71cfd8f983f6ecae28d4aa8b6302727e65e21c94dd828a84474209737df2a96438e8ad4b7a528ef1ff4fe25e47ebcf723dc0bf8bd35dafb2d99dd4e104e26f8a0ce7b8cc8ced69db54261c3f86fbacb3cc443ae6baa50b627678ec9bbbf38711cad228188887ddbc68936b926c353db32d934f2b40c76750e59dd73c3c1f5d44ee82976e375cfe4a4989db5ab779126304b25c4c3afc460235fd123706a3f9f80b27751342d339aa15a0179dee4086a39cb0b4c4880340353acd36b31ccc90abcef46e986d221d10c64e7d2a6df1306e35b101864da0c9d2adcbdf869fac6c25af28268e8adfd24970e0be8ffbca889def0ab7942a528da228012db8d4ff77460c4bd0692cf398b848b32f0b93168e4a0854bcfb4178aff690a7f2e985ca4ab50b9dbcee17a754655d4e9b93bae575d9e07fc0294e26d66a70acacb83cad0cce4ef6501c8f3dce246d62a3744643ea4f220296f3fdbc1bc489935fcda5828bfba25126a983eb5ce7d15a9c33d5a7403649ec5336425f88c3547b6622ae29a23b0e4f6d3cb56006b3097c9c5190968404e35d4c9045ae25c43417dde753e8abfacacd98e93e3dba983512366d3750cf5837b978e5c66146e70ab19e42ace110c2110d0c24785f148a +ss_n = bd19f7969014eccf2e67c2a86ca1b3f48fa8a0a892118b18e7e93a40455da72e +ct = 235c942dd78cb6ea621534d7a1b7c8b58b87afbdbaa14975e17c2ce74a217d175d7b66d084c351c47b69e56e6caef988cc5f2241667b43ea20c9dc04ffc684a096ba2bcc41e9713e702520ba7fbbef052e9820b1a0b99159ea5c49a2e5a09a28e2c0b487dd42a644cf77d8c3bf65abb2b15cd30af4fee591c452451ba87f2e2e5b93422e6a44f6f8bcc09af2c0407091fc62406c2c565ae683d92dfacc6e36d620c6f259f81086e0049aa5b6f16887244d4333a249f7c3be1bab04c9c331f7c0462b63a3aa4e5628fae91f4b5ac8d7a8e8575c10d61eba3463d72ed870e1ee42d417b8ed225400c751253555dfcce6bac197d8ea5d8bfa14999b2cafa1d9bf842db81ec10e31c6b68d669eedce54c5252e0289affa30a7825ce4f1654353770584b8e288c945322aa24740110d5a589b1188b51a9fd6e961e17bc30ed51808d903a64d52f4a5a23cec155b78cd47e989de02d549e747cf72faf7d94aa67d74a8a73688416e4ccb0482259ab411bd60b09df6ed6035fcc7ab418a543ee9716e48ee4d0dd8a6bd2f3d9284324c7427ffe3ac1febbab7c14f0be339eccd148ca5391c0f29355ad8af1b27d70bbf3e98762abe855dc1141cc5727baa6007a002fb83ecccd170f12e6ad2605003836a4cb2581cb54adb40d0809112b05603d9a610bd1ec2f9f54115da5c0653f81c443e8173969bb0f1f4d8d673ddc9edd4b241daf277f10925f96717876e02d5525d3e9dcb24b747d738efd959b4b1951015423ff49d9d89c01848dcce4be22c192db96215296ef51101fc0c5bbe9c4b26ea4c2a138a158e018236a490ca29d393d85005c43ff75db5880be6268b8b11e8bf66f51aeae78a01b8fc2981a4d1bd93c4d72324f8e790651c9ec82ec7ebc074770426769a8dd6097406c33b1a66bcfbff932ed9961bd591d4c39916e27036f9d40b23c70207dc4621ace2fff3c6f8952568a4cb22de1ad55f214a3b980de81c06c8493b59b02eb3fa269fc15fc39e7ff77054563375cdb22cfc5d951797365d2964c4289244905ccff0d6b227f11193136d195d2732eba7c6c6b95a48128101c56502850f69509cf0af323cae2de8c1ffa3b8cb6d9d75aa0814a55af0b66bebe10620cbf185608287b9d3095d0c21baef89e5de73796fce588c3e1756c677ab2ef6ad7f0f78be33524ef079230d0fdc25990d4b3727c21745b60cde93c2b44e0c74de39d4a89c2e04f12cadc985f3c3fe8c850c97215187f3a95da902f960c03430c5574f0d07ee5ea2a410dada8383e09a60c2bf0794fe58a421bea873683bd29cafe600514cf8063d6327af4243881b7f309873fb82011a6d9d306913d6d7c190a86a9945c95f92bd75d7496eace3caa38cd771b058c89fc4137fe63637e347ec8f682501520a17e05b8c4fe69a8cb2683be8e9dd830196f04243e0ebc8385d949d71f4a3d4a36c40d84a6ef4dd55be1c296e4534b22eaaa338b668aeabe2b9d8d8563381b45c502c14056eedac64363cb292dbc0556376d1de91d770362780f284da +ss = 8d3e3764fa7040c34b676afb42b92108d0cf6c9944bc05f3ab1b4a1a6053d1ad +count = 9 +z = 793871afccb50f4035b9788c7292b717939aa28f5094d99ee262047b15e42deb +d = 4873d1be6c8d109c0a8f765098aa6467b2a1caa74b4c0875fa798ac727ec4f67 +msg = 9aa488f44bf182090015d67ff8db894c355f1f588d32dea8dafdaa1d1404ca88 +seed = b3c83c13dd15dffe58fdb6026d32e33e5ef24b094be16741dd5b587ea841ad19b6f026a127678849ec1b459a365fd645 +pk = e5e8220d8b8ff2084b69167753fcb7732b917cbcbdb8771f07093f86685a1e11053c187bad3c05c356832830beeb5a05fbe661d63417dc1721ddb9c765763215986af38582498006cb634d8ea90952c6a270540729e8833b471576891191286a16953b5e524933372ec93a9712d14036a781ae1acd5833103ea10874a04b68b4565d45202cd5a09462761292a236559f814000fad59ede22a9348b2ab415b1d7818a2a67985bd4a91d8b6ed4cba9780b00c0652b5a818d14831465502184daced0a162ba0396ea486904d843caaa9a164c984116a746554d646a00552448c55931d03ccf87c9ccdeb46eab962f573a17e78253beda962e98a190e973665767586750f0370ef3b5b3a3f4cf6f8a0df246738bec45a92429d27781539ba25015151f0391265a35fecb08d521bb323b2a420cae0b96bc1134cc8a1551bcc700874008bce3029f8318f2332a34245f7b42a6955b71a48c6ac9cac6c3c76616973512f2bd8b343a9533a6738b1e5e78b20d612c6a2218bc0303a9e5c20fd3afaa1c1ada310764b5cf8aa594fbc511aa390de8a26a0c4705e1d99623457d9c523afc18a680c91ce5d69df81c7aaf79a4cdeb18f9c023c4cc76677422225b16e5f4b308d623be30af4508818b878977b034a29b25bdd7b65e37c5075c8854452fdf4c8d8a1ba028a24d20a85715c0ac1a80b477bb3420172ae8a5217aca81b2b8263dc19765c83d1b42737af3294f2a44353cc29584a25d812251ea4fb1909eb1e30bf9c69898a9736b6a513f59c099761dd3969b5ffa036ea7319af3c09f496d2ff81f64957c8747a039546345c8c47cb17ef1999ef72b6f68082d317637b45397370a0a92923c76d1b0b2e34a850962635c505ad2784a151975934c15a8c32b970d628b542790bb795033a24455024ab8efec8c8ba50571e9059d3b0cc396053192b346a0308f270a67f48946b634a1201883e54f35998e24f2ab7aeb4b3f34715e494b4f31483d11c2071c567e207f8f504aeb2c4c11b80a9e350f4d61ad45d0b86119993e333b31f0335a79a22cd714b418665f736027252c977519efd094d7828849579ae1760320a43b8c6489a7b2cfa047c7f75a186f034428b24af9818598ba53d068758fb59f6789350a126ccd0c5b5eb4ac1fb2a238bc2ed7c68b6497a0d3528216426567d090b6136b98b979e13b6da7caca19d51b711c625f70c8cd5c59b5606da8ec28cc6681618b279e70c50f3826c8532398b7082f834a5b6abeeaf3510f7652ea3c74e11b0dca67881d3c7bde3bc0163852206b33a55030f335ac5385a35b8cb44107a595118681c43e0cb1661da25507d13c32157031d3936d6861355455463a107b26689b255121fc214a3473d6a53f44405518b5a52bab2c8f24a8ea68944fba27f2816a1e5b6165844925485f062941aab288dd8838753648281ba58e328f87c65e70a5c898bb369692cae3589a602263a3191d9b6c67db409c38c296868b209dc9cbaa63bd3ebc00514309f62cb4844b4a6f2810d87b8cf28312dd570d2da015091c1eec3bc7116605523c6be09277c5d1cce9fbc2d87b37ddd3899d239dd9072d4160c3a0bc4837aa0ee54c477835680bb8c000007ccf010abeb9a5e1ac2b98971e34f49a0b4e4c0033122946fd1441fb0714f28fa6dbc798 +sk = b35588bcd698daf4157880436197a162237a35e1658f30b134112da08390f9ebc3fef707b7939fbfec4ffdf85ac2e13598eb67ccf4a77ae4421ef0cd603a4ae763673c7ca1c62041f61069c6ec60defc6d6d445bb1ec02f7d240bba7b0e8f18f4ca107847aa40c2778c4b93724e9cae3c112de6b71a80867aee68bed6c5b3ca72ed4c4c72de65b12c5aad980a084716267bb18adfc50a5d59aee2bcf45777799327d0fb04baa6c5abb2a58518ca1bb08660c965df2d60540a8bf7ae541b23a2725721bf9f0c7e6a4920466a7856a18ca93395f8b4e7e1008d2180837795bf9508bcab032e2561076649ff07289357b07b9c96448c24e7221c2d504777df86a7456a09df7a320f00ea07791a1066fd017033faa3fa072452a4a71bc7369b46103f7c4bf81900eb15629bbd942852c95fe6a32c3c76bf7a6c57190aed32c36b2440f59aaa561d709d9035ab774118df1339313553acc49d11660ae97bc1ce129f7a2705eac97e5d915d4db43b4921c005459fa945292b08685931d3bc2509bba41c3d53603ea1dde6b54cd6a493f087d041c38acaca22b15c97e9a5b02babd39523646c525f4eb22b8ec8adb543bf54cb713ca8bbc193bc0517a60e345de60be833a60ea869f32836106b442fd24792812abdbc988f319a06026ccd126a5ce3927fde696f58b4e57b6906ef367b635933dbb5d2ebab8ba02a78e0694c28a19839cc7d2bb953c71308cf10a536630df4197d1795b5f678b1e9785a766b2c4f822748b1f09997cfc81018eac6a80e3a1db177d17dc98a8194b783b69df5688392c30e4786f0cfc517e232f7fecc2fdba4df12a2a09c802bcf45c6ce9c252096d4cc33ee16c6fefc7111752709ff796a1a83a67b884bc7427b5636d579483e554752b0822ffdbc95769ca213493dce19cde940e2b0035ae001b878c7bf8f865b16915c21a352a32a4f2c75e13047695c5ad9c988dafd11c4734505c914eae8747044794d84499610068af8abdc254b338f3ac4d20818c16cf37409d2147a6d5501d544aa99aa4300efb9bed6b8113f1b1e3ca3fa5f187476bb105626a73f55d268b5cd2a57c32d848c7f0a5339b712d5a861362846d07b2e3766ee20492166c49321a5b40aa0de1b5088e7c8e002bcd88553999143ae07a4d29d0bddf130c5de0ba73472894a01e67273cd3d2b6a23b3717d365dd7858da232a6dc3476112023bdc1637fb8186a824f9c4c2ef55cfca8551f8a6b8668bcfe6867bc3da1777f4cac1b72691a692e21b99c87b1f3e6ca14f8c52c82561d8802fa0b6aec7fb9f25dc99c6baa598164d44e07c54a223953b9279976beab62c3aa21311e159477012984a9324f724e041cd4ca6b9d25b9a38ccc71703b7f9cc7874da73a87c0b3752646f9461a459ad9093492e5721605a86b014c78e4c9f2ef261ed331ae2771c7ab86ead727c3ee26082f30455797b96698911370a7b29525131493846a2dc74a47df61f71fa7dc682ccf00714a3870b7f74c7f9d3371c058bd2f3bc78eac492bcc042f28f06d60e9944be370c34dd92abf46b336c9365b46969ae93b6df47c0d93b22c8753b6452a3582161ee72cc57eb41f1e508055770fac1405fb22f2597a4b22067e5e8220d8b8ff2084b69167753fcb7732b917cbcbdb8771f07093f86685a1e11053c187bad3c05c356832830beeb5a05fbe661d63417dc1721ddb9c765763215986af38582498006cb634d8ea90952c6a270540729e8833b471576891191286a16953b5e524933372ec93a9712d14036a781ae1acd5833103ea10874a04b68b4565d45202cd5a09462761292a236559f814000fad59ede22a9348b2ab415b1d7818a2a67985bd4a91d8b6ed4cba9780b00c0652b5a818d14831465502184daced0a162ba0396ea486904d843caaa9a164c984116a746554d646a00552448c55931d03ccf87c9ccdeb46eab962f573a17e78253beda962e98a190e973665767586750f0370ef3b5b3a3f4cf6f8a0df246738bec45a92429d27781539ba25015151f0391265a35fecb08d521bb323b2a420cae0b96bc1134cc8a1551bcc700874008bce3029f8318f2332a34245f7b42a6955b71a48c6ac9cac6c3c76616973512f2bd8b343a9533a6738b1e5e78b20d612c6a2218bc0303a9e5c20fd3afaa1c1ada310764b5cf8aa594fbc511aa390de8a26a0c4705e1d99623457d9c523afc18a680c91ce5d69df81c7aaf79a4cdeb18f9c023c4cc76677422225b16e5f4b308d623be30af4508818b878977b034a29b25bdd7b65e37c5075c8854452fdf4c8d8a1ba028a24d20a85715c0ac1a80b477bb3420172ae8a5217aca81b2b8263dc19765c83d1b42737af3294f2a44353cc29584a25d812251ea4fb1909eb1e30bf9c69898a9736b6a513f59c099761dd3969b5ffa036ea7319af3c09f496d2ff81f64957c8747a039546345c8c47cb17ef1999ef72b6f68082d317637b45397370a0a92923c76d1b0b2e34a850962635c505ad2784a151975934c15a8c32b970d628b542790bb795033a24455024ab8efec8c8ba50571e9059d3b0cc396053192b346a0308f270a67f48946b634a1201883e54f35998e24f2ab7aeb4b3f34715e494b4f31483d11c2071c567e207f8f504aeb2c4c11b80a9e350f4d61ad45d0b86119993e333b31f0335a79a22cd714b418665f736027252c977519efd094d7828849579ae1760320a43b8c6489a7b2cfa047c7f75a186f034428b24af9818598ba53d068758fb59f6789350a126ccd0c5b5eb4ac1fb2a238bc2ed7c68b6497a0d3528216426567d090b6136b98b979e13b6da7caca19d51b711c625f70c8cd5c59b5606da8ec28cc6681618b279e70c50f3826c8532398b7082f834a5b6abeeaf3510f7652ea3c74e11b0dca67881d3c7bde3bc0163852206b33a55030f335ac5385a35b8cb44107a595118681c43e0cb1661da25507d13c32157031d3936d6861355455463a107b26689b255121fc214a3473d6a53f44405518b5a52bab2c8f24a8ea68944fba27f2816a1e5b6165844925485f062941aab288dd8838753648281ba58e328f87c65e70a5c898bb369692cae3589a602263a3191d9b6c67db409c38c296868b209dc9cbaa63bd3ebc00514309f62cb4844b4a6f2810d87b8cf28312dd570d2da015091c1eec3bc7116605523c6be09277c5d1cce9fbc2d87b37ddd3899d239dd9072d4160c3a0bc4837aa0ee54c477835680bb8c000007ccf010abeb9a5e1ac2b98971e34f49a0b4e4c0033122946fd1441fb0714f28fa6dbc798861a123b72fdcd0cb6eef4c160fed7ba20a18a4347d40bd50b98ee86fc8b946c793871afccb50f4035b9788c7292b717939aa28f5094d99ee262047b15e42deb +ct_n = e66b5d39721e9168ae6958942e6baff79da05cc1ba00ac76f49191806b4c1081f40d2ea5acef8813e8ac3fd763e2a1c4b0155fbf5117c35137320a20c05c9e9fd3c09e76919a2b3eae942a25410cb59eee75ae1d60cbbe55fe11d05ef3b5de8c7c81b7df004674c67b8039a580d70582576355914804dedbc4d0ffb21f40acd34058bdf08ab48d51850a26ab79dc8222f3a1be18ac0bc6780da8c1bd099f7384d254adb683e5bba9897260828fec7b8ffe3086456bce9f26b20cc22faf8618ef7b493ae8c940c06cf6dc5b534c2effa51e51e6153bf77aa8911532b70ac2b66c5d916924dd36f3268b09975ed08cab97097d2d268e3712c249f41531e64270d9ef29a44e7db14bf4d51dc937b17922e6dacf3c18fc8aa583e5ee6c1c6752e242306566fb67e06e7e4564e7e3606e7937740006b71e69fd9c449bdf915c80042af57dfbeb7fffd0b5bf5064b0cb63562bee0d4f9a3a6e0c53dbb7831399a0b7207362cdd695beaca092ba797f7b7c2a32a7c012ce63525d534cb7ecad2037e4e326d7bd5ef33a5f643efdad38cee892c76306288b630c622b3c192595e4c1dc3cc581d1a25374e177afb13a94fd0a937c6b63730b986677bf10053dfb07c6c3816c7f0a491b9de173a200a330f2fff37f9589dab5e2dc7563e9120f402da8724ea02016f48d59ff754174ce6cee2af27e581e82abe56729920cfb778f11df83b7048d9eff1d2f7ece76dd839172ac5b7ed17433f4e9d7119d1b3e1b29233b3696eb2f4c57fbcc8e39847403e56c82fa47c303aeec6a9947f6670627d04d32a4a22c667432853c473362f9f65100c9ef01fb33fc2605009d8bad5c7d9581e6f6ebe38e250060f9ef990174073c7b34a7f144bf4263f6b3c240d264c3b203abcd99ceceeed4610060c8d109085d9643646ffdc9e89c86f7e545d5dee4ca3220d4cd04cfc430ed3ced5f6cffbe1962fd76839a76cc971319dc618055cc8e3d41c1845bddfa4677a431d7a1d53e67b99c9ed3775d689dc48b29ab6a2f77c6d8f10d78686d818818a5676806d79846b729b34ede2bf06d78d9b11fad507a2e563d3f0f1b3fbeb09b0a30bcb4c7ca7ea597393bc6373faac724e97db8e9933ea42a2db8f57156557bb0c03adb5e362bfc1a56161602ccf6cbaf93bf2e6d5aa65f89eec5ac7c4351be897694483d4505ec98f31e5fcb020cf2e00036bccafb5980017a2cd0f85dbf05b7ab9193f4a6e01185f85b500a0dfb3593bf692748e1a2aa28af90fbe0a366391ee3c9b05ffa39f6718ba101047963e12f5fe6bd29cb2815d64a34bb6189240d28109da2dc80e26de2f76d8f023bbc04bb6fa3dcd0ebfefb2e7e67ac2d3d074bf63136346870512b8f08b02ff823c1d70b7daa01c0bf72139d6c85c034ab927a3e842b0eaf3ae35ff975d6b062dab4141b0d789a0b659a90cdf78fd2788d973aa3ee6134f68eec21801fb89e9a50ba8197fe8219deb5e04a4d62fc771f59e199157d108759872b30c08dd60d1ac45df96c4ccb7a24ad51fb5dc60b +ss_n = 3a4d94e21403aebc2ef05eb000eef6ffbd8227be82d4a75e7bea9e7e43b50cf8 +ct = 7ee33994d594cd2bdcc36bd599f53cec3d78ae8212cf14d303bc69191fc7ba3ce18f819cc6940625b3d71835f0fae54400be189ec69dbca00a3411638b0965dbb6ea24e632cec192ca9d5ac8c9cbe5dac62d49fd9df2c80170183624c797fcc0587454bb601e5928395f9615d305ce277a8585b11c1d4faf67138655bc7681682aa027e7af298de5c178cc9f7111fffd5508caa8009721f7fa55d5f33509301b1832cb2421668d432706625866bd14fa6a56d59fae8601009977e1530dfaa70eabaf92db4a50129790607630f3cac014da3cdfa0ccaa72632248d45c64d2e7d19bf45fea41df59ed7c66d873f98d806eca6e4925f361091b7c2d21428a386f294831b6b61b19914c5b4216c5206199ca2906cff5e6ea30404812c0f758dc76e399150f208a644cc5544dfdc2b1e848bef6c2f02b4d5a5b9cdeea7021dfaa6f5c935563c64ec7d4dcdd79666f2eb2921e7a28cdf95384c12696f0131672cadfa2463fc3bd91cd315284db03d574f2ed29cd374089cfa76b4313e8b4ecbc5eb8b7db855ee13ca7b67e3a39aad4b5f55340ed1b810f4cfde6422574390f005330bca02e28014f9f15e3ac5738026c6b9180fcedd9fabe0260aba526e73baf18d51deeb5fa27860db7d1918f3d2bb066f5515cc7bfc3a26c26e6841e737532980bc2de73cfcbaf0a253070c0abb2ef7dfa2b516de3a92f7ab041c615b7b0921cc11039f14826aa587205712fa283e27c4019b3f9f7b2c9a5aeea4950bf3a2c7730d038e310f596cfcd43266e4382219abaadde87ce8b70796f969eeb4e7029c40567fb07fa4d81fc1c89429ad7631471eae67180b547683c1a12dedbc8050e3789375dc2c3cc35b186011ec5b6c45b3f33e76a9020bb71be45e84d85e91d5bf945ed40bbe0d061228c2c5927a0082cd6b0c71e25bed0e1dfcb17fcc33306fc8e02e4f0f1b784a8ff13e06d20ec960db68cfe803acc02d1742216394ecf3de33be88b65fdef9e0a196ab932805324597610344f8f968a21c8fe1437d821df287050f1bf3505dcc3d0b6bf843ad9df4ec928064892353c0b5d9d2a221e9790f213020f883ff2363d22eba4c0b72fbd4d8cb09ef1bcf267ced925ed55c9b9bb2d517d320cd3c65abe3b4990ae71230efb782aa593db75d482203b7d6527d56f4c5193702b74860b475acc86ffa9ae0be68ed299b782adc8823568f9af938bd6843026279ba25c5c374650f34032daadc56a22956dbaa775ee4d787ff4dae2e4313a9cb7f18fe2d0c65e8e97130eaefda3464631454fc108b18b162c03634b8bfb8046b9360898f84d4592f2d6f367531537818543206fe7078cd85d46ed10a54a0f99cf9f85b3881e81184ea194c3131dc961f3e7afa3e2cba49ca64e9c92d8d73f0e8ab0a310784f687575b7cff22c86fbc5baf272b3a14936a0119991f657baff11c072a52099dd78076ed0c628b2e72d3e17541a04864679edb8501f0f7f3d4a447d1297fc80b9a5c174c918d0a9a30f326a98e6f1bb14a576697c97c4251490c7c9 +ss = 8bd59170593544d9eea93f4c975d52c6787003eab0e370f9ed97c9b1aee89570 From 0646b4e5467ca938484cb8c04d62d7dd2ae13caa Mon Sep 17 00:00:00 2001 From: Ajitomi Daisuke Date: Sun, 10 Nov 2024 19:09:15 +0900 Subject: [PATCH 2/2] ml-kem: initial commit. --- .github/workflows/ci_browser.yml | 11 +++++++ .github/workflows/ci_node.yml | 8 +++++ .github/workflows/publish.yml | 6 ++++ npm/package-lock.json | 55 ++++++++++++++++++++++++++++++++ packages/ml-kem/src/mlKem.ts | 4 +-- 5 files changed, 82 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_browser.yml b/.github/workflows/ci_browser.yml index 3d67afb5f..272dd0e30 100644 --- a/.github/workflows/ci_browser.yml +++ b/.github/workflows/ci_browser.yml @@ -45,6 +45,8 @@ jobs: cp -rf ../hybridkem-x25519-kyber768/test/runtimes/browsers/pages/* test/runtimes/browsers/pages/hybridkem-x25519-kyber768 mkdir test/runtimes/browsers/pages/hybridkem-x-wing cp -rf ../hybridkem-x-wing/test/runtimes/browsers/pages/* test/runtimes/browsers/pages/hybridkem-x-wing + mkdir test/runtimes/browsers/pages/ml-kem + cp -rf ../ml-kem/test/runtimes/browsers/pages/* test/runtimes/browsers/pages/ml-kem mkdir test/runtimes/browsers/pages/dhkem-secp256k1 cp -rf ../dhkem-secp256k1/test/runtimes/browsers/pages/* test/runtimes/browsers/pages/dhkem-secp256k1 - name: Build docs for @hpke/common @@ -57,6 +59,7 @@ jobs: deno task minify > ../hpke-js/test/runtimes/browsers/pages/chacha20poly1305/src/hpke-common.js deno task minify > ../hpke-js/test/runtimes/browsers/pages/hybridkem-x25519-kyber768/src/hpke-common.js deno task minify > ../hpke-js/test/runtimes/browsers/pages/hybridkem-x-wing/src/hpke-common.js + deno task minify > ../hpke-js/test/runtimes/browsers/pages/ml-kem/src/hpke-common.js deno task minify > ../hpke-js/test/runtimes/browsers/pages/dhkem-secp256k1/src/hpke-common.js - name: Build docs for @hpke/core working-directory: ./packages/core @@ -68,6 +71,7 @@ jobs: deno task minify > ../hpke-js/test/runtimes/browsers/pages/chacha20poly1305/src/hpke-core.js deno task minify > ../hpke-js/test/runtimes/browsers/pages/hybridkem-x25519-kyber768/src/hpke-core.js deno task minify > ../hpke-js/test/runtimes/browsers/pages/hybridkem-x-wing/src/hpke-core.js + deno task minify > ../hpke-js/test/runtimes/browsers/pages/ml-kem/src/hpke-core.js deno task minify > ../hpke-js/test/runtimes/browsers/pages/dhkem-secp256k1/src/hpke-core.js - name: Build docs for @hpke/chacha20poly1305 working-directory: ./packages/chacha20poly1305 @@ -99,6 +103,11 @@ jobs: run: | npx typedoc --name "@hpke/hybridkem-x-wing" --out ../hpke-js/test/runtimes/browsers/pages/hybridkem-x-wing/docs mod.ts deno task minify > ../hpke-js/test/runtimes/browsers/pages/hybridkem-x-wing/src/hpke-hybridkem-x-wing.js + - name: Build docs for @hpke/ml-kem + working-directory: ./packages/ml-kem + run: | + npx typedoc --name "@hpke/ml-kem" --out ../hpke-js/test/runtimes/browsers/pages/ml-kem/docs mod.ts + deno task minify > ../hpke-js/test/runtimes/browsers/pages/ml-kem/src/hpke-ml-kem.js - name: Build docs for @hpke/hpke-js working-directory: ./packages/hpke-js run: | @@ -128,6 +137,8 @@ jobs: run: npm install && npx playwright install && npx playwright test - working-directory: ./packages/hybridkem-x-wing/test/runtimes/browsers run: npm install && npx playwright install && npx playwright test + - working-directory: ./packages/ml-kem/test/runtimes/browsers + run: npm install && npx playwright install && npx playwright test - working-directory: ./packages/dhkem-secp256k1/test/runtimes/browsers run: npm install && npx playwright install && npx playwright test - working-directory: ./packages/hpke-js/test/runtimes/browsers diff --git a/.github/workflows/ci_node.yml b/.github/workflows/ci_node.yml index 11b5cc18c..8f0802bb0 100644 --- a/.github/workflows/ci_node.yml +++ b/.github/workflows/ci_node.yml @@ -97,3 +97,11 @@ jobs: - name: Publish to npm (dry) for /packages/hpke-js working-directory: ./npm/packages/hpke-js run: npm publish --dry-run + - name: Run dnt & minify for /packages/ml-kem + working-directory: ./packages/ml-kem + run: | + deno task dnt + deno task minify > ../../npm/packages/ml-kem/hpke-ml-kem.min.js + - name: Publish to npm (dry) for /packages/ml-kem + working-directory: ./npm/packages/ml-kem + run: npm publish --dry-run diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 77b9cf4aa..94ad1f027 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -93,3 +93,9 @@ jobs: run: npm publish --provenance env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + - name: Publish @hpke/ml-kem to npm + continue-on-error: true + working-directory: ./npm/packages/ml-kem + run: npm publish --provenance + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/npm/package-lock.json b/npm/package-lock.json index 94f7da76a..facc33210 100644 --- a/npm/package-lock.json +++ b/npm/package-lock.json @@ -15,6 +15,7 @@ "packages/hybridkem-x25519-kyber768", "packages/hybridkem-x-wing", "packages/hpke-js", + "packages/ml-kem", "test/**/*/runtimes/cloudflare", "samples/**/*" ] @@ -732,6 +733,10 @@ "resolved": "packages/hybridkem-x25519-kyber768", "link": true }, + "node_modules/@hpke/ml-kem": { + "resolved": "packages/ml-kem", + "link": true + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2381,6 +2386,10 @@ "resolved": "samples/hpke-js", "link": true }, + "node_modules/samples-node-hpke-ml-kem": { + "resolved": "samples/ml-kem", + "link": true + }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", @@ -2586,6 +2595,10 @@ "resolved": "test/hpke-js/runtimes/cloudflare", "link": true }, + "node_modules/test-cloudflare-hpke-ml-kem": { + "resolved": "test/ml-kem/runtimes/cloudflare", + "link": true + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -3766,6 +3779,24 @@ "node": ">=16.0.0" } }, + "packages/ml-kem": { + "name": "@hpke/ml-kem", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@hpke/common": "^1.7.1", + "mlkem": "^2.3.0" + }, + "devDependencies": { + "@deno/shim-deno": "~0.18.0", + "@hpke/core": "^1.7.1", + "@types/node": "^20.9.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "samples/chacha20poly1305": { "name": "samples-node-hpke-chacha20poly1305", "version": "1.0.0", @@ -3851,6 +3882,15 @@ "@hpke/hybridkem-x25519-kyber768": "^1.5.0" } }, + "samples/ml-kem": { + "name": "samples-node-hpke-ml-kem", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@hpke/core": "^1.7.1", + "@hpke/ml-kem": "^0.1.0" + } + }, "test/chacha20poly1305/runtimes/cloudflare": { "name": "test-cloudflare-hpke-chacha20poly1305", "version": "0.0.0", @@ -3983,6 +4023,21 @@ "vitest": "1.5.0", "wrangler": "^3.60.3" } + }, + "test/ml-kem/runtimes/cloudflare": { + "name": "test-cloudflare-hpke-ml-kem", + "version": "0.0.0", + "dependencies": { + "@hpke/core": "^1.7.1", + "@hpke/ml-kem": "^0.1.0" + }, + "devDependencies": { + "@cloudflare/vitest-pool-workers": "^0.4.5", + "@cloudflare/workers-types": "^4.20240903.0", + "typescript": "^5.5.2", + "vitest": "1.5.0", + "wrangler": "^3.60.3" + } } } } diff --git a/packages/ml-kem/src/mlKem.ts b/packages/ml-kem/src/mlKem.ts index f657cc52d..6aa6acee0 100644 --- a/packages/ml-kem/src/mlKem.ts +++ b/packages/ml-kem/src/mlKem.ts @@ -308,7 +308,7 @@ export class MlKemBase implements KemInterface { * * ```ts * import { Aes128Gcm, CipherSuite, HkdfSha256 } from "@hpke/core"; - * import { MlKem768 } from "@hpke/ml-kem"; + * import { MlKem512 } from "@hpke/ml-kem"; * const suite = new CipherSuite({ * kem: new MlKem512(), * kdf: new HkdfSha256(), @@ -376,7 +376,7 @@ export class MlKem768 extends MlKemBase { * * ```ts * import { Aes256Gcm, CipherSuite, HkdfSha512 } from "@hpke/core"; - * import { MlKem768 } from "@hpke/ml-kem"; + * import { MlKem1024 } from "@hpke/ml-kem"; * const suite = new CipherSuite({ * kem: new MlKem1024(), * kdf: new HkdfSha512(),